当onCreate()调用startService()

时间:2017-03-08 17:44:08

标签: android service android-lifecycle oncreate

我正在尝试通过一些Android开源代码来了解服务生命周期。

我正在查看一个Service实现,我将其提炼为类似以下的内容......

public class MyService extends Service {
    public MyService() { super(); }

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

       //==this seems odd to me
       //comment in AOSP says startService() is called to make
       //sure Service stays around long enough for the async call
       //to complete.
       startService(new Intent(this, myservice.class()));
       doSomeMoreInitAsync();
    }

    @Override
    public int onStartCommand(final Intent intent, final int flags, final int startId) {
        if(actionableIntent(intent,flags,startId)) {
            //do something
            //NOTE: the Intent passed to startService() in onCreate()
            //above will go around this block of code, doing nothing
            //except returning START_STICKY
        }
        return START_STICKY;
    }

    public void onDestroy() {
        //destroy stuff
    }

    @Override
    public IBinder onBind(final Intent intent) {
        return mBinder; //an instance of android.os.Binder derivative
                        // created when this service was instantiated
    }

    //other stuff
}

为什么有人想让onCreate()像上面一样调用startService(),什么都不做?代码中的评论有所启发,但它就像生命周期的假设一样,我不明白。即,期望onCreate()有效地启动自己的服务是否合理?

我知道如果一个服务已经启动,那么onCreate()只会被调用一次(除非销毁并重新启动,否则会创建一个新的服务实例,并在其上调用onCreate())。我对这个例子的第一个担心是,在调用onCreate()之前,对底层Service API实现有一种期望,即Service已经处于初始化状态(否则会有无限递归,但是没有)。 / p>

但是onCreate()应该是初始化的一部分(尽管是子类的可选部分)?

这种编码逻辑是否是确保服务被强制为无限服务的合理方式?或者我在AOSP中看到一个可能在未来可能有未定义行为的坏例子?

1 个答案:

答案 0 :(得分:1)

如果Service通过onCreate启动,则onStartCommand会调用Context.startServicestopService(),这是正确的。因此,从这个意义上说,当您返回START_STICKY时,服务将持续运行,直到调用onCreate()的显式调用。在此生命周期中,它也将被销毁并重新启动。

创建服务的另一种方法是绑定它。 As per the docs:

  

客户端还可以使用Context.bindService()来获取与服务的持久连接。如果服务尚未运行(在执行此操作时调用onCreate()),这同样会创建服务,但不会调用onStartCommand()。

因此,只需绑定它即可创建服务。但是,服务的生命周期表示如果启动客户端仍然绑定它,它将保留。这意味着,如果它是由bind命令创建的,一旦客户端解除绑定,它就会立即被销毁。

因此,如果服务在startService中启动,它将确保它自身处于启动状态,无论它是通过绑定还是通过显式调用onStartCommand创建的。由于没有可操作的意图,startSevice将直接通过。呼叫 mixin ad(name,media,payout) .box.box-primary .box-header.with-border h3.box-title=name .box-body img(src=media, style='width:130px;height:100px;') p.text-muted.text-center="$"+payout p.text-muted.text-center preview .box-footer.text-right button.btn.btn-primary(type='button',id="share",name="share",onclick='getSelf()') Share 的客户可能会有可操作的意图,在这种情况下,服务将履行其职责。