Android 知识点总结 (七)怎么保证service不被杀死

相关文章:

Android 知识点总结(目录) https://blog.csdn.net/a136447572/article/details/81027701

Android 知识点总结 (七)怎么保证service不被杀死

https://blog.csdn.net/u013283676/article/details/52874896?locationNum=6&fps=1
Android如何让Service不被轻易杀死

Android将进程分为6个等级,它们按优先级顺序由高到低依次是 :

1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3.次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)

当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以使用startForeground 将service放到前台状态。这样在低内存时被kill的几率会低一些。

这种方法可以明显的提升服务的存活时间,但是这个方法存在一个问题就是会在通知栏显示一个通知,如果我们不想要这个通知怎么办,在网上搜索时发现可以再写一个空的前台service,而notification则使用同一个id,这样通知栏显示的就是后面的这个service的notification,将这个service销毁,notification也会随之销毁,亲测有效,下面附上链接:

Android的startForeground前台Service如何去掉通知显示

onStartCommand方法,返回START_STICKY。

1、START_STICKY

在执行onStartCommand后service进程被kill后,那将保留在開始状态,可是不保留那些传入的intent。不久后service就会再次尝试又一次创建,由于保留在開始状态,在创建 service后将保证调用onstartCommand。

假设没有传递不论什么開始命令给service。那将获取到null的intent。

2、START_NOT_STICKY

在执行onStartCommand后service进程被kill后,而且没有新的intent传递给它。Service将移出開始状态,而且直到新的明显的方法(startService)调用才又一次创建。

由于假设没有传递不论什么未决定的intent那么service是不会启动,也就是期间onstartCommand不会接收到不论什么null的intent。

3、START_REDELIVER_INTENT

在执行onStartCommand后service进程被kill后。系统将会再次启动service。并传入最后一个intent给onstartCommand。

直到调用stopSelf(int)才停止传递intent。假设在被kill后还有未处理好的intent。那被kill后服务还是会自己主动启动。因此onstartCommand不会接收到不论什么null的intent。

@Override  
public int onStartCommand(Intent intent, int flags, int startId) {  
    flags = START_STICKY;  
    return super.onStartCommand(intent, flags, startId);  
}  

【结论】 手动返回START_STICKY。亲測当service因内存不足被kill。当内存又有的时候。service又被又一次创建,比較不错。

提升service进程优先级

在AndroidManifest.xml文件里对于intent-filter能够通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,假设数字越小则优先级越低,同一时候有用于广播

<service  
    android:name="com.dbjtech.acbxt.waiqin.UploadService"  
    android:enabled="true" >  
    <intent-filter android:priority="1000" >  
        <action android:name="com.dbjtech.myservice" />  
    intent-filter>  
service>  

3、onDestroy()方法中重启服务

可以写一个服务启动自己,也可以写两个服务,互相启动,就是startService(),这里就不再赘述。

你可能感兴趣的:(andriod)