Android 监听主进程被杀

当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个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<ActivityManager.RunningAppProcessInfo> runnings = manager.getRunningAppProcesses();
        if (runnings != null) {
            for (ActivityManager.RunningAppProcessInfo info : runnings) {
                if(TextUtils.equals(info.processName,processName)){
                    return true;
                }
            }
        }
        return false;
    }

}

AndroidManifest.xml 文件中

<service android:name=".KeepLifeService"
            android:process=":keepLife"
            />

启动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,其它的自测,有效果的话可以评论留言。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值