android APP闪退后如何屏蔽自启动
最近应项目需求,需要实现在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闪退后如何屏蔽自启动相关推荐
- app闪退后重启_Android app 如何实现崩溃后自动重启
Android app 如何实现崩溃后自动重启 由于有很多场景需要让自己的app一直保持运行状态,比如客户的launcher,或者定制app. 都希望在自己的app崩溃之后还可以自重启. 对于这样子 ...
- app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP
在安卓应用中,如果是偶发性bug导致APP崩溃,APP可能会直接闪退或者白屏,用户体验不太好,我们可以在application中捕获到全局异常,然后再进行处理. 首先创建一个MainApplicati ...
- android app 闪退的原因
1. 检查网络是否可用 2. 检查APP中访问网络的地方,组件中的ImageView是否可以正常的下载并显示到app 页面上. 2.检查APP的sdk和手机的系统是否兼容.
- android app闪退原因总结分析
存储不够 缓存过多,剩余空间不够(针对内存): 后台任务太多,导致运存不够(针对运存) App和SDK版本不兼容 sdk版本明显低于app,高版本app调用低版本SDK没有的API: 不同版本间API ...
- Android番外篇 华为手机APP闪退重启清空Log日志问题解决
问题一:没有Log.v和Log.d日志 解决方案: 进入拨号界面输入:##2846579## 依次选择:后台设置-LOG设置-AP 日志 重新启动手机 问题二:闪退重启清空Log日志 方式一 : 错误 ...
- 华为手机app闪退重启清空log日志问题
机型:华为荣耀7i手机, 开发环境:Android studio , 开发app的时候,出现问题,闪退,去控制台找错误日志,看log的输出,结果一秒闪过,什么都没有. 网上搜了半天,有一个是没有log ...
- Android 页面跳转时发生双击导致app闪退的解决方案
在页面跳转时双击双击,查阅了各种资料 尝试一:从双击事件出发,避免双击事件 例如重写onClick事件 public abstract class NoDoubleClickListener impl ...
- Android App 可以定时启动! 并且完成短信自动发送获取内容功能 (以获取闪讯密码为例 大学宿舍宽带)
接上一篇:android 发送短信sendTextMessage()真机运行报错,退出,在已申请SEND_SMS权限的情况下Android send SMS not working uid ... 重 ...
- android studio项目改成android.mk编译APP闪退java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader
android9系统android studio项目改成用android.mk编译v7包--APP闪退java.lang.UnsatisfiedLinkError: dalvik.system.Pat ...
最新文章
- logstsh xpack 认证_ElasticSearch Kibana 和Logstash 安装x-pack记录
- 南京工业大学乐学python答案_铁乐学python_day09_作业
- python数字转字符串_python如何将字符转换为数字
- (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
- 吴恩达机器学习课后作业深度解析(附答案)(ex2)
- anaconda的虚拟环境中查看已经安装好的包
- Python热门开源项目TOP10
- HDU 1210 Eddy's 洗牌问题(foj1062) || FOJ1050 Number lengths水
- leetcode刷题日记-供暖器
- Julia(编程语言)
- 儒略历、儒略日与儒略年原来是鸡同鸭讲
- [Android 4.4.4] Oppo Find7 MIUI 4.8.8 by crazyi
- 【途牛旅游项目】项目环境搭建,实现登陆功能
- 销售报表案例--如何应用Excel创建销售漏斗分析仪
- 考研证件照不能戴眼镜,不能PS,要求素颜审核非常严?
- 网络请求未知错误 CLEARTEXT communication to XX not permitted by network security policy 解决方案
- 12月30日goCom社区OSGi Topic大纲和PPT
- JAVA常用jar包简介
- 计算机网络课程设计 某高中校园网设计
- 计算机组成原理学习笔记:循环冗余校验码