如何在不启动 Activity 的情况下使用通知中的操作

Posted

技术标签:

【中文标题】如何在不启动 Activity 的情况下使用通知中的操作【英文标题】:How to use Actions from Notification without starting Activity 【发布时间】:2012-10-31 22:31:03 【问题描述】:

所以我正在开发一个简单的音乐播放器。顾名思义,音乐播放器可以播放歌曲、暂停播放、前进到下一首歌曲、返回上一首歌曲以及完全停止播放。播放歌曲时,会显示艺术家姓名和歌曲名称的通知;此通知还具有三个按钮(操作):停止、暂停和下一步。

我遇到的问题是确保单击任一操作时,都会触发与该操作相关的播放控件,而且,我完全不知道该怎么做。我搜索了 android 通知:http://developer.android.com/guide/topics/ui/notifiers/notifications.html,但它没有澄清或提供太多关于通知操作的信息。

这里是一个简单的动作示例(应该与点击通知的“下一步”按钮相关联:注意:下面描述的所有代码都写在以下包下:com.deadpixels.light.player 并且 Activity 被称为: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);

你们知道我还能尝试什么吗?使用我上面解释的内容根本没有任何作用,会显示通知,并具有三个操作按钮,但单击它们对我没有任何作用。

有一次我想如果我添加带有动作名称的意图过滤器,但后来我想,好吧,它们都在同一个命名空间上,我为什么要这样做?

【问题讨论】:

【参考方案1】:

我已经使用广播解决了这个问题。例如,要发送前进到下一首歌曲的广播,您可以使用以下命令:

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 实例存储在某处,以便在活动或服务关闭时取消注册。

【讨论】:

一定要存储receiver实例..存储在哪里? @anonymous 在您的活动或服务中保留对它的引用。 为什么不在清单中注册 BroadcastReceiver 并作为单独的类? @streamride 你可以这样做。不过,有时对它们的生命周期进行细粒度控制是有用的。例如,在这个问题的上下文中,您可能只想在使用特定活动时收听广播。 注销接收器(广播接收器);对于懒惰的人:P

以上是关于如何在不启动 Activity 的情况下使用通知中的操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在不关闭先前活动的情况下从通知中打开对话框样式的活动?

收到 FCM 通知时如何在不点击通知的情况下打开(启动)应用程序

如何在不调用该 Activity 的 API 调用的情况下为横向和纵向模式使用不同的设计?

在不显示选择器的情况下启动 Native Camera

通知意图 - 如何在不重置的情况下恢复通知中的活动?

想要在不刷新 Activity 的情况下更新 Android 中的 Listview