Android中Service类中onStartCommand返回值介绍

来源:互联网 发布:为什么开不了淘宝店铺 编辑:程序博客网 时间:2024/06/05 02:47

  • START_STICKY
  • START_NOT_STICKY
  • START_REDELIVER_INTENT
  • START_STICKY_COMPATIBILITY
  • 系统默认策略
    • Service的onStartCommand策略
    • IntentService的onStartCommand策略

Android中调用startService(Intent intent)会调用该Service对象的onStartCommand(Intent intent, int flags, int startId)方法,然后在onStartCommand方法中做一些处理。这个函数有一个int的返回值,根据官方文档说明,改返回值有四种情况,下下面就对这四种返回值做一一介绍

START_STICKY

如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

START_NOT_STICKY

“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

START_REDELIVER_INTENT

重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

START_STICKY_COMPATIBILITY

START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

系统默认策略

Service的onStartCommand策略

public int onStartCommand(Intent intent, int flags, int startId) {      onStart(intent, startId);      return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;  }

可见,默认的策略是START_STICKY,支持服务意外终止重新创建的。

IntentService的onStartCommand策略

IntentService 不应该重新实现 onStartCommand ,而是去复写 onHandleIntent .

@Override  public int onStartCommand(Intent intent, int flags, int startId) {      onStart(intent, startId);      return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;  }  public void setIntentRedelivery(boolean enabled) {         mRedelivery = enabled;   }

可见, IntentService 默认只支持两种返回值 START_REDELIVER_INTENT 或者 START_NOT_STICKY ,并且由 setIntentRedelivery 方法决定,默认是 START_NOT_STICKY ,不重新创建。

2 0
原创粉丝点击