当前位置:  开发笔记 > Android > 正文

通过通知进行广播不在服务中的BroadcastReceiver中处理

如何解决《通过通知进行广播不在服务中的BroadcastReceiver中处理》经验,为你挑选了1个好方法。

我正在尝试在音乐播放服务运行时构建通知,并使用通知使用广播机制与服务进行交互(播放,暂停,停止).

(我知道也有可能在通知中使用PendingIntent.getService()作为操作按钮,但我不喜欢这个想法,因为这会触发服务的onStartCommand(),我需要解析和分析Intent对象采取行动,看起来不像BroadcastReceiver那样干净,如下所述.

让我们用一些(截断的)代码来说明我们到目前为止所拥有的内容.

    我们在服务生命周期内创建Notification对象,添加操作按钮,并使用显示通知startForeground().

    ...
    Intent i = new Intent(getBaseContext(), PlayerService.class);
    PendingIntent piStop = PendingIntent.getBroadcast(getBaseContext(), 1, i, PendingIntent.FLAG_ONE_SHOT);
    NotificationCompat.Action actionStopPlayback = new NotificationCompat.Action(R.drawable.ic_stop_white_36dp, "Stop playback", piStop);
    notification.addAction(actionStopPlayback);
    ...
    

    然后我们在服务的onCreate()注册一个BroadcastReceiver(当然在onDestroy中取消注册它;这是一个更简化的例子).

    IntentFilter intentFilter = new IntentFilter();
    registerReceiver(new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             Log.d(getClass().toString(), "Broadcast received");
         }
    }, intentFilter);
    

最后的结果是接收器的onReceive()永远不会被调用.该服务是连续的,并且在通知操作发送广播时处于活动状态.由于我的性质无法调试广播,我在这里被封锁了.



1> Mike M...:

您正在Intent为以下内容创建此明确的PendingIntent:

Intent i = new Intent(getBaseContext(), PlayerService.class);

由于几个原因,这不起作用.显式Intents - 为特定目标类创建的 - 不适用于动态注册的Receiver实例.此外,这是针对错误的类.Intent具有Service类目标的广播将彻底失败.A getBroadcast() PendingIntent需要一个BroadcastReceiver类作为目标.

使用您当前的设置 - 动态注册的Receiver实例 - 您将需要使用隐式Intent; 即,一个Intent有动作String,而不是一个目标类.例如:

Intent i = new Intent("com.hasmobi.action.STOP_PLAYBACK");

然后,您可以使用该动作StringIntentFilter你使用注册的接收器.

IntentFilter intentFilter = new IntentFilter("com.hasmobi.action.STOP_PLAYBACK");

请注意,IntentFilter可以有多个操作,因此您可以注册一个Receiver来处理多个不同的操作.


或者,您可以坚持使用显式Intent,并BroadcastReceiver在清单中静态注册一个类.例如:

public class NotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}

在清单中:


然后你Intent会类似于:

Intent i = new Intent(PlayerService.this, NotificationReceiver.class);

但是,这需要一个额外的步骤,因为您需要以某种方式将广播信息传递NotificationReceiverService; 例如,使用事件总线LocalBroadcastManager


哇我一直试图弄清楚这几个小时,隐含的意图正是我想要的,谢谢!
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有