android应用崩溃重启

一、创建一个捕捉崩溃信息的BugHandler 类

public class BugHandler implements Thread.UncaughtExceptionHandler {

    private static BugHandler instance;
    private Application application;
    private Thread.UncaughtExceptionHandler mDefaultHandler;
    private boolean exit = false;

    /**
     * 保证只有一个CrashHandler实例
     */
    private BugHandler(Context context) {
        application = (Application) context.getApplicationContext();
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * 获取CrashHandler实例 ,单例模式
     */
    public static BugHandler getInstance(Context context) {
        BugHandler inst = instance;
        if (inst == null) {
            synchronized (BugHandler.class) {
                inst = instance;
                if (inst == null) {
                    inst = new BugHandler(context.getApplicationContext());
                    instance = inst;
                }
            }
        }
        return inst;
    }

    /**
     * 当UncaughtException发生时会转入该函数来处理
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        try {
            StringWriter stringWriter = new StringWriter();
            PrintWriter printWriter = new PrintWriter(stringWriter);
            ex.printStackTrace(printWriter);
            printWriter.close();
            String unCaughtException = stringWriter.toString();//详细错误日志
            FileUtils.writeErrorLog(unCaughtException, FilePath.LOG_PATH + System.currentTimeMillis() + ".txt");
            Log.e("崩溃信息", unCaughtException);
            //杀死崩溃进程
            ActivityManager.getInstance().AppExit(application);
            //重新启动
//            Intent intent = new Intent(application, TeaSplashActivity.class);
//            //开启新进程
//            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//            KeepActiveService.facePay = false;
//            application.startActivity(intent);


			//通过包名直接启动
            PackageManager packageManager = application.getPackageManager();
            Intent intent =packageManager.getLaunchIntentForPackage("com.test.zy");
            application.startActivity(intent);

        } catch (Exception e) {
            e.printStackTrace();
        }
        mDefaultHandler.uncaughtException(thread, ex);
    }

重启的方式有两种:

  • 通过包名
  • 在新的进程中打开启动页

注意事项:

1、通过打开引导页启动APP需要在新的进程中打开:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2、杀死之前的进程时,一定要把所有的Activity都关闭,然后在杀死之前的进程。

    public void AppExit(Context context) {
        try {
        	//关闭所有的Activity
            finishAllActivity();
            android.app.ActivityManager activityMgr = (android.app.ActivityManager) context
                    .getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.killBackgroundProcesses(context.getPackageName());

            System.exit(0);
        } catch (Exception e) {
        }
    }

二、在Application中注册

    @Override
    public void onCreate() {
        super.onCreate();
    
        BugHandler.getInstance(this);
    }
发布了82 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/sjdjdjdjahd/article/details/102871070