前提
首先,我们肯定要在Application里面注册一个CrashHandler,监听应用crash
public class TestApplication extends MultiDexApplication {private static TestApplication mInstance;@Overridepublic void onCreate() {super.onCreate();Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());}
然后在这个CrashHandler 想办法重启应用。有两种方法如下:
方法1.通过AlarmManager
public class CrashHandler implements Thread.UncaughtExceptionHandler {@Overridepublic void uncaughtException(Thread t, Throwable e) {//重启app/*** 这种方式 功能是可以达成* 但是有问题就是如果说你的app挂了 这时候会显示系统桌面* 然后你的app有启动起来了* 给人的感觉不太好*/Intent intent = new Intent();Context context = TestApplication.getInstance();intent.setClass(context, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_ONE_SHOT);AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);alarmManager.set(AlarmManager.RTC,System.currentTimeMillis() + 100,pendingIntent);Process.killProcess(Process.myPid());System.exit(0);}}
方法2:
使用第三方库
implementation 'com.jakewharton:process-phoenix:2.0.0'
public class CrashHandler implements Thread.UncaughtExceptionHandler {@Overridepublic void uncaughtException(Thread t, Throwable e) {ProcessPhoenix.triggerRebirth(TestApplication.getInstance());}}
这个第三方库的原理是:
当app 崩溃的时候,ProcessPhoenix.triggerRebirth(TestApplication.getInstance());
就会触发启动另外一个进程的Activity,然后把当前崩溃的进程结束掉。在新进程的Activity里面,把应用在自己的进程里面的启动起来。