如何将意图发送到正在运行的服务或后台活动?

Posted

技术标签:

【中文标题】如何将意图发送到正在运行的服务或后台活动?【英文标题】:How to send intent to running service or background activity? 【发布时间】:2021-03-31 13:20:09 【问题描述】:

我现在正在 android 中开发一个音乐播放器,目前卡在通知中。我为上一个、播放/暂停和下一个的通知添加了三个操作。如果单击这些按钮,则每个操作都需要执行 PendingIntent。

我的应用目前正在构建,有一个 MainActivity 和一个 Service,用于播放加载的音频文件。 Main 活动通过对服务的引用进行通信,以执行下一首歌曲等操作。

我想通过通知上的操作实现的目的是将意图发送到服务本身,但不启动它或发送到 MainActivity,但如果它当前在后台,则不将其带回前台。这样服务可以自己控制该操作,或者让 MainActivity 调用适当的方法。

经过一些研究,我发现有些人使用广播接收器这样做,但据我了解,广播被发送到任何合适的应用程序,这是我绝对不想要的。我也找不到一些指向解决方案的文档或类似文件。

最好的方法是什么?

感谢任何帮助!

【问题讨论】:

【参考方案1】:

...但据我了解,广播会发送到任何合适的应用程序

如果您像在guide on creating a Notification 中那样为您的BroadcastReceiver 使用显式Intent,那么您可以确定没有其他组件将接收到广播(从那里复制代码sn-p):

Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0);
PendingIntent snoozePendingIntent =
        PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);

所以看起来这就是要走的路:让您的 BroadcastReceiver 实例决定应该控制您应用的哪个组件。

【讨论】:

虽然这个问题是活跃的,但我实际上发现了另一条信息,正是我需要的。您可以使用 PendingIntent 中的 getService 创建 startService Intent。如果服务已经在运行 startService 将不会创建新实例,而只是调用onStartCommand。现在我有一个执行意图的例程。 @vMysterion - 正确,我认为始终从通知启动服务是一个好主意 - 使用名为“播放”、“上一个”等的按钮迟早无论如何都会涉及服务(因为我猜 Activity 不会负责管理 MediaPlayer)。对于来自服务和活动的消息(如果它在前台),可以使用本地广播,例如更新任何播放按钮或“当前歌曲信息”。

以上是关于如何将意图发送到正在运行的服务或后台活动?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从通知发送到活动类而不重新启动意图

如何将数据从活动传递到正在运行的服务

将意图从服务发送到活动

服务或意图服务每5秒向服务器无休止地发送位置更新?

如何使用意图将哈希图值发送到另一个活动

使用意图向我的活动发送数据