Android中Service类onStartCommand的返回值问题

Android中Service类onStartCommand的返回值问题
Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。
从Android官方文档中,我们知道onStartCommand有4种返回值:

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后一定能重启。


可能导致异常如下
java.lang.RuntimeException: Unable to start service   serviceName with null: java.lang.NullPointerException
 at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3221)
 at android.app.ActivityThread.access$2100(ActivityThread.java:156)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1461)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:157)
 at android.app.ActivityThread.main(ActivityThread.java:5872)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:515)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1069)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)
 at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
 at com.ag.rhg.download.DownloadPassService.onStart(Unknown Source)
 at android.app.Service.onStartCommand(Service.java:450)
 at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3187)
 ... 10 more


解决办法:在Service onStart方法中做判断
if (null != intent) {
    。。。。。。。
}

你可能感兴趣的:(Android中Service类onStartCommand的返回值问题)