2011-11-17 70 views
3

我目前正在構建一個將播放聲音的應用程序。當用戶啓動聲音時,我使用此代碼顯示狀態欄通知:Android:捕捉應用程序出口

 
notificationManager = (NotificationManager) activity.getSystemService(Activity.NOTIFICATION_SERVICE); 

Intent intent = new Intent(activity, MyActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, intent, 0); 

notification = new Notification(); 
notification.icon = android.R.drawable.stat_notify_sync; 
notification.flags |= Notification.FLAG_ONGOING_EVENT; 

String title = activity.getString(R.string.notification_title); 
String text = activity.getString(R.string.notification_text); 

notification.setLatestEventInfo(activity, title, text, pendingIntent); 

這工作正常。稍後,如果用戶停止了所有聲音,我使用notificationManager.cancel刪除通知,並且再次,這工作正常。

我的問題是,我想處理使用任務殺手應用程序的人的情況。如果有人使用其中一個來殺死我的應用程序,我希望將通知圖標從狀態欄中刪除。我知道很多用戶喜歡使用這些類型的應用程序,我不希望有人抱怨他們無法「關閉」我的應用程序!

到目前爲止,我還沒有能夠檢測到應用何時退出。我已經試過這樣:

 
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
{ 
    @Override 
    public void uncaughtException(Thread thread, Throwable ex) 
    { 
    notificationManager.cancel(NOTIFICATION_ID); 
    } 
}); 

而且也是這樣:

 
Runtime.getRuntime().addShutdownHook(new Thread() 
{ 
    @Override 
    public void run() 
    { 
    notificationManager.cancel(NOTIFICATION_ID);    
    } 
}); 

但是,這是行不通的。當我的應用程序被殺時,通知圖標仍然存在。爲了殺死我的應用程序,我一直在使用名爲「高級任務殺手」的應用程序。我也通過在DDMS中殺死我的進程來進行測試。

我注意到,本地媒體播放器正在這樣做。如果音樂正在播放並且您殺死了音樂服務,該圖標將會消失。

那麼,有沒有辦法檢測應用程序即將退出的時間,以便我可以刪除通知圖標?或者有沒有辦法讓通知圖標自動刪除,如果我的應用程序被殺害?

謝謝!

+0

您的應用程序只能管理通知。當應用程序被終止時,它不再執行任何操作,即使像'application.onTerminate()'這樣的東西也不會被調用。您必須找到一種方法來立即重新啓動您的服務,然後管理您的通知或標記您的通知,以便系統在您的應用程序不再運行時將其刪除。 –

回答

2

有出現在通知欄兩種類型的圖標:

  1. 通知,由應用程序或系統發送
  2. 前臺服務

您使用的是第一種類型。它是由應用程序(或系統)發送的通知,目標是向用戶提供一些信息。示例:新郵件到達,存儲空間不足,我的帖子發表新評論。 這些都是用戶理論上想要檢查的所有信息,它應該保持在那裏,直到用戶點擊該信息以查看細節(如果有的話)或決定刪除它們,移除所有剩下的通知。

我就開始從documentation

前臺服務與報價談論前景的服務是一個被認爲是東西 用戶正在積極瞭解並因此不是系統的候選者的服務 在內存不足時殺死。前臺服務必須爲位於「正在進行」 標題下的狀態欄提供 通知,這意味着除非 服務停止或從前臺移除,否則不能撤消通知。

例如,從服務播放音樂的音樂播放器應設爲 設置爲在前臺運行,因爲用戶明確知道它的操作 。狀態欄中的通知可能會指示 當前歌曲,並允許用戶發起活動以與 音樂播放器交互。

這是您在問題中提到的音樂應用程序的情況。 Music應用程序內部的播放器部分實現爲前臺服務。當用戶選擇一首歌曲並播放它時,通過應用程序用戶界面啓動服務(並在通知欄中顯示該圖標),並開始播放歌曲,並可以獨立於用戶界面本身繼續播放。當歌曲結束或用戶停止複製時,圖標將隨着服務(應該)停止而消失。

要了解更多關於如何實現前臺服務,請參閱上面的鏈接(只需點擊單詞「文檔」),而它的運行

+0

是的,似乎正確的做法是使用前臺服務。我今天會試試這個。 –

+0

讓我知道如何去 – DallaRosa

+0

我終於能夠嘗試它,它工作正常。這似乎是正確的做法。謝謝! –

0

你唯一的希望就是在onPause()中做所有的事情,甚至對於任何需要保存的東西我都是這樣做的,在後臺線程中不會很容易拋出(這是在docs只是讀了它),唯一的「解決方法」我可以計算出整個事情的運行方式是在運行時使用存儲^,並使用服務並在非理智值處檢查空值^並檢查他們在onResume(),以便如果你的應用程序確實被轉儲(通過從OS中的任務列表中刪除指針),那麼至少應用程序返回到處於半穩定狀態的用戶:

Dianne Hackborn, a Software Engineer who sits very near the exact center of everything Android.

2

你最好打賭wi將這個移動到Service。在onBind()中,您可以將Service連接到主要的Activity,當應用程序被終止時,您可以刪除onUnbindonDestroy(位於Service)中的Notification

+0

你不需要添加和刪除通知。如果您創建前臺服務,服務啓動時服務圖標將自動啓動,服務停止時會自動消失。 – DallaRosa