App异常自动重启

来源:互联网 发布:excel对比2张表的数据 编辑:程序博客网 时间:2024/03/29 22:44

我们在进行开发的时候,经常会遇到异常报错的情景,然后我们的程序可能就弹出一个提示框,并且直接崩溃退出了。

而刚好前不久,我接到一个任务,要求实现当App异常的时候自动重启的一个功能,当时的想法是:“没有想法,囧~”,因为不想那么快就搜索找答案,于是问同学,同学直接说:“去搜一搜CustomActivityOnCrash”,好吧,最后还是要搜索,搜完之后发现,这并不是我想要的,异常之后它是弹出一个自定义的页面替换掉了系统弹出的提示框,而我的需求是直接重启,无需提示,但是还是可以学习一下。

1、application实现接口

public class App extends Application implements Thread.UncaughtExceptionHandler {    private static Context mContext;    @Override    public void onCreate() {        super.onCreate();        mContext = getApplicationContext();        Thread.setDefaultUncaughtExceptionHandler(this);    }    @Override    public void uncaughtException(Thread thread, Throwable ex) {        restart();    }    private void restart() {        Intent i = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());        PendingIntent pi = PendingIntent.getActivity(mContext, 0, i, PendingIntent.FLAG_ONE_SHOT);        AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, pi);        android.os.Process.killProcess(android.os.Process.myPid());    }    public static Context getContext(){        return mContext;    }}
2、在application里创建实例

public class App extends Application{    private static Context mContext;    private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() {        @Override        public void uncaughtException(Thread thread, Throwable ex) {            restart();        }    };    @Override    public void onCreate() {        super.onCreate();        mContext = getApplicationContext();        Thread.setDefaultUncaughtExceptionHandler(handler);    }    private void restart() {        Intent i = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());        PendingIntent pi = PendingIntent.getActivity(mContext, 0, i, PendingIntent.FLAG_ONE_SHOT);        AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, pi);        android.os.Process.killProcess(android.os.Process.myPid());    }    public static Context getContext(){        return mContext;    }}
其实关键就是UncaughtExceptionHandler,在实现的方法里面,其实我们还可以做一些其他工作,例如:记录异常日志。

好啦~废话不多说,就这样吧,希望对一些新人有帮助,大神勿喷,囧~

0 0