android - 安卓:如何通过通知操作向服务发送广播意图?
问题描述
我正在尝试从 Android 上的通知操作中发送广播意图,但在这里有点迷失了。
我有一个 android 服务,它从活动/片段接收广播意图并做出相应的反应,它工作正常,但我不知道从通知操作中发送一个。
服务看起来像这样。
class MyService : Service() {
override fun onCreate() {
super.onCreate()
LocalBroadcastManager.getInstance(this).registerReceiver(mIntentActionBroadcastReceiver, IntentFilter(SERVICE_BROADCAST_INTENT))
val broadcastIntentFilter = IntentFilter()
broadcastIntentFilter.addAction(SERVICE_BROADCAST_KEY)
registerReceiver(mIntentActionBroadcastReceiver, broadcastIntentFilter)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// onStart
}
private val mIntentActionBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// do something
}
}
}
现在我有通知通道,用户在其中执行某些操作,它看起来像这样。
val notificationBuilder = NotificationCompat.Builder(context, PRIMARY_CHANNEL)
.addAction(getCustomAction(context))
private fun getCustomAction(context: Context): NotificationCompat.Action {
val actionIntent = Intent(context, MyService::class.java).apply {
action = NOTIFICATION_ACTION_CUSTOM
}
val pendingIntent = PendingIntent.getService(context, 0, actionIntent, 0)
return NotificationCompat.Action(R.drawable.ic_custom_48dp, "", pendingIntent)
}
当用户单击通知中的操作时,似乎又重新调用了 MyService onStartCommand,因此我的服务的某些状态被搞砸了。
相反,是否可以从服务中发送广播意图getCustomAction()
并在服务中接收它并对其进行处理?
这样的事情可能在内部发生getCustomAction()
吗?
val intent = Intent(SERVICE_BROADCAST_INTENT)
intent.putExtra(SERVICE_BROADCAST_KEY, NOTIFICATION_ACTION_CUSTOM)
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
解决方案
是否可以从 getCustomAction() 发送广播意图并在服务中接收它并对其进行处理?
您可以让服务注册一个系统广播接收器(registerReceiver()
on Context
),然后向它发送一个系统广播(sendBroadcast()
on Context
),PendingIntent.getBroadcast()
用于创建PendingIntent
.
或者,修复服务以解决“因此我的服务的某些状态被搞砸了”的问题。
在 getCustomAction() 中可能会发生这样的事情吗?
不,因为发件人是另一个进程,而不是你的。LocalBroadcastManager
仅在您自己的过程中有效。
推荐阅读
- sql - 使用 group by 在 Athena 中计算 Mode()
- git - 如何处理“此分支提前 n 次提交,开发后 m 次提交”?
- javascript - 未捕获(承诺中) FirebaseError:缺少权限或权限不足。在新 Rr
- google-apps-script - 将数据输入 Google 表格后以表格形式显示
- javascript - 为什么减去天数不允许我超过 27
- f# - Thoth.Json 得到结果
- javascript - AG Grid表数据复制到剪贴板在反应中不起作用
- javascript - Emitted Event 无法导致调用绑定方法
- java - Java toEquals() 覆盖以包含父类属性
- elixir - 比较 Phoenix 控制器内 Ecto 查询中的字符串 DateTime 参数