常驻进程
Android常驻进程,就是要让进程在内存中永远存在,让进程保活,不被杀死。可能这时都会喷,这不是流氓软件吗?刚接触android的时候,我也是认为这是很流氓的做法,可是慢慢发现很多场景(应用),要为用户服务,就必须用到常驻进程,就好像微信,QQ,360安全手机卫士这些现在比较火,比较常用的软件来说,他们都是实现了常驻进程的。所以说,有时候常驻进程在开发中是必须的,比如锁屏应用,就必须在进程中接收锁屏的广播,因此要保证进程常驻,像QQ,微信那些IM类应用,也需要长期在后台维护一个长链接,因此进程常驻又是必须的!
因为最近开发的应用需要用到常驻进程,因此一开始的猜想在java层是不能解决的,必须得在native解决,可是现在对linux和android系统理解还不够深入,而且ndk开发才刚入门,因此在网上搜了一大堆资料,总得来说,给出的解决方法不就外乎下面的几种:
1、将Service设置为前台进程本质是修改了Service所在进程的进程优先级。有了前台进程的优先级,在android系统清理内存的时候,他被杀死的优先级仅高于前台的activity,也就是正在和用户交互的页面,而且使用ddms杀进程他也可以自己启动起来。首先ddms杀进程和在系统设置的正在运行中杀进程本身就不具威胁,在系统设置的所有应用中选择强行停止,仍然可以强停掉,360,cm等软杀更是能轻而易举杀死他。而且他还有一个缺点,在api17以上,设置了一个前台服务,他会以一个无法消除的notification的样式出现在用户的手机状态栏里,大大降低了用户体验。可是前台服务适合做一些音乐播放器,天气类的应用!
2、在service的onStartCommand方法里返回 STATR_STICK测试的service是一个最基本的service,在相应的生命周期的触发函数上做了输出。在普通的服务使用还是可以的,做常驻进程的话就不行了,force close和一些清理软件很容易就清理掉!
3、添加Manifest文件属性值为android:persistent=“true”最主要的是让程序成为系统程序,这个可以做到吗?如果你技术过硬是可以尝试下的!首先弄个自动root的apk,加壳放到程序中,然后程序运行的时候,自动运行自动root的apk,获取root权限,然后在native层中,使用命令的方式把程序移到system/app目录下,成为系统程序!
4、覆写Service的onDestroy方法在设置里面的正在运行,注意是正在运行里面,点击关闭,会走onDestroy回调方法,你在这里可以把自己启动起来。注意是正常关闭的时候是会自己启动起来,可是使用第三方的清理软件360,root过的360,force close这些来搞,压根不会走到onDestory的方法,例子在之前service的博客中也有!可以去试试的!
5、添加广播监听android.intent.action.USER_PRESENT事件以及其他一些可以允许的事件android.net.wifi.WIFI_STATE_CHANGED
6、服务互相绑定这个是android里面一个特性,跨进程bind一个service之后,如果被bind的service挂掉,bind他的service会把他拉起来!可以考虑使用远程服务来实现,可是还是不能保活进程,可以被杀掉!
7、设置闹钟,定时唤醒Demo的下载地址:http://download.csdn.net/detail/two_water/9595724
8、账户同步,定时唤醒
这个是找了很久才发现有这个东西的,android系统里有一个账户系统,设置一个自己的账户,android会定期唤醒账户更新服务,我们可以自己设定同步的事件间隔。且发起更新的是系统,不会受到任何限制。
可是它还是有局限性:
1. 用户会在系统设置的账户列表里面看到一个不认识的账户;
2. 同步的事件间隔是有限制的,最短1分钟,见源码,如果小雨60秒,置为60秒。而且各种国产机怎么改的源码我们未可知,是不是都能用仍然未可知;
3. 很致命,某些手机比如note3需要手动设置账户,你如何骗你的用户给你手动设置账户完了之后不卸载你;
4. 也很致命,必须联网!google提供这个组件是让你同步账户信息,不联网你同步个鬼,我们要保活,可以不联网不做事,但是不能不联网就死
9、native层保活(守护进程)
至于native层保活,一开始是在github上找个这个开源项目的:https://github.com/Coolerfall/Android-AppDaemon
Demo下载地址:http://download.csdn.net/detail/two_water/9595967
可是这个只能在5.0以下的使用,更重要的一点是他没有进程守护,然后再寻找资源,找到了下面的这个大神的项目:
https://github.com/Marswin/MarsDaemon
Demo下载地址:http://download.csdn.net/detail/two_water/9595966
这个项目的原理和他的想法都在他的博客有详细的介绍,我这个菜鸟就不作分析了:
Android 进程常驻(0)----MarsDaemon使用说明:http://blog.csdn.net/marswin89/article/details/50917098
Android 进程常驻(1)----开篇:http://blog.csdn.net/marswin89/article/details/48015453
Android 进程常驻(2)----细数利用android系统机制的保活手段:http://blog.csdn.net/marswin89/article/details/50890708
Android 进程常驻(3)----native保活5.0以下方案推演过程以及代码详述:http://blog.csdn.net/marswin89/article/details/50899838
Android 进程常驻(4)----native保活5.0以上方案推演过程以及代码详述:http://blog.csdn.net/marswin89/article/details/50916631
Android 进程常驻(5)----开机广播的简单守护以及总结:http://blog.csdn.net/marswin89/article/details/50917409
最后感谢大神,让我学习了!不过建议大家不必要使用常驻进程的软件还是不要使用!影响用户的体验,用来研究玩玩还是可以的!
pdf:http://download.csdn.net/detail/two_water/9596051