uncaughtExceptionHandler를 사용하여 캐치되지 않은 예외가 발생한 후 암시적인 인 텐트가있는 활동을 시작하려고했습니다. 의도는 충돌 한 동일한 앱에서 대화 상자로 활동을 시작해야합니다. Need to handle uncaught exception and send log file캐치되지 않는 예외 후 대화 상자 표시
내가 이렇게 내 자신의 핸들러 절차의 마지막에 원래 있던 uncaughtExceptionHandler를 호출이이 스레드에 나와있는 예에 해당
public class ThisApplication extends Application
{
Thread.UncaughtExceptionHandler originalUncaughtExceptionHandler;
@Override
public void onCreate()
{
originalUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
super.onCreate();
}
public void handleUncaughtException (Thread thread, Throwable e)
{
e.printStackTrace();
Intent intent = new Intent();
intent.setAction ("de.mydomain.myapp.action.PROCESS_LOG");
intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
if (intent.resolveActivity(getPackageManager()) == null) {
Log.d("ThisApplication","No receiver");
} else {
Log.d("ThisApplication", "Intent start");
startActivity(intent);
}
originalUncaughtExceptionHandler.uncaughtException(thread, e);
}
}
결과는 그 애프터 예외적으로 "불행히도 App xxx가 닫혔습니다"와 같은 표준 Dialog가 표시됩니다. 그 대화 상자 뒤에서 백그라운드에서 "PROCESS_LOG"라는 의도로 시작해야하는 Dialog를 볼 수 있습니다. 그래서 분명히 시작되었지만 문제는 표준 Dialog가 닫힌 후에 사용자 정의 대화 상자가 닫히는 것입니다. 나는 대화 활동의 매니페스트에
android:launchMode="singleInstance"
를 추가하는 경우, 대화도 숨겨져 있지만 응용 프로그램이 최근 앱 메뉴에서 선택 때 다시 활성화 할 수 있습니다. 이것은 마치 대화 상자가 이전 앱 프로세스/작업과 완전히 독립적으로 시작되지 않은 것처럼 보입니다.
누군가 내가 뭘 잘못했는지 말할 수 있습니까?
이 대화 활동의 매니페스트 일부입니다
<activity
android:name=".ProcessLogActivity"
android:windowSoftInputMode="stateHidden"
android:theme="@style/ProcessLogActivity"
android:process=":report_process"
>
<intent-filter>
<action android:name="de.mydomain.myapp.action.PROCESS_LOG" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
대응하는 스타일 :
<style name="ProcessLogActivity" parent="@style/Theme.AppCompat.Light.Dialog">
</style>
이는 대화 활동 클래스입니다 :
public class ProcessLogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature (Window.FEATURE_NO_TITLE);
setFinishOnTouchOutside (false);
Log.d("ThisApplication", "Intent received");
setContentView(R.layout.activity_process_log);
}
}
ACRA에 연결하기 만하면됩니다. 다른 것이 없다면 ACRA의 구현을보고 어떻게 처리하는지 결정하십시오. 처리되지 않은 예외 상황에서 이와 같은 작업을 수행하는 것은 환경이 상당히 엉망이 될 수 있으므로 (예 : 'OutOfMemoryError'가 충돌을 유발 한 것과 같이) 올바르게 진행하는 것이 어렵습니다. – CommonsWare
팁 주셔서 감사합니다. ACRA를 살펴 보겠습니다. 그럼에도 불구하고 나는 정말로 흥미로울 것입니다. 왜냐하면 다른 스레드에서는 모두 실행되도록 생각하기 때문에 그것이 작동하지 않는 이유입니다. 그러나, 나는 혼자서 던져진 Exception을 가지고 테스트 했으므로 처음에는이 시나리오를 테스트하기위한 간단한 "빈"RuntimeException이있다. – Harry500
ACRA를 사용하여 보고서 데이터를 표시하고 예를 들어 보고서를 저장하는 등 여러 가지 기능을 제공하는 대화 상자로 표시된 사용자 지정 대화 상자 (Fregment) 또는 활동을 표시 할 수 있는지 알고 있습니까? 어쩌면 자체 보고서 발신자 구현의 통합 기능을 사용하고 있을까요? 또는이 시점에서 다른 조각/대화 상자/활동을 더 이상 표시 할 수 없습니까? – Harry500