天天看点

Android如何让Service不被轻易杀死

引言

随着Android系统的更新,让服务长期运行在后台越来越困难,使我们可以免受流氓软件的困扰,真是可喜可贺。然而作为一个开发者,有时候也会面临这样一个问题,我们希望我们的服务可以尽可能长时间的在后台存活,然而我们的软件如果不是在ROM厂商的白名单中的话,一旦内存吃紧,被杀死几乎是必然的事情,接下来我们就来谈谈如何尽可能让我们的服务存活的时间长一些。

1、提升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如何去掉通知显示

2、onStartCommand方法

如果内存吃紧,服务被干掉了,有没有办法挽救一下呢,答案是确实还可以抢救一下。

StartCommond几个常量参数简介:

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。

使用方法很简单,设置一下flags就可以了:

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

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

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

4、监听广播

可以静态或动态注册一些广播接收器,比如开机广播,解锁手机的广播等,需要注意的是,有一部分广播是必须要动态注册才能接收的,比如开关屏幕,还有系统的alarm manager的定时广播等。

总结

以前的创建两个进程守护的方式在android5.0以后就不能用了,想让服务永远存活也不现实,我们只是尽量让它多存活一段时间。网上这方面的东西很多,内容也基本是一样的,这里我挑选了几个个人感觉比较有用的方法,做下记录。

如果不是在ROM厂商的白名单中的话,我感觉能做的其实也不算太多,想让服务不被杀死,很难,想要杀死一个应用,很简单,直接到设置-应用程序中,强制关闭就好,不走生命周期,package级别直接关闭,不管QQ,微信还是什么全家桶,都可以一下带走 (~ ̄▽ ̄)~。