2011-10-03 73 views

回答

2

你可以尝试使用Thread.setDefaultUncaughtExceptionHandler当任何线程因死亡未处理的异常收到通知。但我不确定Dalvik如何实现该机制。这可能会导致你无法从UncaughtExceptionHandler开始另一项活动,因为文档中没有提到线程/进程的复活。

更新

确定。我测试了它,现在我敢肯定你会可以重新使用上述技术,以前的活动,如果您的应用程序扔在UI线程例外。发生这种情况是因为该异常会导致应用程序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()方法。

+0

如果应用程序已超过1'Activity'运行,'getApplicationContext()'仍然会提供一个有效的'上下文'。然后,您可以调用'startActivity()'从里面注册'UncaughtExceptionHandler';) – styler1972

+0

如果你使用'UncaughtExceptionHandler'和异常发生在UI线程然后'startActivity()'不会帮助,因为主尺蠖是已经死了。 – Idolon

0

使用try-catch块捕获异常并startActivity那里。如果没有捕获它,你不能去参加其他活动。

+0

没有例外,atm。如果我有一个未处理的异常,我想要编写代码,但我不知道它将会在哪里。 – styler1972

+0

你需要弄清楚当活动崩溃时,它会关闭应用程序。 –

+0

这是一个假设的情况,因为它现在没有崩溃 – styler1972

相关问题