android应用异常退出快速重启

说在前面:

  一开始有这个需求的时候,上网查了很多文章,最终我选定了http://blog.sina.com.cn/s/blog_ac843e330102vek5.html作为参考,但是这个方法虽然能够保证重启成功,但是在重启的速度上并不能达到我的预期,使用AlarmManager定时任务来启动总是会有莫名其妙的延迟(1~3秒左右,最长甚至有过5秒),所以在这个基础上作了一点小小的修改


开始介绍:

简单粗暴,线上源码:

import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;

import myapplication.szm.com.myapplication.MyApplication;

/**
 * Created by:Sun ZhongMou on 2017/9/8 16:42
 **/

public class ReStartExceptionHandler implements Thread.UncaughtExceptionHandler {

    public static final String TAG = "ReStartExceptionHandler";

    private static ReStartExceptionHandler mReStartExceptionHandler;

    private Thread.UncaughtExceptionHandler mDefaultHandler;
    private MyApplication mAppContext;

    public static ReStartExceptionHandler getInstance(){
        if (mReStartExceptionHandler == null) {
            mReStartExceptionHandler = new ReStartExceptionHandler();
        }
        return mReStartExceptionHandler;
    }

    public void initReStartExceptionHandler(MyApplication application){
        //获取系统默认的UncaughtException处理器
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
        mAppContext = application;
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if(!handleException(ex) && mDefaultHandler != null){
            //如果用户没有处理则让系统默认的异常处理器来处理
            mDefaultHandler.uncaughtException(thread, ex);
        }else{
            Intent intent = mAppContext.getPackageManager().getLaunchIntentForPackage(mAppContext.getPackageName());
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            mAppContext.startActivity(intent);
            MyApplication.finishActivity();
        }
    }

    /**
     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
     *
     * @param ex
     * @return true:如果处理了该异常信息;否则返回false.
     */
    private boolean handleException(Throwable ex) {
        if (ex == null) {
            return false;
        }
        Toast.makeText(mAppContext, "很抱歉,程序异常,即将退出!", Toast.LENGTH_LONG).show();
        return true;
    }
}

自定义的异常捕捉器,通过

            Intent intent = mAppContext.getPackageManager().getLaunchIntentForPackage(mAppContext.getPackageName());
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            mAppContext.startActivity(intent);

重启应用,而非通过

            Intent intent = new Intent(application.getApplicationContext(), MainActivity.class);
                  PendingIntent restartIntent = PendingIntent.getActivity(  
                    application.getApplicationContext(), 0, intent,  
                              Intent.FLAG_ACTIVITY_NEW_TASK);                                                                      
                  //退出程序                                                           
                  AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);  
                  mgr.set(AlarmManager.RTC, System.currentTimeMillis(),  
                              restartIntent); // 立即重启应用 

另外,这里需要用到自定义的Application,代码如下:

import android.app.Activity;
import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;

import java.util.ArrayList;

import myapplication.szm.com.utils.ReStartExceptionHandler;

/**
 * Created by Administrator on 2017/8/24.
 */

public class MyApplication extends Application {

    private static ArrayList<Activity> list = new ArrayList<>();


    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
        ReStartExceptionHandler.getInstance().initReStartExceptionHandler(this);
    }

    /**
     * Activity关闭时,删除Activity列表中的Activity对象*/
    public static void removeActivity(Activity a){
        list.remove(a);
    }

    /**
     * 向Activity列表中添加Activity对象*/
    public static void addActivity(Activity a){
        list.add(a);
    }

    /**
     * 关闭Activity列表中的所有Activity*/
    public static void finishActivity(){
        for (Activity activity : list) {
            if (null != activity) {
                activity.finish();
            }
        }
        //杀死该应用进程
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

其中

ReStartExceptionHandler.getInstance().initReStartExceptionHandler(this);
用于初始化自定义异常捕捉器

另外有三个自定义方法addActivity,removeActivity以及finishActivity

这三个方法中前两者在应用的每一个Activity中都要调用,addActivity在onCreate()中调用,removeActivity在onDestory()中调用,finishActivity则是用来退出应用


PS:当然,你可以定义一个Activity的基类(如BaseActivity),在其中调用addActivity和removeActivity,然后所有Activity都继承他

使用这个异常捕捉器,你的应用在出现异常退出后会在极短时间内重新启动(0.5秒以内)







finishActivity则是用来退出应用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 应用程序中,如果发生异常导致应用程序崩溃或关闭,可以通过捕获异常并在异常处理代码中进行应用程序的操作来实现应用程序的自动。下面是一个简单的实现方式: 1. 定义一个类来捕获应用程序的未捕获异常: ```java public class RestartExceptionHandler implements Thread.UncaughtExceptionHandler { private Context mContext; public RestartExceptionHandler(Context context) { mContext = context; } @Override public void uncaughtException(Thread t, Throwable e) { // 在这里进行应用程序的操作 restartApp(); } private void restartApp() { Intent intent = new Intent(mContext, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); } } ``` 在这个类中,我们写了 `Thread.UncaughtExceptionHandler` 接口的 `uncaughtException` 方法,当应用程序发生未捕获的异常时,该方法会被调用。在这个方法中,我们调用 `restartApp` 方法来应用程序。 2. 在应用程序的 `Application` 类中设置异常处理器: ```java public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Thread.setDefaultUncaughtExceptionHandler(new RestartExceptionHandler(this)); } } ``` 在这个类中,我们通过调用 `Thread.setDefaultUncaughtExceptionHandler` 方法来设置应用程序的异常处理器为 `RestartExceptionHandler` 类。 通过上述方式设置异常处理器,当应用程序发生未捕获的异常时,会自动应用程序。需要注意的是,这种方式只适用于应用程序发生未捕获的异常时的,如果应用程序正常关闭,或者是用户主动关闭应用程序,是不会触发操作的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值