Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 如果发生UncaughtExceptionHandler,如何退出(仅)当前活动?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
做了一些编码来测试Thread.UncaughtExceptionHandler的特定用例(如下所述).

首先,我以这种方式实现了BaseActivity.

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread paramThread,Throwable paramThrowablE) {
                Log.e("CRASH_REPORT","Activity crashed!");
                System.exit(0);
            }
        });
    }
}

通过扩展BaseActivity,任何未捕获的异常最终都会被处理程序捕获. System.exit(0)将终止属于该应用程序的Vm.

现在,我使用此层次结构创建了2个活动(均扩展了BaseActivity).

在ParentActivity中,我只有一个按钮,点击后会启动subactivity(代码省略).

subactivity.onCreate(…)中,我故意注入一个异常来触发uncaughtException(…).

public class subactivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);
        int crash = 1 / 0;
    }
}

执行subactivity时,会触发uncaughtException(…)并停止应用程序(显然没有熟知的app停止对话框).

我想知道的是,是否可以终止触发的Activity(在这种情况下是subactivity),app是否会回滚(排序)到之前的状态(ParentActivity)?

任何建议表示赞赏.谢谢.

解决方法

经过一些研究,我相信没有办法返回上一个Activity,因为主要线程已经停止,因此触发了uncaughtException(…).

在这里,我将列出我对“对策”这个问题的看法.

1.在不同的过程中声明每个活动(不推荐)

在清单文件中,在每个活动标记添加android:process = deDicated_process_name.这样做会使每个Activity在自己的进程中运行,从而确保1个进程的崩溃不会影响另一个进程.但不建议这样做.

<activity
    android:name=".ParentActivity"
    android:process="::parent_process" />

2.强制停止应用程序(System.exit(代码))并提供回调,其中每个Activity都可以定义自己的处理.

使用onCrashed(…)回调创建BaseActivity.

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread paramThread,"Activity crashed!");
                onCrashed(thread,throwablE);
                System.exit(0);
            }
        });
    }

    protected void onCrashed(Thread thread,Throwable throwablE) {
        // space for rent
    }
}

从BaseActivity扩展的所有Activity都可以决定他们在崩溃时想要做什么.一个例子是安排再次启动应用程序.

public class subactivity extends BaseActivity
    @Override
    protected void onCrashed(Thread thread,Throwable throwablE) {
        Intent i = new Intent(this,ParentActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this,i,0);
        AlarmManager am = (AlarmManager) getSystemservice(Context.ALARM_serviCE);
        am.set(AlarmManager.RTC,System.currentTimeMillis() + 100,pi);
    }

或者,我们可以选择在应用程序级别实现uncaughtException(…),Application将决定下一步该做什么. (例如,重启当前活动)

大佬总结

以上是大佬教程为你收集整理的android – 如果发生UncaughtExceptionHandler,如何退出(仅)当前活动?全部内容,希望文章能够帮你解决android – 如果发生UncaughtExceptionHandler,如何退出(仅)当前活动?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。