如何编写从pendingIntent.getActivity中获取额外内容的BroadcastReceiver

问题描述 投票:0回答:1

我有一个带有操作按钮的通知。如果单击该操作,它将在我的应用程序中打开一个特定视图,并且通知将自行消失。我知道要在通知单击时关闭通知,我可以简单地 setAutoCancel(true) ,它就会起作用。但是,由于操作是通过NotificationCompat.Builder().addAction添加的,如果没有适当的notificationManager.cancel(id),通知不会自行消失,所以我尝试在意图中添加额外的内容来传递通知id,但现在没有任何东西可以正常工作在那之后。现在,如果最小化,操作会将应用程序带到前台,如果它已经在前台(而不是我的目的地)并且接收器似乎没有收到任何内容,则不执行任何操作。

这是我在NotificationPublisher.kt中的代码

val intent = Intent(Intent.ACTION_VIEW).apply {
                    //a uri to destination fragment
                    data = intents.getDestination()
                    flags = Intent.FLAG_ACTIVITY_NEW_TASK

                }
                intent.putExtra("notification_id", idHashCode)
                val pendingIntent = PendingIntent.getActivity(context,idHashCode,intent,PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
return NotificationCompat.Builder(context,CHANNEL)
            .setSmallIcon(R.drawable.notification_icon)
            .setContentTitle(title)
            .setContentText(subTitle)
            .setDefaults(Notification.DEFAULT_ALL)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setVibrate(LongArray(2) { 1000 })
            .setNumber(1)
            .setOnlyAlertOnce(true)
            .setStyle(NotificationCompat.BigTextStyle())
            .setAutoCancel(true)
            .addAction(0,getActionTextWithColor(context, R.string.go_to_destination, R.color.primary), pendingIntent)

NotificationReceiver.kt

class NotificationReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val id = intent.getIntExtra("notification_id", -1)
        if(id > 0){

            val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            manager.cancel(id)
        }
    }

}

AndroidManifest

<receiver android:name="com.myApp.notification.NotificationReceiver"
            android:exported="false"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <data
                    android:host="myApp.com"
                    android:pathPrefix="/destination"
                    android:scheme="myApp" />
            </intent-filter>
        </receiver>

我对如何完成这项工作有什么想法吗?或者如果这没有意义(我对 Android 没有太多经验),我可以尝试另一种方法吗?

我尝试在NotificationCompat.Builder中添加额外的内容,但这也不起作用 也许我可以调用 manger.cancelAll() 来删除所有通知,但这似乎是一个非常绝望的尝试,我觉得必须有一种聪明/正确的方法来做到这一点

kotlin android-intent notifications android-pendingintent intentfilter
1个回答
0
投票

PendingIntent.getActivity
将设置为使用
startActivity()
传递所附的
Intent

如果你真的想去

BroadcastReceiver
,你需要使用
PendingIntent.getBroadcast()

如果您确实想将

Activity
带到前台,则应该在
<intent-filter>
上注册
Activity
。然后,您可以通过查看
Intent
中的
intent
属性从
Activity.onCreate()
获取数据。

© www.soinside.com 2019 - 2024. All rights reserved.