通话有什么区别stopSelf()stopSelf(int)stopService(new Intent(this,MyServiceClass.class))里面onStartCommand()

例如,如果我以这种方式两次启动相同的服务:

...
Intent myIntent1 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent1.putExtra("test", 1);
Intent myIntent2 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent2.putExtra("test", 2);
startService(myIntent1);
startService(myIntent2);
...

并以这种方式实现onStartCommand:
public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(this, "onStartCommand called "+intent.getIntExtra("test", 0), Toast.LENGTH_LONG).show();
stopService(new Intent(this,MyAlarmService.class));
return START_NOT_STICKY;
}

这三种方法的行为完全相同,
仅在两次执行onStartCommand之后才调用onDestroy。

最佳答案

我希望这能帮到您:

启动的服务必须管理自己的生命周期。也就是说,除非系统必须恢复系统内存并且服务在onStartCommand()返回之后继续运行,否则系统不会停止或销毁该服务。因此,该服务必须通过调用stopSelf()来停止自身,否则另一个组件可以通过调用stopService()来使其停止。

一旦请求使用stopSelf()或stopService()停止,系统将尽快销毁该服务。

但是,如果您的服务同时处理对onStartCommand()的多个请求,那么您在处理完一个启动请求后就不应停止该服务,因为自那以后您可能已经收到了一个新的启动请求(在第一个结束时停止请求将终止第二个请求)。为避免此问题,可以使用stopSelf(int)来确保停止服务的请求始终基于最新的启动请求。

也就是说,当您调用stopSelf(int)时,您传递了停止请求所对应的开始请求的ID(传递给onStartCommand()的startId)。然后,如果该服务在您能够调用stopSelf(int)之前收到了新的启动请求,则该ID将不匹配,该服务也将不会停止。

08-17 18:47