我继承了一些安卓代码,我注意到有一个类扩展服务,但它没有在清单中声明。我觉得这令人不安。我进一步调查,我发现该服务未在清单中声明,但它仍然有效!
正在发生的事情是onResume上的活动开发人员正在调用以下内容:
@Override
protected void onResume() {
super.onResume();
mMyService = new MyService();
}
@Override
protected void onStart() {
super.onStart();
mMyService = new MyService();
}
我以前从未见过这种做法。它会导致内存泄漏吗? android组件是在manifest中声明的,从不实例化对吗?系统会为您处理。
服务本身就像这样声明
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.
}
同样,清单中没有声明任何内容。这是另一种模式,是否安全?
答案 0 :(得分:2)
会导致内存泄漏吗?
不是本质上的。 MyService
不会比任何其他Java对象更容易被泄露。
android组件是在清单中声明的,从未实例化过吗?
有时您自己实例化的唯一Android组件是BroadcastReceiver
,然后才会使用registerReceiver()
。否则,框架类将实例化您的组件。
是另一种模式
一位经验有限的“开发人员”。通常,这类事情始于需要Context
某事或某事的人,因此他们随机创建Activity
或Service
的某些子类,认为他们可以创建一个实例(例如,new MyService()
)并且具有工作Context
。这很少有效,因为Context
不会以这种方式正确初始化。有时,开发人员自己只是复制他们在其他地方看到的一些代码,例如Stack Overflow问题的荒谬数量以及围绕GPSService
设置类似于MyService
的答案。
假设这个类应该存在(而不是活动的一部分),我建议你:
删除extends Service
删除标记为@Override
的无操作方法,例如代码段中的onBind()
和onCreate()
方法
通过确保这些方法可以访问真正的MyService
对象(例如,“活动”),修复导致Service
不再扩展Context
的任何构建错误
答案 1 :(得分:2)
我进一步调查,我发现该服务未被声明 显而易见它仍然有效!
它“有效”,因为该类用作常规java类 - 它具有可以调用的字段和公共方法,但这不再是Android服务。 Android服务是一个组件,用于在后台执行长时间运行的操作,它具有生命周期,还有对Context
的引用。
例如,在使用:MyService service = new MyService()
创建服务实例时,您会注意到该类的onCreate()
方法未被调用,并且如果您尝试执行涉及使用{{1如显示Context
,您将获得例外。