当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个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,其它的自测,有效果的话可以评论留言。

更多相关文章

  1. Android跨进程通信IPC之6——Parcel--Binder对象的写入和读出
  2. Android实现高斯模糊(也叫毛玻璃效果)
  3. 细读《深入理解 Android(安卓)内核设计思想》(一)进程间通信与同步
  4. Android实践 -- 监听外置sdcard(TF卡)的插拔事件
  5. android使用AIDL跨进程通信(IPC)
  6. 聊聊Service(二)
  7. Android触摸事件分发之View篇
  8. Android(安卓)FrameWork——ActivityManager框架
  9. Android开发重修

随机推荐

  1. android事件分发机制
  2. 最简单的基于FFmpeg的移动端例子:Android(
  3. Android中SQLite数据库存储方式
  4. Android启动过程详解(3)——Zygote
  5. Android旋转屏幕时阻止activity重建
  6. Android之view重绘
  7. AsyncTask源码剖析(API 23)
  8. Android系统学习(37)---Android知识点及资
  9. android Activity 四大启动模式探究
  10. aidl