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

时间:2015-09-23 04:23:38

标签: android

我做了一些编码来测试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 - >子活动


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(...)已触发且应用已停止(显然没有众所周知的应用停止对话框)。

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

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

1 个答案:

答案 0 :(得分:0)

经过一些研究,我认为当Activity触发uncaughtException(...)时, NO WAY 将返回上一个Activity,因为主线程已经停止。

在这里,我将列出我的想法"对策"这个问题。


1。在不同的进程中声明每个android:process=dedicated_process_name(不推荐)

在清单文件中,在每个activity标记下添加Activity。这样做会使每个<activity android:name=".ParentActivity" android:process="::parent_process" /> 在自己的进程中运行,从而确保1个进程的崩溃不会影响另一个进程。但不建议这样做。

System.exit(code)


2。强制停止应用(Activity)并提供回调,其中每个BaseActivity可以定义自己的处理。

使用onCrashed(...)回调创建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!"); onCrashed(thread, throwable); System.exit(0); } }); } protected void onCrashed(Thread thread, Throwable throwable) { // space for rent } }

Activity

BaseActivity延伸的所有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, 0, i, 0); AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pi); } 可以决定他们在崩溃时想要做什么。一个例子是安排再次启动应用程序。

Application

或者,我们可以选择在Application级别实施uncaughtException(...),Activity将决定下一步该做什么。 (例如,重启当前{{1}})