最近应项目需求,需要实现在APP遇到内部bug闪退时,禁止自启动回到闪退界面

经测试,在 Android 的 API 21 ( Android 5.0 ) 以下,Crash 会直接退出应用,但是在 API 21 ( Android 5.0 ) 以上,系统会遵循以下原则进行重启:

  • 包含 Service,如果应用 Crash 的时候,运行着Service,那么系统会重新启动 Service。
  • 不包含 Service,只有一个 Activity,那么系统不会重新启动该 Activity。
  • 不包含 Service,但当前堆栈中存在两个 Activity:Act1 -> Act2,如果 Act2 发生了 Crash ,那么系统会重启 Act1。
  • 不包含 Service,但是当前堆栈中存在三个 Activity:Act1 -> Act2 -> Act3,如果 Act3 崩溃,那么系统会重启 Act2,并且 Act1 依然存在,即可以从重启的 Act2 回到 Act1。

看了上述解释,我们终于知道应用在什么种情况下才会重启。

面对这样的问题,我们提供两种解决思路,一是允许应用自动重启,并在重启时恢复应用在崩溃前的运行状态。二是禁止应用自动重启,而是让用户在应用发生崩溃后自己手动重启应用。

具体解决办法如下:

1.首选创建一个CrashHanler类

package com.pdl.mallpos.util;import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;import com.pdl.mallpos.PDLApplication;public class CrashHandler implements Thread.UncaughtExceptionHandler {public static CrashHandler mAppCrashHandler;private Thread.UncaughtExceptionHandler mDefaultHandler;private PDLApplication mAppContext;public void initCrashHandler(PDLApplication application) {this.mAppContext = application;// 获取系统默认的UncaughtException处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();Thread.setDefaultUncaughtExceptionHandler(this);}public static CrashHandler getInstance() {if (mAppCrashHandler == null) {mAppCrashHandler = new CrashHandler();}return mAppCrashHandler;}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {// 如果用户没有处理则让系统默认的异常处理器来处理mDefaultHandler.uncaughtException(thread, ex);} else {android.os.Process.killProcess(android.os.Process.myPid());System.exit(0);System.gc();}}/*** 错误处理,收集错误信息 发送错误报告等操作均在此完成.* @param ex* @return true:如果处理了该异常信息;否则返回false.*/private boolean handleException(Throwable ex) {if (ex == null) {return false;}// 自定义处理错误信息return true;}
}

2.在应用Application的onCreate()接口中调用,具体调用如下:

CrashHandler.getInstance().initCrashHandler(this);

此时可能查阅文档的小伙伴发现很多文档写到这里就结束了,但是执行后发现闪退后仍然会重启到闪退页面,别急,我们需要知道这是什么原因造成的。

退出栈内所有的Acitvity

如果应用在发生崩溃时,回退栈内依然存在没有退出的Activity,即使调用了System.exit(0)方法,应用依然会自动重启。因此我们就需要在应用退出之前,先清除栈内所有的Activity。

3.在Application中创建一个activityList,用来存储所有栈内的Activity,很简单,方法如下

public static List<Activity> activityList = new ArrayList<Activity>();

4.创建一个BaseActivity,让所有的Activity都继承BaseActivity,并在Activity中如下接口执行添加和删除

 @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);if(!PDLApplication.activityList.contains(this)){PDLApplication.activityList.add(this);}}@Overrideprotected void onDestroy() {super.onDestroy();if(PDLApplication.activityList.contains(this)){PDLApplication.activityList.remove(this);}}

5.在刚才的CrashHanler中执行如果Application中的activityList不为空,则手动关闭所有Activity

