2017-03-02 104 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); 
    } 
} 

結果是,後例外情況是顯示標準對話框,其中顯示諸如「不幸的應用xxx被關閉」之類的東西。在該對話框後面,在後臺,我可以看到我的對話框應該以這個意圖「PROCESS_LOG」開始。所以顯然是開始了,但問題是,標準對話框關閉後,我的自定義對話框也會關閉。如果我在對話活動的清單中添加

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。不過,我真的很感興趣,爲什麼它不起作用,因爲在另一個線程中,每個人似乎都運行它。但是,我使用自己引發的異常對它進行了測試,因此只需一個簡單的「空」RuntimeException即可首先測試此場景。 – Harry500

+0

您是否知道是否可以使用ACRA顯示自定義對話框(Fregment)或顯示爲對話框的活動以顯示報告數據並提供其他幾項功能,例如保存報告?也許使用實現自己的報告發送者的集成功能?或者在這一點上不可能再顯示任何其他自己的片段/對話/活動? – Harry500

回答

0

要發佈一個完整的消息(評論太短),這裏的全班和配置:

我試圖使用內置的對話框功能的ACRA,但我無法得到它的工作。但內置的功能,以顯示「吐司」的作品!所以這就是爲什麼我問自己問題是在哪裏顯示對話框。我用下面的@ReportCrashed註釋進行測試:

@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 
) 

裏面我自己的應用程序級的我用下面的初始化:

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.DIALOG, 
    resDialogText = R.string.app_name 
) 

這具有上述效果。

0

問題是 - 至少在ACRA對話框的情況下 - 它不起作用,因爲應用程序使用android studio的內置功能進行調試。所以你必須在android測試系統上(在調試設備上)啓動應用程序,而不需要android studio IDE的支持。當你這樣做並拋出異常時,ACRA對話框就會出現。