android应用异常退出快速重启
2017-09-13 16:22
225 查看
说在前面:
一开始有这个需求的时候,上网查了很多文章,最终我选定了http://blog.sina.com.cn/s/blog_ac843e330102vek5.html作为参考,但是这个方法虽然能够保证重启成功,但是在重启的速度上并不能达到我的预期,使用AlarmManager定时任务来启动总是会有莫名其妙的延迟(1~3秒左右,最长甚至有过5秒),所以在这个基础上作了一点小小的修改
开始介绍:
简单粗暴,线上源码:
自定义的异常捕捉器,通过
重启应用,而非通过
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,代码如下:
其中
用于初始化自定义异常捕捉器
另外有三个自定义方法addActivity,removeActivity以及finishActivity
这三个方法中前两者在应用的每一个Activity中都要调用,addActivity在onCreate()中调用,removeActivity在onDestory()中调用,finishActivity则是用来退出应用
PS:当然,你可以定义一个Activity的基类(如BaseActivity),在其中调用addActivity和removeActivity,然后所有Activity都继承他
使用这个异常捕捉器,你的应用在出现异常退出后会在极短时间内重新启动(0.5秒以内)
finishActivity则是用来退出应用
一开始有这个需求的时候,上网查了很多文章,最终我选定了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则是用来退出应用
相关文章推荐
- Android应用崩溃后异常捕获并重启并写入日志
- Android应用崩溃后异常捕获并重启
- Android---自定义异常退出并重启app的使用
- Android 异常后如何重启应用
- android自定义异常,并重启应用
- Android应用崩溃后异常捕获并重启
- Android 应用按返回键异常退出的问题
- Android应用下载安装Home键退出,再进 应用会重启问题解决
- Android 捕获异常并在应用崩溃后重启应用
- android 应用异常可以引起android系统崩溃重启
- Android填坑之旅(第十六篇)Android优雅解决App应用异常退出并收集日志供开发者调试(总有你想要的,持续收录中......)
- Android应用稳定性优化--快速点击产生异常的解决思路
- android 应用 捕获异常 重启应用
- Android处理应用崩溃异常并重启应用
- android应用异常退出,抓取异常信息写入文件里
- Android全局异常捕获,不退出应用,让应用正常运行下去!
- 【知识必备】如何优雅的退出应用和处理崩溃异常并重启
- 【知识必备】如何优雅的退出应用和处理崩溃异常并重启
- Android应用崩溃后异常捕获并重启
- Android应用崩溃后异常捕获并重启