28

因此,我正在製作一個簡單的音樂播放器。音樂播放器可以播放歌曲,暫停播放,前進到下一首歌曲,返回前一首歌曲並完全停止播放。當您播放歌曲時,會顯示一個包含藝術家姓名和歌曲名稱的通知;此通知也有三個按鈕(操作):停止,暫停下一個。如何使用通知中的操作而無需啓動活動

我遇到的問題是確保在單擊任一動作時觸發與動作相關的播放控制,以及我完全不知道如何做到這一點。我搜索了Android通知:http://developer.android.com/guide/topics/ui/notifiers/notifications.html,但它沒有澄清或致力於有關通知操作的太多信息。

這裏是例如一個簡單的動作(這應該與通知上的「下一步」按鈕,點擊相關的:注:下面描述的所有後面的包裝下編寫的代碼的:com.deadpixels.light .player和活動被稱爲:PlayerActivity

public void nextSong() { 
    if (position == songs.size() -1) { 
     Toast.makeText(this, "No more songs on queue", Toast.LENGTH_SHORT).show(); 
     if(mPlayer.isPlaying()) { 
      return; 
     } 
     else { 
      buttonPlay.setImageResource(R.drawable.button_play); 
     } 
     return; 
    } 
    else { 
     position++; 
     playSong(songs.get(position)); 
    } 
} 

這裏是我試圖做的:

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = createPendingResult(0, nextIntent, 0); 

凡在NextIntent的動作是:

public static final String KEY_NEXT = "com.deadpixels.light.player.PlayerActivity.nextSong"; 

,然後我通過的addAction()添加到通知:

mBuilder.addAction(R.drawable.not_action_next, "Next", nextPendingIntent); 

你們是否知道還有什麼我可以試試嗎?使用我上面解釋的什麼都沒有,通知顯示出來,並且有三個動作按鈕,但點擊它們對我沒有任何幫助。

有一次,我想也許如果我添加了動作名稱的意圖過濾器,但後來我想,他們都在同一個命名空間,我爲什麼要?

回答

43

我已經使用廣播解決了這個問題。例如,要發送前進到下一首歌曲的廣播,你可以使用以下命令:

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0); 

然後,你Activity內註冊一個BroadcastReceiver

IntentFilter filter = new IntentFilter(); 
filter.addAction(KEY_NEXT); 
// Add other actions as needed 

receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(KEY_NEXT)) { 
      nextSong(); 
     } else if (...) { 
      ... 
     } 
     ... 
    } 
} 

registerReceiver(receiver, filter); 

如果您使用的是服務要管理後臺播放,那麼您需要在服務中註冊BroadcastReceiver而不是活動。請務必將receiver實例存儲在某個位置,以便在活動或服務關閉時取消註冊。

+1

一定要存儲接收器實例..商店在哪裏? –

+0

@anonymous在您的活動或服務中保留對其的引用。 – acj

+1

爲什麼不在清單中註冊BroadcastReceiver並使其成爲獨立的類? – streamride