如何让Service自动重启而不被kill掉

重写 service onStartCommand 方法。
@Override   
public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;   
}
   简单介绍下这个方法,在 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 后一定能重启。
当然也还有其他解决方案,但是或多或少都会出现一些弊端或者相对来说比较麻烦。在这里举几个最常见的例子 :
1.在 onDestory 方法中重启 Service 服务,一般来说,这样做是可以的。但是如果这样 ---- 》设置 --> 下载 --> 强制停止。则不会执行 ondestory 方法,或者通过别人应用,如 360 直接 kill 掉我的应用时,也是不会调用 Service ondestory 方法的。
2.修改 AndroidManifest.xml
<manifest  xmlns:android="http://schemas.android.com/apk/res/android"
        android:sharedUserId="android.uid.system">     
<application android:icon="@drawable/icon"
android:label="@string/app_name" android:allowClearUserData="false"
          android:process="system"  android:killAfterRestore="false">
如果在加入了此部分代码,表示该程序运行在 system 进程组中, system 进程组是没有权限访问 sd 卡的,而且 service 是不会自动重启的。
3.提高 service 的优先级别 , 不管你 service 的优先级别有多高 , 用户都是可以手动杀死的 .
等等还有其他很多种方式,这里就不一一列举了。
    所以如果要使自己的 Service 能够一直运行 ,最简单的方法就是 重写onStartCommand方法就好了 . 但是千万不要做坏事 , 不要做被用户鄙视的恶意程序

你可能感兴趣的:(如何让Service自动重启而不被kill掉)