android - 创建服务实例的含义 class
android -implications of creating an instance of a Service class
我继承了一些 android 代码,我注意到有一个 class 扩展服务,但它没有在清单中声明。我觉得这令人不安。我进一步调查后发现该服务未在清单中声明,但它仍然有效!
正在发生的事情发生在开发人员正在调用以下内容的 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.
}
同样,清单中没有声明任何内容。这是另一种模式吗,安全吗?
would it cause a memory leak ?
本质上不是。 MyService
不会比任何其他 Java 对象更容易被泄露。
android components are declared in the manifest and never instantiated right ?
您有时自己实例化的唯一 Android 组件是 BroadcastReceiver
,并且仅当您使用 registerReceiver()
时。否则,框架 class 会实例化您的组件。
is this another pattern
一位来自 "developers",经验有限。通常,这种事情开始于有人需要 Context
来做某事或其他事情,因此他们随机创建了一些 Activity
或 Service
的子 class,认为他们会能够创建一个实例(例如 new MyService()
)并有一个工作 Context
。这很少起作用,因为 Context
不会以这种方式正确初始化。有时,开发人员自己只是复制他们在其他地方看到的一些代码,例如围绕 GPSService
设置的类似于您的 MyService
的大量 Stack Overflow 问题和答案。
假设这个 class 应该存在(相对于成为 activity 的一部分),我建议您:
删除extends Service
删除标记为 @Override
的无用方法,例如代码段中的 onBind()
和 onCreate()
方法
通过确保这些方法可以访问真实的 Context
对象(例如, `Activity)
i investigated further and i see that the service is not declared in
the manifest yet it still works !
它 "works" 因为 class 用作常规 java class - 它具有字段和 public 您可以调用的方法,但是这不再是 Android 服务。 Android 服务是一个旨在在后台执行长时间 运行 操作的组件,它具有生命周期,并且还引用了 Context
。
例如,当创建服务实例时: MyService service = new MyService()
你会注意到 class 的 onCreate()
方法没有被调用,如果你尝试做一些涉及使用Context
,比如显示Toast
,你会得到一个异常。
我继承了一些 android 代码,我注意到有一个 class 扩展服务,但它没有在清单中声明。我觉得这令人不安。我进一步调查后发现该服务未在清单中声明,但它仍然有效!
正在发生的事情发生在开发人员正在调用以下内容的 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.
}
同样,清单中没有声明任何内容。这是另一种模式吗,安全吗?
would it cause a memory leak ?
本质上不是。 MyService
不会比任何其他 Java 对象更容易被泄露。
android components are declared in the manifest and never instantiated right ?
您有时自己实例化的唯一 Android 组件是 BroadcastReceiver
,并且仅当您使用 registerReceiver()
时。否则,框架 class 会实例化您的组件。
is this another pattern
一位来自 "developers",经验有限。通常,这种事情开始于有人需要 Context
来做某事或其他事情,因此他们随机创建了一些 Activity
或 Service
的子 class,认为他们会能够创建一个实例(例如 new MyService()
)并有一个工作 Context
。这很少起作用,因为 Context
不会以这种方式正确初始化。有时,开发人员自己只是复制他们在其他地方看到的一些代码,例如围绕 GPSService
设置的类似于您的 MyService
的大量 Stack Overflow 问题和答案。
假设这个 class 应该存在(相对于成为 activity 的一部分),我建议您:
删除
extends Service
删除标记为
@Override
的无用方法,例如代码段中的onBind()
和onCreate()
方法通过确保这些方法可以访问真实的
Context
对象(例如, `Activity)
i investigated further and i see that the service is not declared in the manifest yet it still works !
它 "works" 因为 class 用作常规 java class - 它具有字段和 public 您可以调用的方法,但是这不再是 Android 服务。 Android 服务是一个旨在在后台执行长时间 运行 操作的组件,它具有生命周期,并且还引用了 Context
。
例如,当创建服务实例时: MyService service = new MyService()
你会注意到 class 的 onCreate()
方法没有被调用,如果你尝试做一些涉及使用Context
,比如显示Toast
,你会得到一个异常。