android -implications创建Service类的实例

时间:2016-12-30 17:18:09

标签: android android-service android-service-binding

我继承了一些安卓代码,我注意到有一个类扩展服务,但它没有在清单中声明。我觉得这令人不安。我进一步调查,我发现该服务未在清单中声明,但它仍然有效!

正在发生的事情是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.

}

同样,清单中没有声明任何内容。这是另一种模式,是否安全?

2 个答案:

答案 0 :(得分:2)

  

会导致内存泄漏吗?

不是本质上的。 MyService不会比任何其他Java对象更容易被泄露。

  

android组件是在清单中声明的​​,从未实例化过吗?

有时您自己实例化的唯一Android组件是BroadcastReceiver,然后才会使用registerReceiver()。否则,框架类将实例化您的组件。

  

是另一种模式

一位经验有限的“开发人员”。通常,这类事情始于需要Context某事或某事的人,因此他们随机创建ActivityService的某些子类,认为他们可以创建一个实例(例如,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,您将获得例外。