我正在尝试通过一些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中看到一个可能在未来可能有未定义行为的坏例子?
答案 0 :(得分:1)
如果Service
通过onCreate
启动,则onStartCommand
会调用Context.startService
和stopService()
,这是正确的。因此,从这个意义上说,当您返回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
的客户可能会有可操作的意图,在这种情况下,服务将履行其职责。