stopSelf()vs stopSelf(int)vs stopService(Intent)

时间:2014-03-18 16:26:22

标签: android service

打电话有什么不同 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。

7 个答案:

答案 0 :(得分:73)

我希望这会对你有所帮助:

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

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

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

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

答案 1 :(得分:29)

这是一个简单的描述:

  • stopSelf()用于始终停止当前服务。

  • stopSelf(int startId)也用于停止当前服务,但,如果 startId 是上次启动服务时指定的ID。

  • stopService(Intent service)用于停止服务,但是从服务外部停止。

This is the reference page.

答案 2 :(得分:4)

所有3种方法的核心功能都是相同的,这就是它们具有相似名称的原因。它们之间存在很小的差异。

  • public final void stopSelf()

Class :这属于android.app.Service class

调用:此方法仅用于从内部调用服务。

行为:服务将停止。 onDestroy()州称为。

  • public final void stopSelf(int startId)

Class :这属于android.app.Service class

调用:此方法仅用于从内部调用服务。

行为:旧版本的一个方法是stopSelfResult(int startId)。此方法是该方法的较新版本。如果最近启动的时间是startId,则服务将仅停止 onDestroy()州称为。

可能您会发现此方法仅在您启动2-3个相同服务实例的情况下才有用,但您希望按照收到的与您一起存储的startId列表的顺序停止它们。使用这种方法时需要非常小心。

  • public abstract boolean stopService(意图服务)

Class :这属于android.content.Context class

调用:此方法旨在从外部服务中调用,但允许您从内部调用。

行为:如果服务未运行,则不会发生任何事情。否则它会停止。请注意,不计算对startService()的调用 - 无论启动多少次,都会停止服务。 onDestroy()州称为。

答案 3 :(得分:3)

从启动服务的类调用stopService()。在正在运行的服务类中调用stopSelf()来停止服务

答案 4 :(得分:1)

  

stopSelf()=停止服务(如果之前已启动)。

     

stopSelf(int startId)=没有的旧版本的stopSelfResult(int)   返回结果。

     

stopSelfResult(int startId)=如果是最近的时间,请停止服务   它的启动是startId.Its返回布尔结果。

答案 5 :(得分:0)

stopSelf()有两种风格。一个startId参数,表示您已完成一个特定命令的工作,因此如果没有其他未完成的命令,服务应该机会停止。

答案 6 :(得分:0)

stopSelf(int) - 用于根据onStartCommand(Intent i,int f,int startid)的int startid停止最近的启动服务。

stopSelf() - 当任务完成时由服务本身调用。

stopService(Intent) - 从活动中显式调用以停止服务。