2016-10-31 20 views
1

在某些情況下,我需要在我的應用程序中調用exit()(我知道這不是完成的最佳方式,但這不是問題)。此外,我想展示一個新的對話框,通知用戶有關崩潰。新活動有時不啓動

我創建了一個新的活動類,一個新的廣播接收器,在清單中註冊它們。接下來,我呼籲:

Intent intent = new Intent(this, AppCloseReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0); 
try 
{ 
    pendingIntent.send(); 
} 
catch(Exception ex){} 

System.exit(0); 

的問題是,新的窗口出現有時!首先,我認爲System.exit(0);在新活動有機會開始之前觸發(因爲異步呼叫,認爲在文檔中找不到這個),所以我在pendingIntent.send();System.exit(0);之間加了Thread.sleep(1000),但結果是一樣的 - 新窗口出現有時。日誌中沒有任何東西,沒有例外。

新的活動只是一個靜態文本。

+0

這絕對不可靠。調用'System.exit()'基本上關閉了虛擬機。您不能保證關閉虛擬機時會發生任何事情。你當然不能指望在用戶界面中顯示任何內容。請解釋你的用例,也許我們可以提出一個替代方案。 –

+0

我的用例是在某些條件下退出,並告訴用戶爲什麼應用程序停止。作爲替代方案,我正在使用通知,但我希望更多的持久性解決方案應該保持在屏幕上,並等待用戶手動關閉它。 – nikitablack

回答

1

這不可靠。如果您導致虛擬機關閉,您將無法顯示任何內容,因爲不再有虛擬機在運行。唯一可行的方法是確保BroadcastReceiverActivity在不同的操作系統進程中運行以顯示消息。這也不是100%可靠的,因爲根據異常的性質,您現有的虛擬機可能無法啓動其他組件,但它可能比您當前的實施更可靠。例如,如果您的應用程序因OutOfMemoryException而崩潰,則可能無法做任何有用的事情。

爲了確保組件中的單獨進程中運行,添加

android:process=":other" 

<activity><receiver>定義在清單中的那些組件。

您還應該嘗試延遲呼叫System.exit(),以使VM有機會實際啓動對話框的啓動。此外,您不需要使用PendingIntent。試試這樣的:

Intent intent = new Intent(this, AppCloseReceiver.class); 
sendBrodcast(intent); 
// Start separate Thread to terminate the process 
new Thread(new Runnable() { 
    @override 
    public void run() { 
     SystemClock.sleep(1000); // Sleep a bit to give the VM enough time to actually send the broadcast Intent 
     System.exit(0); 
    } 
}).start();