2016-12-30 67 views
0

我继承了一些android代码,我注意到有一个类扩展Service但它没有在清单中声明。我觉得这很令人不安。我进一步调查,我看到该服务没有在清单中声明,但它仍然有效!android -implications创建一个服务类的实例

什么是发生在一个活动的onResume开发者在调用以下:

@Override 
    protected void onResume() { 
     super.onResume(); 
mMyService = new MyService(); 
} 


@Override 
    protected void onStart() { 
     super.onStart(); 
    mMyService = new MyService(); 
} 

我以前从未见过这种做法。会造成内存泄漏吗? Android组件在清单中声明并从不实例化?系统会为您提供帮助。

服务本身声明如下

public class MyService extends Service { 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 


    //... a bunch of other methods that do stuff by calling from the "new" instance would be below. 

} 

同样,没有在清单中声明。这是另一种模式,它是安全的吗?

回答

2

我进一步调查,我看到的是服务未在 清单申报但它仍然有效!

它“有用”,因为该类用作常规java类 - 它具有可以调用的字段和公共方法,但这不再是Android服务。 Android服务是一个旨在在后台执行长时间运行操作的组件,它有一个生命周期,并且也是对Context的引用。

例如创建与服务实例时:MyService service = new MyService()你会发现,类onCreate()方法不叫,如果你尝试做一些事情,包括使用Context,如呈现出Toast,你会得到一个例外。

2

会导致内存泄漏吗?

非本质上。 MyService不会比任何其他Java对象更容易泄漏。

android组件在清单中声明并且从未实例化过吗?

唯一的Android组件,您有时实例自己是一个BroadcastReceiver,然后只如果您使用registerReceiver()。否则,框架类实例化你的组件。

这是另一种模式

一个从 “开发商” 经验有限。通常情况下,这种事情从某人需要某个Context开始,因此他们随机创建一个ActivityService的子类,认为他们将能够创建一个实例(例如,new MyService())并且有一个工作Context。这很少起作用,因为Context不会以这种方式正确初始化。有时候,开发人员本身只是复制他们在其他地方看到的一些代码,例如可以围绕GPSService旋转的可疑数量的堆栈溢出问题和答案设置为类似于您的MyService

假设这个类应该在所有存在(对作为活动的一部分),我建议你:

  • 删除extends Service

  • 删除被标记的是,什么也不做的方法作为@Override,如onBind()onCreate()方法,您的代码段

  • 修复了导致生成过程中出错不再延伸Service,通过确保这些方法可以访问真实的物体(例如,物体)。,在`活动)