【发布时间】:2011-11-30 00:51:57
【问题描述】:
如果另一个Activity 导致抛出未处理的异常,有没有办法让Android 返回到我的应用程序中的前一个Activity?
【问题讨论】:
标签: android exception android-activity
如果另一个Activity 导致抛出未处理的异常,有没有办法让Android 返回到我的应用程序中的前一个Activity?
【问题讨论】:
标签: android exception android-activity
当任何线程由于未处理的异常而死亡时,您可以尝试使用Thread.setDefaultUncaughtExceptionHandler 接收通知。但我不确定 Dalvik 对该机制的实现。您可能无法从 UncaughtExceptionHandler 开始另一个活动,因为文档没有说明线程/进程复活。
更新
好的。我对其进行了测试,现在我确信如果您的应用程序在 UI 线程中抛出异常,您将不能够使用上述技术返回到以前的 Activity。发生这种情况是因为该异常会导致应用程序main looper 退出,因此您的应用程序将无法处理任何进一步的 UI 消息。
我发现实现您想要的唯一可能的方法是以下肮脏的黑客:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
while (true) {
try {
Log.i("MyLooper", "Starting my looper");
Looper.loop();
} catch (Exception e) {
Log.e("MyLooper", "Caught the exception in UI thread, e:", e);
showPreviousActivity();
}
}
}
private void showPreviousActivity() {
// your implementation of showing the previous activity
}
}
并在您的 AndroidManifest.xml 中注册 MyApplication:
<application android:name=".MyApplication">
…
showPreviousActivity() 方法的实现取决于您。一种可能的解决方案是在某个 ActivityTracker 类中跟踪当前的 Activity 实例,并从 showPreviousActivity 代码中调用当前的活动 finish() 方法。
【讨论】:
Activity 在运行,getApplicationContext() 仍将提供有效的 Context。然后,您可以从已注册的 UncaughtExceptionHandler 内部调用 startActivity() ;)
UncaughtExceptionHandler 并且 UI 线程中发生异常,那么 startActivity() 将无济于事,因为主循环器已经死了。
使用try-catch 块来捕获异常并在那里使用startActivity。没有抓住就不能去参加其他活动。
【讨论】: