android应用异常退出快速重启
来源:互联网 发布:linux 设置alias 编辑:程序博客网 时间:2024/06/04 19:57
说在前面:
一开始有这个需求的时候,上网查了很多文章,最终我选定了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);
另外,这里需要用到自定义的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则是用来退出应用
阅读全文
0 0
- android应用异常退出快速重启
- android 应用 捕获异常 重启应用
- Android 异常后如何重启应用
- android全局捕获异常,重启应用
- vs2005编译异常退出重启解决办法
- 优雅的退出应用和处理崩溃异常自动重启
- android 应用异常可以引起android系统崩溃重启
- android 崩溃 重启 捕获异常 并重启应用
- android应用异常退出,抓取异常信息写入文件里
- 让程序异常退出后自动重启
- 让程序异常退出后自动重启
- linux下实现进程异常退出后自动重启
- 应用异常完全退出应用
- Android 应用按返回键异常退出的问题
- android 重启应用
- android重启应用
- Android应用重启
- Android快速调试重启
- 1006. 换个格式输出整数 (15)
- ARM linux 时区开发
- Python学习笔记6_class
- css复习——文字与文本 day3
- CentOS 7配置aliyun的yum源
- android应用异常退出快速重启
- Map的常用实现类
- C++ 两个包含类互相调用彼此的类成员变量和方法
- Installing FLTK with Visual Studio
- 最小白_mysql的安装
- 安装vue开发调试神器vue-devtools
- 英语月总结
- Universal-Image-Loader图片加载框架
- moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)