2011-10-31 47 views
0

我一直在爲此奮鬥了一個多星期,所以任何幫助將不勝感激。正在取消正在進行的事件Android通知

我有一個Activity開始媒體播放服務。一旦開始播放,在服務啓動一個持續的,不可撤銷的通知,如:

realIntent = new Intent(this, EpisodeViewer.class); 
realIntent.putExtra("show_name", showName); 
realIntent.putExtra("episode_name", episodeName); 

pendingIntent = PendingIntent.getActivity(this, 0, realIntent, 0); 

note = 
    new Notification(
     R.drawable.ic_notification_bcn, 
     episodeName, 
     System.currentTimeMillis()); 
note.flags = 
    note.flags | 
    Notification.FLAG_FOREGROUND_SERVICE | 
    Notification.FLAG_NO_CLEAR | 
    Notification.FLAG_ONGOING_EVENT; 

note.setLatestEventInfo(this, "", episodeName, pendingIntent); 

note.contentView = 
    new RemoteViews(
     getApplicationContext().getPackageName(), 
     R.layout.episode_player_note); 
note.contentView.setImageViewResource(
    R.id.player_note_icon, 
    R.drawable.ic_notification_bcn); 
note.contentView.setTextViewText(
    R.id.player_note_text, 
    episodeName); 
note.contentView.setProgressBar(
    R.id.player_note_progress, 100, 0, false); 

noteManager.notify(MEDIA_PLAYER_NOTIFY_ID, note); 

這工作得很好。當用戶切換播放其他內容時(通過活動的用戶界面),服務會更新通知(使用上述相同方式)更改名稱並重新設置進度欄。這工作得很好。隨着媒體的進展,通知更新中的進度條也會起作用。

但是當媒體結束或用戶想要停止,該服務將嘗試取消的通知與

noteManager.cancel(MEDIA_PLAYER_NOTIFY_ID); 

但這被忽略。在DDMS日誌中沒有錯誤,但是從我的跟蹤中我確實知道取消正在被調用。我已經嘗試在取消通知之前取消PendingIntent,但這沒有任何區別。我也嘗試用「空白」替換通知 - 清除進度和名稱 - 然後取消。新的「已清除」通知顯示,但仍然不會取消。

那麼我在這裏錯過了什麼?是否還有其他需要完成的操作來取消我缺少的FOREGROUND或NO_CLEAR或ONGOING通知?我已經用2.1和2.2下的Emulator和2.3下的我的硬件試過了,所有這些都表現出完全相同的行爲。

+0

我擺脫FLAG_FOREGROUND_SERVICE'的',或者嘗試通過使用擺脫'Notification'的'stopForeground ()'。 – CommonsWare

+0

刪除FLAG_FOREGROUND_SERVICE標誌允許我取消通知。很好,謝謝! – Jim

回答

0

我注意到了同樣的問題。

如果通知標誌中包含「Notification.FLAG_FOREGROUND_SERVICE」,則唯一擺脫它的方法是調用「stopForeground()」,但有一個問題。如果「startForeground()」沒有被調用,那麼「stopForeground()」將不會刪除通知(帶有FLAG_FOREGROUND_SERVICE)!簡而言之,如果使用FLAG_FOREGROUND_SERVICE,則必須調用「startForeground()」和「stopForeground()」!

如果使用「startForeground()」,我沒有看到將FLAG_FOREGROUND_SERVICE放入其他通知的原因。但是,如果需要的話,這裏是一個樣本(在公共Class類用於擴展服務):

public int onStartCommand(Intent intent, int flags, int startId) { 

    PendingIntent notifIntent; 
    Intent notificationIntent = new Intent(); // fill up yourself 
    notifIntent = PendingIntent.getActivity(); // fill up yourself 

    Notification note = new Notification(); // fill up yourself 
    note.setLatestEventInfo(context, getString(R.string.app_name), Message, notifIntent); 

    startForeground(yourOwnNumber, note); // fill up yourself 

    displayYourNotification(); 

    // Fill up the rest yourself. 
} 


public void onDestroy() { 
    stopForeground(); // fill up yourself 
} 


public void displayYourNotification() { 
    Intent notificationIntent = new Intent(); // fill up yourself 
    notifIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

    Notification note = new Notification(); // fill up yourself 
    note.flags = Notification.FLAG_FOREGROUND_SERVICE; 
    note.setLatestEventInfo(context, TITLE, Message, notifIntent); 
    notifManager.notify(ID, note); 
}