2011-08-31 109 views
1

有沒有辦法讓我創建一個服務來跟蹤我的活動類,並在崩潰後重新啓動它?請注意,我不能使用uncaughthandlers線程方法重新啓動我的應用程序。我的應用程序應該會崩潰,不要擔心該部分。我的應用程序是簡單的東西,像這樣如何在崩潰後自動重新啓動活動?

private class AudioRenderer extends Activity { 

private MediaPlayer AudioRenderer(String filePath) { 
File location = new File(filePath); 
     Uri path = Uri.fromFile(location); 
    mp= MediaPlayer.create(this, path); 

} 
return mp 


} 

一旦崩潰,在後臺監聽服務會自動重新啓動我的應用程序。有人知道這有可能嗎?謝謝!

回答

3

你可以這樣做,是的,如下所述。但如果這樣的技術可能對實驗有意義,則它們是絕對不適合生產。這將是非常醜陋和無效的。

此說,這裏是很長的路要走:

  • 讓您Servicestickyredelivered,以確保它總是會已啓動一次,而不是後運行明確地停止。

  • Activity

    ,靜態WeakReference指點下保存其所有正在運行的實例,並提供一種方式來靜態地檢查當前是否被分配它們中的至少一個:

    public class MyActivity extends Activity { 
        private static ArrayList<WeakReference<MyActivity >> sMyInstances = new ArrayList<WeakReference<MyActivity >>(); 
    
        public MyActivity() { 
         sMyInstances.add(new WeakReference<MyActivity >(this));    
        } 
    
        private static int nbInstances() { 
         int ret = 0; 
         final int size = sMyInstances.size(); 
    
         for (int ctr = 0; ctr < size; ++ctr) { 
          if (sMyInstances.get(ctr).get() != null) { 
           ret++; 
          } 
         } 
    
         return ret; 
        } 
    } 
    

WeakReference是提及不妨礙這些物體被垃圾收集的物體,更多詳情here

  • 然後,從您的Service,隨時撥打MyActivity.nbInstances()。在最後一次運行MyActivity實例崩潰之後,它將返回0個(通常短但理論上不可預知)。 警告:它會這樣做,除非您有memory leak關於此Activity或其基礎Context,因爲此泄漏將阻止垃圾收集的實例崩潰。

  • 然後你只需從你Service啓動Activity的新實例,使用startActivity(Intent)

+0

謝謝,我一定會嘗試了這一點!但既然你說這個方法會很醜並且效率不高,你知道一個更好的方法來重啓我的應用程序,一旦它崩潰而不使用線程異常處理程序嗎? – Sith

+0

實際上,這個方法本身就是這樣的:重啓崩潰的東西而不是修復這個東西並不好,並且效率不高,因爲用戶看到崩潰消息,重啓總是需要一些時間等。我的評論不是與該特定代碼相關。 – Shlublu