package com.pdl.mallpos.util;import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;import com.pdl.mallpos.PDLApplication;public class CrashHandler implements Thread.UncaughtExceptionHandler {public static CrashHandler mAppCrashHandler;private Thread.UncaughtExceptionHandler mDefaultHandler;private PDLApplication mAppContext;public void initCrashHandler(PDLApplication application) {this.mAppContext = application;// 获取系统默认的UncaughtException处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();Thread.setDefaultUncaughtExceptionHandler(this);}public static CrashHandler getInstance() {if (mAppCrashHandler == null) {mAppCrashHandler = new CrashHandler();}return mAppCrashHandler;}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {// 如果用户没有处理则让系统默认的异常处理器来处理mDefaultHandler.uncaughtException(thread, ex);} else {if(PDLApplication.activityList.size()>0){for(int i=0;i<PDLApplication.activityList.size();i++){Activity activity = PDLApplication.activityList.get(i);if(activity!=null){activity.finish();}}}android.os.Process.killProcess(android.os.Process.myPid());System.exit(0);System.gc();}}/*** 错误处理,收集错误信息 发送错误报告等操作均在此完成.* @param ex* @return true:如果处理了该异常信息;否则返回false.*/private boolean handleException(Throwable ex) {if (ex == null) {return false;}// 自定义处理错误信息return true;}
}

好了大功告成,接下来小伙伴们试一下吧。

android APP闪退后如何屏蔽自启动相关推荐

  1. app闪退后重启_Android app 如何实现崩溃后自动重启

    Android app  如何实现崩溃后自动重启 由于有很多场景需要让自己的app一直保持运行状态,比如客户的launcher,或者定制app. 都希望在自己的app崩溃之后还可以自重启. 对于这样子 ...

  2. app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP

    在安卓应用中,如果是偶发性bug导致APP崩溃,APP可能会直接闪退或者白屏,用户体验不太好,我们可以在application中捕获到全局异常,然后再进行处理. 首先创建一个MainApplicati ...

  3. android app 闪退的原因

    1. 检查网络是否可用 2. 检查APP中访问网络的地方,组件中的ImageView是否可以正常的下载并显示到app 页面上. 2.检查APP的sdk和手机的系统是否兼容.

  4. android app闪退原因总结分析

    存储不够 缓存过多,剩余空间不够(针对内存): 后台任务太多,导致运存不够(针对运存) App和SDK版本不兼容 sdk版本明显低于app,高版本app调用低版本SDK没有的API: 不同版本间API ...

  5. Android番外篇 华为手机APP闪退重启清空Log日志问题解决

    问题一:没有Log.v和Log.d日志 解决方案: 进入拨号界面输入:##2846579## 依次选择:后台设置-LOG设置-AP 日志 重新启动手机 问题二:闪退重启清空Log日志 方式一 : 错误 ...

  6. 华为手机app闪退重启清空log日志问题

    机型:华为荣耀7i手机, 开发环境:Android studio , 开发app的时候,出现问题,闪退,去控制台找错误日志,看log的输出,结果一秒闪过,什么都没有. 网上搜了半天,有一个是没有log ...

  7. Android 页面跳转时发生双击导致app闪退的解决方案

    在页面跳转时双击双击,查阅了各种资料 尝试一:从双击事件出发,避免双击事件 例如重写onClick事件 public abstract class NoDoubleClickListener impl ...

  8. Android App 可以定时启动! 并且完成短信自动发送获取内容功能 (以获取闪讯密码为例 大学宿舍宽带)

    接上一篇:android 发送短信sendTextMessage()真机运行报错,退出,在已申请SEND_SMS权限的情况下Android send SMS not working uid ... 重 ...

  9. android studio项目改成android.mk编译APP闪退java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

    android9系统android studio项目改成用android.mk编译v7包--APP闪退java.lang.UnsatisfiedLinkError: dalvik.system.Pat ...

最新文章

  1. logstsh xpack 认证_ElasticSearch Kibana 和Logstash 安装x-pack记录
  2. 南京工业大学乐学python答案_铁乐学python_day09_作业
  3. python数字转字符串_python如何将字符转换为数字
  4. (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
  5. 吴恩达机器学习课后作业深度解析(附答案)(ex2)
  6. anaconda的虚拟环境中查看已经安装好的包
  7. Python热门开源项目TOP10
  8. HDU 1210 Eddy's 洗牌问题(foj1062) || FOJ1050 Number lengths水
  9. leetcode刷题日记-供暖器
  10. Julia(编程语言)
  11. 儒略历、儒略日与儒略年原来是鸡同鸭讲
  12. [Android 4.4.4] Oppo Find7 MIUI 4.8.8 by crazyi
  13. 【途牛旅游项目】项目环境搭建,实现登陆功能
  14. 销售报表案例--如何应用Excel创建销售漏斗分析仪
  15. 考研证件照不能戴眼镜,不能PS,要求素颜审核非常严?
  16. 网络请求未知错误 CLEARTEXT communication to XX not permitted by network security policy 解决方案
  17. 12月30日goCom社区OSGi Topic大纲和PPT
  18. JAVA常用jar包简介
  19. 计算机网络课程设计 某高中校园网设计
  20. 计算机组成原理学习笔记:循环冗余校验码

热门文章

  1. Unity烘焙官方建议
  2. 三菱M80操作介绍_三菱PLC电脑上仿真操作步骤
  3. SQL ifnull、nullif 等函数
  4. 电脑键盘equals在哪个位置_电脑键盘符号
  5. skycons.js 基于canvas的天气动态图标小插件
  6. Java微信支付API文档测试
  7. Ubuntu修改只能用Guest登录
  8. 比尔·盖茨表示 AI应被用来改善教育医疗
  9. 微信小程序Radio为一组时,使用三元表达式始终选中默认值
  10. HTML5直播技术探究