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 来做某事或其他事情,因此他们随机创建了一些 ActivityService 的子 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,你会得到一个异常。