2017-03-02 6 views
1

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); 
    } 
} 
+0

ACRA에 연결하기 만하면됩니다. 다른 것이 없다면 ACRA의 구현을보고 어떻게 처리하는지 결정하십시오. 처리되지 않은 예외 상황에서 이와 같은 작업을 수행하는 것은 환경이 상당히 엉망이 될 수 있으므로 (예 : 'OutOfMemoryError'가 충돌을 유발 한 것과 같이) 올바르게 진행하는 것이 어렵습니다. – CommonsWare

+0

팁 주셔서 감사합니다. ACRA를 살펴 보겠습니다. 그럼에도 불구하고 나는 정말로 흥미로울 것입니다. 왜냐하면 다른 스레드에서는 모두 실행되도록 생각하기 때문에 그것이 작동하지 않는 이유입니다. 그러나, 나는 혼자서 던져진 Exception을 가지고 테스트 했으므로 처음에는이 시나리오를 테스트하기위한 간단한 "빈"RuntimeException이있다. – Harry500

+0

ACRA를 사용하여 보고서 데이터를 표시하고 예를 들어 보고서를 저장하는 등 여러 가지 기능을 제공하는 대화 상자로 표시된 사용자 지정 대화 상자 (Fregment) 또는 활동을 표시 할 수 있는지 알고 있습니까? 어쩌면 자체 보고서 발신자 구현의 통합 기능을 사용하고 있을까요? 또는이 시점에서 다른 조각/대화 상자/활동을 더 이상 표시 할 수 없습니까? – Harry500

답변

0

전체를 게시하려면 메시지 (댓글이 너무 짧음), 전체 클래스 및 구성 :

대화 상자 기능이 내장 된 ACRA를 사용하려고했지만 작동하지 못했습니다. 그러나 "Toast"를 보여주는 빌트인 funtionality가 작동합니다! 그래서 나는 문제가 대화를 보여주는 곳을 스스로에게 묻습니다. 내가 테스트를 위해 다음과 같은 @ReportCrashed 주석을 사용

public class ThisApplication extends Application { 
    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 

     final ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(this); 
     configurationBuilder.setBuildConfigClass(BuildConfig.class); 

     final ACRAConfiguration config; 
     try { 
      config = configurationBuilder.build(); 
      ACRA.init(this, config); 
     } catch (ACRAConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

내 응용 프로그램은 두 개의 서로 다른 빌드 맛과 두 빌드 유형을 사용합니다 "디버그 :

@ReportsCrashes(
    formUri = "http://yourserver.com/yourscript", 
    mode = ReportingInteractionMode.NOTIFICATION, 
    resDialogText = R.string.app_name, 
    resNotifTickerText = R.string.app_name, 
    resNotifTitle = R.string.app_name, 
    resNotifText = R.string.app_name 
) 

내 자신의 응용 프로그램 클래스 내부에서 나는 다음 초기화를 사용 "및"릴리스 ".

처리되지 않은 예외가 발생하면 모든 응용 프로그램이 대화 상자없이 닫히기 전에 응용 프로그램이 닫히고 매우 짧은 순간 (1 초 미만) 동안 대화 상자가 표시되는 경우가 있습니다.

모든 아이디어를 ...

편집 :? 위의 주석도 작동하지 않는 알림, 함께 시도했다. 알림은 매우 짧은 순간에만 표시되고 즉시 사라집니다.대화 주석은 다음과 같습니다.

@ReportsCrashes(
    formUri = "http://yourserver.com/yourscript", 
    mode = ReportingInteractionMode.DIALOG, 
    resDialogText = R.string.app_name 
) 

위의 설명이 적용됩니다.

0

문제는 적어도 ACRA-Dialog의 경우 - 앱이 android studio의 기본 기능으로 디버깅되어 작동하지 않는다는 것입니다. 그래서 당신은 안드로이드 스튜디오 IDE의 지원없이 (디버깅 장치에) 안드로이드 테스트 시스템에서 응용 프로그램을 시작해야합니다. 그렇게하고 예외가 발생하면 ACRA-Dialog가 정상적으로 나타납니다.