2011-10-03 4 views

답변

2

처리되지 않은 예외로 인해 스레드가 사망 한 경우 알림을 받으려면 Thread.setDefaultUncaughtExceptionHandler을 사용해보십시오. 그러나 Dalvik이 그 메커니즘을 구현했는지 확신 할 수 없습니다. 설명서에 스레드/프로세스 부활에 대한 내용이 없으므로 UncaughtExceptionHandler에서 다른 활동을 시작할 수 없습니다.

업데이트

좋아. 테스트 한 결과 이제는 응용 프로그램이 UI 스레드에서 예외를 throw 한 경우 위의 기술을 사용하여 이전 활동으로 돌아갈 수 있습니다. 이는 예외로 인해 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

애플리케이션에 'Activity'가 두 개 이상 실행중인 경우 getApplicationContext()는 유효한'Context '. – styler1972

+0

'UncaughtExceptionHandler'를 사용하고 예외가 UI 스레드에서 발생하면'startActivity()'는 주 루퍼가 이미 죽어 있기 때문에 도움이되지 않습니다. – Idolon

0

try-catch 블록을 사용하여 예외를 catch하고 startActivity을 사용하십시오. 잡는 일없이 다른 활동으로 갈 수는 없습니다.

+0

atm 예외는 없습니다. 처리되지 않은 예외가 발생하는 경우 코드를 작성하고 싶습니다. 어디로 가야할지 모릅니다. – styler1972

+0

당신은 활동이 충돌 할 때 그것을 알아낼 필요가 있습니다, 그것은 응용 프로그램을 닫습니다. –

+0

순간적으로 충돌하지 않으므로 가설적인 시나리오입니다. – styler1972

관련 문제