2011-11-27 46 views
8

在我的應用程序,我把我的服務在前臺,以防止它被殺死使用:更新通知是否刪除服務的前臺狀態?

startForeground(NOTIFY_ID, notification); 

這也顯示通知用戶(這是偉大的)。問題是後來我需要更新通知。所以我使用的代碼:

notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent); 
mNotificationManager.notify(NOTIFY_ID, notification); 

然後問題是:這樣做會把服務從它的特殊的前景狀態?

this answer,CommonsWare表明這種行爲是可能的,但他不確定。那麼是否有人知道實際答案?


注:我知道一個簡單的方法來擺脫這個問題是重複調用startForeground()我想更新通知每次。我期待知道這種替代方案是否也能起作用。

+1

順便說一句,雖然可以更新現有通知的文字,你不能使股票文字顯示在狀態欄上不止一次對於給定的通知,即使更改它 - 至少不使用Notification.FLAG_ONGOING_EVENT。要爲現有通知顯示新的報價文本,您需要取消通知並重新啓動。 –

回答

9

Android開發人員網站上的RandomMusicPlayer應用程序使用NotificationManager更新前臺服務的通知,所以機會非常好,它保留了前臺狀態。

(見setUpAsForeground()updateNotification()在MusicService.java類)。

據我所知,如果你取消的通知服務將停止作爲前臺服務,所以記住這一點;如果您取消通知,則需要再次調用startForeground()才能恢復服務的前臺狀態。

8

要澄清已經在這裏說:

據我所知,如果你取消的通知服務 將不再是一個前臺服務,所以記住這一點;如果您取消通知,您需要再次調用startForeground() 來恢復服務的前臺狀態。

答案的這部分表明,它可以通過對持續Notification使用NotificationManager.cancel()刪除正在進行NotificationService設置。 這是不正確的。 使用NotificationManager.cancel()刪除startForeground()設置的正在進行的通知是不可能的。

刪除它的唯一方法是撥打stopForeground(true),這樣正在進行的通知就被刪除了,這也使得Service停止在前臺。所以它實際上是另一種方式; Service不會停止在前臺,因爲Notification被取消,Notification只能通過停止在前臺的Service取消。

當然可以在此之後立即致電startForeground(),以便用新的Notification恢復狀態。如果必須再次顯示股票代碼文本,您將希望執行此操作的一個原因是,它只會在第一次顯示Notification時運行。

此行爲沒有記錄,我浪費了4個小時試圖弄清楚爲什麼我無法刪除Notification。 關於此問題的更多信息:NotificationManager.cancel() doesn't work for me

2

當您想更新由startForeground()設置的通知時,只需構建一個新的通知,然後使用NotificationManager來通知它。

關鍵是要使用相同的通知ID。

更新通知不會從前臺狀態中刪除服務(只能通過調用stopForground來完成);

例子:

private static final int notif_id=1; 

@Override 
public void onCreate(){ 
    this.startForeground(); 
} 

private void startForeground() { 
     startForeground(notif_id, getMyActivityNotification("")); 
} 

private Notification getMyActivityNotification(String text){ 
     // The PendingIntent to launch our activity if the user selects 
     // this notification 
     CharSequence title = getText(R.string.title_activity); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 
       0, new Intent(this, MyActivity.class), 0); 

     return new Notification.Builder(this) 
       .setContentTitle(title) 
       .setContentText(text) 
       .setSmallIcon(R.drawable.ic_launcher_b3) 
       .setContentIntent(contentIntent).getNotification();  
} 
/** 
this is the method that can be called to update the Notification 
*/ 
private void updateNotification() { 

       String text = "Some text that will update the notification"; 

       Notification notification = getMyActivityNotification(text); 

       NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
       mNotificationManager.notify(notif_id, notification); 
} 
相關問題