App意外死亡后,拉起本应用。

我自己试的可以。中心思想就是打开软件的时候,创建一个指定文件,然后这个文件里只有一个数字来表示需不需要拉起。
一个service:

public class RunService extends Service {
    Timer timer;
    private int countdown = 10;
    public static final String path = Environment.getExternalStorageDirectory() + "/seestech/cfg.json";

    public RunService() {
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        init();
    }

    private void init() {
        setTimer();
    }

    private void setTimer() {
        if (timer != null) {
            timer.cancel();
        }
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                countdown--;
                if (countdown == 0) {
                    if (getNum() == 1){
                        timer.cancel();
                        killAppProcess();
                    }else {
                        handler.sendEmptyMessage(3000);
                        countdown = 10;
                    }
                }
            }
        }, 0, 1000);
    }

    private int getNum(){
        int num = 0;
        String data = FileUtils.readFileToString(new File(path));
        if (!TextUtils.isEmpty(data)) {
            try {
                JSONObject object = new JSONObject(data);
                num = object.getInt("num");
            } catch (JSONException e) {
                e.printStackTrace();
                LogHandler.writeFile("RunService_getNum","失败+异常:" + e.getMessage());
            }
        }
        Log.e("RunService_getNum()","读取num:" + num);
        LogHandler.writeFile("RunService_getNum()","读取num:" + num);
        return num;
    }


    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 3000) {
                // 判断是否在前台,如果不在的话会重启
                resumeApp();
            }
        }
    };

    private void resumeApp() {
        boolean isRun = isAppOnForeground();
        if (!isRun) {
            JumpHelper.enterNewActivityByService(getBaseContext(), WelcomeActivity.class);
        }
        Log.e("RunService","应用是否在前台:" + isRun);
        LogHandler.writeFile("RunService","应用是否在前台:" + isRun);
    }


    //在进程中去寻找当前APP的信息,判断是否在前台运行
    public boolean isAppOnForeground() {
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(
                Context.ACTIVITY_SERVICE);
        String packageName = getApplicationContext().getPackageName();
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
        if (appProcesses == null)
            return false;
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.processName.equals(packageName)
                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return true;
            }
        }
        return false;
    }

    public void killAppProcess()
    {
        //注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程
        ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> mList = mActivityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : mList)
        {
            if (runningAppProcessInfo.pid != android.os.Process.myPid())
            {
                android.os.Process.killProcess(runningAppProcessInfo.pid);
            }
        }
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(0);
    }

}

主要就是用他来检测的,开启服务之后,每10秒检测一次,若本应用不在台前,且指定文件读取出来为0,则软件为意外死亡,需要拉起,若为1,则为指定退出,不需要拉起来。

注意要在AndroidManifest中注册此service。
需要在开启服务之前,先创建文件并写入数据。:

FileUtils.modifyFile(pathPull,port0,false);
    /**
     * 修改文件内容(覆盖或者添加)
     *
     * @param path    文件地址
     * @param content 覆盖内容
     * @param append  指定了写入的方式,是覆盖写还是追加写(true=追加)(false=覆盖)
     */
    public static void modifyFile(String path, String content, boolean append) {
        try {
            FileWriter fileWriter = new FileWriter(path, append);
            BufferedWriter writer = new BufferedWriter(fileWriter);
            writer.append(content);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

用Intent来开启服务。

private Intent intentRunSys;

intentRunSys = new Intent(this,RunService.class);
startService(intentRunSys);

我是在主Activity的onCreate方法里写的。
在想要退出时,写一个:

FileUtils.modifyFile(pathPull,port1,false);

那么当应用不在前台时,读取到的就会是1,那么就不会拉起程序了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值