相信很多小伙伴都会在错误统计后台遇到这样一个错误, 经常有二次崩溃发生在App初始化页面 、 App根页面 、 App主页面等,却知道为什么。其实是android5.0以上的崩溃系统会尝试重启App打开上一次那个页面,但是因为崩溃导致App内的一些数据已经错乱,当你尝试再次重启他当然会二次崩溃。
好,废话不多说给出解决方案。就是在当App崩溃的时候清除所有页面并且关掉App,这样既然清除所有页面,所以就当然不会出现App会重新启动的情况了。
一、异常捕获
public enum SimpleUncaughtExceptionHandlerSingletonimplements Thread.UncaughtExceptionHandler {
getInstance;
public static final StringTAG ="simple_activity_manage";
// 程序的 Context 对象
private Contextcontext;
private boolean isDebug;
private StringmTips;
// 系统默认的 UncaughtException 处理类
private Thread.UncaughtExceptionHandlerdefaultHandler;
public void init(Context context,boolean isDebug) {
this.isDebug = isDebug;
this.context = context;
this.mTips ="很抱歉,程序出现异常,即将退出...";
// 获取系统默认的 UncaughtException 处理器
defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
// 设置该 CrashHandler 为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
DebugLog.e(TAG,"uncaughtException --> " +"thread = " + (thread !=null ? thread.toString() :"null") +", Throwable = " + (ex !=null ? ex.toString() :"null"));
if (!handleException(ex) &&defaultHandler !=null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
defaultHandler.uncaughtException(thread, ex);
}else {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
}
//
SimpleActivityStackSingleton.getInstance.finishAllActivity();
// 杀死了整个进程,这时候活动所占的资源也会被释放
//System.exit(0);
//杀死该应用进程
android.os.Process.killProcess(android.os.Process.myPid());
}
}
/**
* 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成
*
* @param ex
* @return true:如果处理了该异常信息;否则返回 false
*/
private boolean handleException(final Throwable ex) {
if (ex ==null) {
return false;
}
// 使用 Toast 来显示异常信息
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(context, getTips(ex), Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
return true;
}
private String getTips(Throwable ex) {
if (exinstanceof SecurityException) {
if (ex.getMessage().contains("android.permission.CAMERA")) {
mTips ="请授予应用相机权限,程序出现异常,即将退出.";
}else if (ex.getMessage().contains("android.permission.RECORD_AUDIO")) {
mTips ="请授予应用麦克风权限,程序出现异常,即将退出。";
}else if (ex.getMessage().contains("android.permission.WRITE_EXTERNAL_STORAGE")) {
mTips ="请授予应用存储权限,程序出现异常,即将退出。";
}else if (ex.getMessage().contains("android.permission.READ_PHONE_STATE")) {
mTips ="请授予应用电话权限,程序出现异常,即将退出。";
}else if (ex.getMessage().contains("android.permission.ACCESS_COARSE_LOCATION") || ex.getMessage().contains("android.permission.ACCESS_FINE_LOCATION")) {
mTips ="请授予应用位置信息权,很抱歉,程序出现异常,即将退出。";
}else {
mTips ="很抱歉,程序出现异常,即将退出,请检查应用权限设置。";
}
}
return mTips;
}
}
Activity列表管理器
enum SimpleActivityStackSingleton {
getInstance;
private static final StringTAG ="SimpleActivityStackSingleton";
private final ListactivityStack =new ArrayList<>();
/**
* 添加单个Activity
*/
public void addActivity(Activity activity) {
if (!activityStack.contains(activity)) {
activityStack.add(activity);
}
}
/**
* 销毁单个Activity
*/
public void removeActivity(Activity activity) {
if (activityStack.contains(activity)) {
activityStack.remove(activity);
}
}
/**
* 销毁所有的Activity
*/
public void finishAllActivity() {
DebugLog.e(TAG,"finishAllActivity -->");
// TODO : 注意, 最后一个 Activity 是出现异常的 Activity, 不能finish(), 否则在不杀死进程之前直接启动 APP 会卡住.
for (int i =activityStack.size() -2; i >=0; i--) {
Activity activity =activityStack.get(i);
DebugLog.e(TAG,"finishAllActivity --> " + activity.getClass().getSimpleName());
activity.finish();
}
activityStack.clear();
}
}
Activity生命周期管理
public abstract class SimpleBaseActivityextends AppCompatActivity {
private static final StringTAG ="simple_activity_manage";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DebugLog.e(TAG, getClass().getSimpleName() +"_onCreate");
SimpleActivityStackSingleton.getInstance.addActivity(this);
}
@Override
protected void onResume() {
super.onResume();
DebugLog.e(TAG, getClass().getSimpleName() +"_onResume");
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
DebugLog.e(TAG, getClass().getSimpleName() +"_onPause");
MobclickAgent.onPause(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
DebugLog.e(TAG, getClass().getSimpleName() +"_onDestroy");
SimpleActivityStackSingleton.getInstance.removeActivity(this);
}
}
如上:思路就是在app捕获到崩溃的时候清空app中的activity列表容器,并且退出app。就不会再重启了。
文中如有什么不清楚的可以联系我,我可以更文。
网友评论