当前位置: 首页 > 知识库问答 >
问题:

点击android通知图标不会触发广播接收器

马琛
2023-03-14

我有一个应用程序与推送通知挂钩。当用户点击通知时,我希望一个广播接收器被触发,而不是一个活动。

我看了这些线程,看起来这是完全可能和常见的。

Android通知动作未触发(PendingIntent)

>

  • 我创建了一个自定义接收器:

    public class NotificationOnClickReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(final Context context, Intent intent) {
            Log.d(Constants.Engine.LOGGER_TAG_GCM,
                    NotificationOnClickReceiver.class.toString() + " triggered");
        }
    }
    

    我在全局应用程序上动态注册了这个接收器(而不是活动)

    mNotificationOnClickReceiver = new NotificationOnClickReceiver();
    IntentFilter intentFilterOnClick = new IntentFilter(Constants.Engine.BROADCAST_RECEIVER_FILTER_NOTIFICATION_ONCLICK);
    getApplicationContext().registerReceiver(mNotificationOnClickReceiver, intentFilterOnClick);
    Log.e(Constants.Engine.LOGGER_TAG_DBG, "mNotificationOnClickReceiver = " + mNotificationOnClickReceiver.toString());
    

    过滤器只是一个字符串常量(我想知道这是不是问题所在)

        public static final String BROADCAST_RECEIVER_FILTER_NOTIFICATION_ONCLICK = "push_notification.onclick";
    
    // When the user taps on the notification bar, this is the receiver that I want to be called
    Intent pushNotificationIntent;
    Log.e(Constants.Engine.LOGGER_TAG_DBG, "Notification called!");
    pushNotificationIntent = new Intent(this, NotificationOnClickReceiver.class);
    // Not sure if this causing the problem
    pushNotificationIntent.setAction(Constants.Engine.BROADCAST_RECEIVER_FILTER_NOTIFICATION_ONCLICK);
    // ensures that each notification and intent are unique
    int uniqueCode = new Random().nextInt(Integer.MAX_VALUE);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            context,
            uniqueCode,
            pushNotificationIntent, // Receiver Intent
            PendingIntent.FLAG_CANCEL_CURRENT);
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(mIconId)
            .setContentTitle(context.getString(R.string.myString))
            .setContentText("My GCM Alert!")
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);
    
    02-22 15:47:47.092 16863-16863/com.myapp.test E/MYAPP_DBG: mNotificationOnClickReceiver = mytest.broadcastreceivers.NotificationOnClickReceiver@d78f559
    02-22 15:47:53.312 16863-17038/com.myapp.test E/MYAPP_DBG: Notification called!
    
  • 共有1个答案

    叶鹭洋
    2023-03-14

    这似乎是问题所在:

    pushNotificationIntent = new Intent(this, NotificationOnClickReceiver.class);
    

    您实际上是在为广播pendingintent创建显式的intent。显式intent不适用于动态注册的接收者,因为它们针对的是接收者类,而不是实例。

    您将需要使用隐式的intent,而不是使用context,只需使用操作字符串实例化intent即可。例如:

    pushNotificationIntent = new Intent(Constants.Engine.BROADCAST_RECEIVER_FILTER_NOTIFICATION_ONCLICK);
    

    请注意,如果您的应用程序的进程在通知被单击之前被终止,那么动态注册的接收者实例也将死亡,通知的广播将不会真正执行任何操作。

    根据所需的行为,最好是在清单中静态注册接收器类,并保持显式的意图。这样做将允许应用程序接收通知广播,即使其进程已被终止。

    为此,只需在清单中为NotificationOnClickReceiver添加 元素。

    <receiver android:name="NotificationOnClickReceiver" />
    
     类似资料:
    • 如果触发了多个通知,那么由于NOTIFICATION_ID是相同的,所以它不会更新。 有没有办法知道有多少通知被激发了?以便我可以相应地更新我的通知。 我不想单独发出通知。我想更新现有的通知。在这里,我只需要计算出在触发通知时已经触发的通知数。当用户点击它时,该号码应该重置。

    • 如何指定用户点击通知包时要使用的意图?

    • 在AndroidManifest中。xml我有一个: 我的广播文件: 我试图运行应用程序后关闭它在后台播放音乐。

    • 我有一个很奇怪的问题。 我正在发送广播并设置一些额外内容,但接收者没有收到: 发送: 并收到: 由于某些原因,downloadID为空。有什么提示吗? 谢谢

    • 问题内容: 我正在尝试开发一个可检测用户何时拍照的应用程序。我设置了广播接收器类,并通过以下方式将其注册到清单文件中: 无论我做什么,该程序都不会收到广播。这是我的接收器类: 如果删除清单和活动中的mimeType行,则使用以下命令发送自己的广播 然后我成功接收到广播,可以看到日志和吐司窗口​​。我是否采用正确的方法?有什么需要补充的吗? 问题答案: 我解决了这个问题,但是使用了另一种方法。我没有

    • 问题内容: 有人可以解释和之间的确切区别吗? 在什么情况下我们必须使用每个Receiver类? 问题答案: 和之间只有一个区别。 当您收到内部广播方法时, 假设, BroadcastReceiver : 它 不保证 该 CPU将保持清醒 ,如果你启动一些长时间运行的进程。CPU可能会立即回到睡眠状态。 WakefulBroadcastReceiver : 这是 保证 该 CPU将保持清醒 ,直到你