老话说的好:躲得了初一,躲不过高三 ! 大多数的Android开发者遇到的一个问题—如何保证Service常驻内存! 最近我终于也在项目中务必幸运的遇到了
所谓Service常驻内存,意思就是想让自己写的Service服务在手机开机之后就永远处于运行状态。 举个Example先, 例如大家最熟悉的微信和QQ,每当手机开机之后,微信和QQ都是自动就在后台运行,实时的接收聊天信息,并且QQ和微信几乎是永远处于运行状态(即使是用户通过各种暴力方式将Service服务关掉页也没用)
对于进程的优先级是怎么排的 可以参考一下几个优先级排序的规则 :
在Android中一共有5种进程的分类,按照优先级从高到低的顺序分别是:
前台进程
可视进程
服务进程
后台进程
空进程
首先我们需要了解一点,以上三种方式其实在最终framework层都是调用PM的killProcess方法将某进程给直接杀死,但是我们在做上层App开发时(源码下的二次开发另当别论),又无法修改framework层的相关代码,所以我们不可能从根本上避开进程被杀死这一行为。
因此我的思路就是如果提供某一种机制,这种机制可以在规定时间内,频繁的去启动某Service, 而如果我们去启动一个已经被创建的Service时,它的onCreate方法是不会再被调用的。
具体实现方式有如下几种:
1 修改Service的onStartCommand方法中的返回值。onStartCommand方法有三种返回值,依次是
START_NOT_STICK:
START_STICKY
START_REDELIVER_INTENT
通过修改onStartCommand方法的返回值这一方法足以解决上面我们提到Service被关闭的第一种情况。 但是对于用户主动强制关闭和三方管理器还是没有效果的
2 通过监听某些系统经常发出的广播,当接收到广播之后我们可以主动的去尝试启动Service,如果此Service已经被创建,则不会再走onCreate方法,否则这个Service就会被再次启动.
举几个常用的系统广播的例子:
这种方法可以解决Service被关闭的所有情景。 但是缺点是不是很稳定,毕竟要接收到某些系统广播之后才能执行启动Service的操作,因此有一定的延时,甚至没有成功的再次启动Service (对于希望Service被再次启动的渴望非常强烈的童鞋,不建议使用这种方法)
3 通过调用AlarmManager的setRepeating方法,我们可以每隔一段时间就去启动Service一次,代码如下所示:
Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
// 每分钟启动一次,这个时间值视具体情况而定
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 60*1000, pintent);
这种方式也可以解决Service被关闭的所有情景。并且可以在一分钟内不断的去尝试启动Service,这个时间值是可以自己调的。
原文:http://blog.csdn.net/zxm317122667/article/details/55822186