重写
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方法就好了
.
但是千万不要做坏事
,
不要做被用户鄙视的恶意程序