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,微信还是什么全家桶,都可以一下带走 (~ ̄▽ ̄)~。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值