Android(安卓)监听主进程被杀
16lz
2021-01-26
当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个service里监听。
效果如下:
可以看到,在多任务窗口中,左滑结束进程和清除所有进程后,都会自己再打开应用,代码如下:
public class KeepLifeService extends Service { private static final String TAG="KeepLifeService"; private String mPackName; private ActivityManager mActivityManager; @Override public void onCreate() { super.onCreate(); mActivityManager =(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); String process=getProcessName(); mPackName =getPackageName(); boolean isRun=isRunningProcess(mActivityManager,mPackName); Log.i(TAG, String.format("onCreate: %s %s pid=%d uid=%d isRun=%s", mPackName,process, Process.myPid(), Process.myUid(),isRun)); if(!isRun){ Intent intent = getPackageManager().getLaunchIntentForPackage(mPackName); if(intent!=null){ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } /** * 获取当前进程名称 * * @return */ public static String getProcessName() { try { File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline"); BufferedReader mBufferedReader = new BufferedReader(new FileReader(file)); String processName = mBufferedReader.readLine().trim(); mBufferedReader.close(); return processName; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 进程是否存活 * @return */ public static boolean isRunningProcess(ActivityManager manager,String processName) { if(manager==null) return false; List runnings = manager.getRunningAppProcesses(); if (runnings != null) { for (ActivityManager.RunningAppProcessInfo info : runnings) { if(TextUtils.equals(info.processName,processName)){ return true; } } } return false; }}
AndroidManifest.xml 文件中
启动service
startService(new Intent(this,KeepLifeService.class));
在主进程中启动service ,然后杀死主进程,这时service会自动重新启动,onCreate 会重走,pid会不一样,所以要监听主进程被杀,只需要在service 中的oncreate 判断主进程是否存活,不存活则为被杀,这时你可以重新启动应用或者别的。(这里为了演示,选择了重新启动应用,也算是保活手段,不过这种行为不好,别当流氓软件)
关键点:
其中启动service只能用startService ,不能用bindService,
mainifest 中service 要放单独进程,或者子进程。
如果想要保活的话?
这个只适用于 在多任务 页杀死进程,如果用
am force-stop packageName
杀进程的话,是不会重启service 的。
然后是应用自己崩溃,异常,这个可以用
Thread.setDefaultUncaughtExceptionHandler
监听,然后重启应用,但是如果是 so 包,也就是c 层崩溃,是监听不到异常的,这时可以用上面那个service 开线程,每30s 检查一次主进程是否存活,然后再启动之类。
本次测试Android 版本: 5.1~7.1.1,其它的自测,有效果的话可以评论留言。
更多相关文章
- Android跨进程通信IPC之6——Parcel--Binder对象的写入和读出
- Android实现高斯模糊(也叫毛玻璃效果)
- 细读《深入理解 Android(安卓)内核设计思想》(一)进程间通信与同步
- Android实践 -- 监听外置sdcard(TF卡)的插拔事件
- android使用AIDL跨进程通信(IPC)
- 聊聊Service(二)
- Android触摸事件分发之View篇
- Android(安卓)FrameWork——ActivityManager框架
- Android开发重修