所以我正在研究一个简单的音乐播放器。音乐播放器命名状态,可播放歌曲,暂停播放,转发到下一首歌曲,返回上一首歌曲,并完全停止播放。播放歌曲时,会显示艺术家姓名和歌曲名称的通知;此通知还有三个按钮(操作):停止,暂停下一个。
我遇到的问题是确保在单击任一操作时触发与操作相关的播放控件,而且我完全不知道如何执行此操作。我搜索了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);
你们知道我还能尝试什么吗?使用我上面解释的内容什么都没做,通知显示,并有三个操作按钮,但点击它们对我没有任何作用。
有一次,我想如果我添加了带有动作名称的intent过滤器,但是我想,好吧,它们都在同一名称空间中,我为什么要这样做?
答案 0 :(得分:45)
我使用广播解决了这个问题。例如,要发送前进到下一首歌曲的广播,您可以使用以下内容:
Intent nextIntent = new Intent(KEY_NEXT);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0);
然后,在BroadcastReceiver
:
Activity
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
实例存储在某处,以便在活动或服务关闭时取消注册。