打电话有什么不同
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。
答案 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)
用于停止服务,但是从服务外部停止。
答案 2 :(得分:4)
所有3种方法的核心功能都是相同的,这就是它们具有相似名称的原因。它们之间存在很小的差异。
Class :这属于android.app.Service
class
从调用:此方法仅用于从内部调用服务。
行为:服务将停止。 onDestroy()
州称为。
Class :这属于android.app.Service
class
从调用:此方法仅用于从内部调用服务。
行为:旧版本的一个方法是stopSelfResult(int startId)。此方法是该方法的较新版本。如果最近启动的时间是startId,则服务将仅停止 。 onDestroy()
州称为。
可能您会发现此方法仅在您启动2-3个相同服务实例的情况下才有用,但您希望按照收到的与您一起存储的startId列表的顺序停止它们。使用这种方法时需要非常小心。
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) - 从活动中显式调用以停止服务。