android – 如果发生UncaughtExceptionHandler,如何退出(仅)当前活动?

android – 如果发生UncaughtExceptionHandler,如何退出(仅)当前活动?,第1张

概述我做了一些编码来测试Thread.UncaughtExceptionHandler的特定用例(如下所述). 首先,我以这种方式实现了BaseActivity. public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceStat 我做了一些编码来测试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

在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,如何退出(仅)当前活动?所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1123598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存