0

我有一个将接收推送通知的 Android 应用程序。通知具有可穿戴支持,因此通知也将在带有操作按钮的 Android 穿戴中可见。

我希望onMessageReceivedFirebaseMessagingService课堂上收到通知时传递数据。尝试在 Intent 中设置数据并通过 Pending Intent 传递。

val intent = Intent(this, MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        intent.data = Uri.parse("12345")
        intent.putExtra("user_id", "USER ID")
        intent.putExtra("date", "DATE")
        val pendingIntent = PendingIntent.getActivity(
            applicationContext,
            System.currentTimeMillis().toInt() , intent,
            0
        )
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationChannel =
                NotificationChannel(CHANNEL_ID,
                    CHANNEL_NAME,
                    CHANNEL_IMPORTANCE)
            val notificationManager =
                this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(notificationChannel)

            val notificationBuilder =  NotificationCompat.Builder(this,CHANNEL_ID)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(body)
                .setAutoCancel(true)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent)
                .extend(NotificationCompat.WearableExtender()
                    .addAction(NotificationCompat.Action(R.drawable.icon,
                        "Explore",
                        pendingIntent))
                )
            notificationManager.notify(0, notificationBuilder.build())
        }

当点击来自 Wear 的通知时,捕获 IntentonNewIntent以获取传递的数据。但是找不到通过的数据。

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    setIntent(intent)
    // intent.getStringExtra("date")
    // intent.extras.getString("date")
    // intent.extras.get("date")
    // intent.data
}

无法获取数据。有什么方法可以通过待处理的意图来传递意图?或者如何获取通过 Pending Intent 传递的值。

4

1 回答 1

0

我的假设是onNewIntent()没有被调用。

如果您指定FLAG_ACTIVITY_CLEAR_TOP并且您的应用程序已经在运行并且MainActivity任务堆栈中有一个实例,Android 将删除现有实例MainActivity并创建一个新实例。然后Intent将传递带有“附加”的onCreate()并且onNewIntent()不会被调用。

如果您的应用程序没有运行,点击通知将启动您的应用程序并创建一个新实例,MainActivity并且Intent带有“附加”的 将被传递onCreate()并且onNewIntent()不会被调用。

此外,由于Intent您输入的PendingIntent将被 Android 用于Activity从非Activity上下文启动一个,因此您需要指定Intent.FLAG_ACTIVITY_NEW_TASK.

此外,您应该始终指定FLAG_UPDATE_CURRENT何时获取PendingIntent带有“附加”的 a,因为如果您不这样做,您可能会得到一个PendingIntent带有一些旧“附加”或可能根本没有的现有。即使它已经存在,使用FLAG_UPDATE_CURRENT将确保您的Intent“附加”被复制到。PendingIntent像这样:

val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                    Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.data = Uri.parse("12345")
    intent.putExtra("user_id", "USER ID")
    intent.putExtra("date", "DATE")

val pendingIntent = PendingIntent.getActivity(
        applicationContext,
        System.currentTimeMillis().toInt() , intent,
        PendingIntent.FLAG_UPDATE_CURRENT
    )
于 2021-04-21T20:18:52.640 回答