打不死的小强--双进程守护
来源:互联网 发布:人像素描书 知乎 编辑:程序博客网 时间:2024/04/29 21:17
闲来无事研究一下android中的双进程守护。
首先创建两个service(LocalService,RemoteService),然后再AndroidManifest.xml文件中进行注册。
<service android:name=".service.LocalService"/><service android:name=".service.RemoteService" android:enabled="true" android:process=".myremoteservice"/>
android实现进程间的数据通信,可以创建一个aidl文件,然后定义相应的接口生成对应的.java文件。
interface IDoubleProcess { String getServiceName();}
开启服务:
//开启服务 mContext.startService(new Intent(mContext,LocalService.class)); mContext.startService(new Intent(mContext,RemoteService.class));
然后在onStart(Intent intent, int startId)方法中进行服务的交叉绑定。
/** * @author rongtao * 本地服务 */public class LocalService extends Service { private static final String TAG = "LocalService"; private MyBinder mMyBinder; private MyConn mMyConn; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return mMyBinder; } @Override public void onCreate() { super.onCreate(); mMyBinder=new MyBinder(); if(mMyConn==null){ mMyConn=new MyConn(); } } @Override public void onStart(Intent intent, int startId) {//绑定远程服务 LocalService.this.bindService(new Intent(LocalService.this,RemoteService.class), mMyConn, Context.BIND_IMPORTANT); } class MyBinder extends IDoubleProcess.Stub{ @Override public String getServiceName() throws RemoteException { return LocalService.class.getSimpleName(); } } class MyConn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "onServiceConnected: 绑定远程服务成功"); } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "onServiceDisconnected: 绑定远程服务失败"); Toast.makeText(LocalService.this,"onServiceDisconnected: 绑定远程服务失败",0).show(); //开启远程服务 LocalService.this.startService(new Intent(LocalService.this,RemoteService.class)); //绑定远程服务 LocalService.this.bindService(new Intent(LocalService.this,RemoteService.class),mMyConn, Context.BIND_IMPORTANT); } } @Override public void onDestroy() { //开启远程服务 LocalService.this.startService(new Intent(LocalService.this,RemoteService.class)); //绑定远程服务 LocalService.this.bindService(new Intent(LocalService.this,RemoteService.class),mMyConn, Context.BIND_IMPORTANT); LocalService.this.unbindService(mMyConn); super.onDestroy(); }}
/** * @author rongtao * 模拟远程服务 */public class RemoteService extends Service { private MyBinder mMyBinder; private MyConn mMyConn; private static final String TAG = "RemoteService"; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return mMyBinder; } @Override public void onCreate() { super.onCreate(); mMyBinder=new MyBinder(); if(mMyConn == null) { mMyConn=new MyConn(); } } @Override public void onStart(Intent intent, int startId) { //绑定本地服务 RemoteService.this.bindService(new Intent(RemoteService.this,LocalService.class), mMyConn, Context.BIND_IMPORTANT); } class MyBinder extends IDoubleProcess.Stub{ @Override public String getServiceName() throws RemoteException { return RemoteService.class.getSimpleName(); } } class MyConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "onServiceConnected: 绑定本地服务成功"); } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "onServiceDisconnected: 绑定本地服务失败"); Toast.makeText(RemoteService.this,"onServiceDisconnected: 绑定本地服务失败",0).show(); //开启本地服务 RemoteService.this.startService(new Intent(RemoteService.this,LocalService.class)); //绑定本地服务 RemoteService.this.bindService(new Intent(RemoteService.this,LocalService.class),mMyConn, Context.BIND_IMPORTANT); } } @Override public void onDestroy() { //开启本地服务 RemoteService.this.startService(new Intent(RemoteService.this,LocalService.class)); //绑定本地服务 RemoteService.this.bindService(new Intent(RemoteService.this,LocalService.class),mMyConn, Context.BIND_IMPORTANT); super.onDestroy(); }}
在手动强制停止服务的时候本地服务会报异常,就是服务没有解绑,但是我在onDestroy()中进行解绑后就会出现双进程断了绑定,多杀几次还是会强制停止的,所以我在onDestroy()中重新开启,重新绑定,思路有点乱了。这样避免了抛出异常,反而生命力增强了不少。
用360进行清理进程,360这个大骗子会告诉你已经清理成功,但是在后台任务中任可以看到该进程还存在着,就是没有启动起来而已,如果在这个时候进行手动强力清除的话,就可以将其彻底关闭,不然等上几十秒双进程又开始工作了,这个时候手动真的就没办法停止了,其实这个东西还能扩展的更好,可以在手机重启的时候做点小手脚他就真的
死不了了 。一般的用户对手机管家类的软件都很 信任,报清理了多少内存 都是障眼法,清理软件扫描过以后有一部分
进程会被干掉,但是级别较高的做多是睡眠状态,不到一分钟又会重启的,这也就是手机为什么越用越卡的一个原因。
我上面的代码仅供参考,bug很多,求指点。
本人喜欢研究一些乱七八道的东西 ,不过面试用不到。
同样的文章网上 已经太多,但是我写的是自己的想法而已。
博客只是用来记录我们每天的生活而已,激励自己坚持学习的一种方式。是手段不是目的。
- 打不死的小强--双进程守护
- c++ 进程守护之打不死的小强
- Hello World---打不死的小强
- 打不死的小强永不crash的Android
- WebView漏洞,为何是打不死的小强?
- 打不死的小强 杀不死的服务 开机自启动服务
- 【Qzone】打不死的小强 杀不死的服务 开机自启动服务
- 双进程守护实现杀不死的进程
- 如何创建一个不死的Service---双进程守护
- android打不死的小强——永不磨灭的Servicr
- SCI-HUB,就是打不死的小强,最新网址又出来了
- 双进程守护,驻留,杀不死服务
- Android 永生不死的进程,进程守护,进程常驻,进程保活
- 让Service变成杀不死的小强,浅谈如何实现不死的服务
- 杀不死的Java程序:Java实现Windows下双守护进程(guard_demo Windows移植版)
- 打不死的redis集群
- 打不死的redis集群
- 打不死的redis集群
- 对比一下$(function () {});和$(window).load(function(){});
- Mongodb 上传图片
- 运用pipeline来循环执行每一次操作
- android 自动打包
- mybatis 关联查询
- 打不死的小强--双进程守护
- test
- 态度
- TableCell 中label的旋转
- python正则表达式
- JAVA基础教程6:运行时类型识别(RTTI)
- 自适应网页里,字体大小如何自适应屏幕
- 自定义android折线图,实现左右滑动和快速滑动
- java 字符串缓冲池 String缓冲池