美文网首页
android5.0以上版本崩溃后重启APP

android5.0以上版本崩溃后重启APP

作者: 来10分钟波比 | 来源:发表于2019-08-14 12:06 被阅读0次

        相信很多小伙伴都会在错误统计后台遇到这样一个错误, 经常有二次崩溃发生在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。就不会再重启了。

文中如有什么不清楚的可以联系我,我可以更文。

相关文章

网友评论

      本文标题:android5.0以上版本崩溃后重启APP

      本文链接:https://www.haomeiwen.com/subject/nccgjctx.html