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

Posted

技术标签:

【中文标题】点击android通知图标不会触发广播接收器【英文标题】:Click on android notification icon does not trigger broadcast receiver 【发布时间】:2017-07-13 06:52:56 【问题描述】:

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

我查看了这些线程,看起来这是完全可能的并且很常见。

android Notification Action is not fired (PendingIntent)

Send broadcast on notification click

但是我无法让它工作。我看到了通知,但是当我点击它时,它永远不会触发我的广播接收器。

这是我尝试过的:

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

    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】:

这似乎是问题:

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

您实际上是在为广播PendingIntent 创建一个显式Intent。显式Intents 不适用于动态注册的接收器,因为它们针对的是接收器类,而不是实例。

您需要改用隐式Intent,您可以通过使用String 操作而不是ContextClass 来简单地实例化Intent。例如:

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

请注意,如果您的应用进程在点击 Notification 之前被终止,动态注册的 Receiver 实例也会死亡,并且 Notification 的广播不会真正做任何事情。

根据所需的行为,最好在清单中静态注册您的 Receiver 类,并使用显式的Intent。这样做将允许您的应用接收Notification 广播,即使它的进程已被终止。

为此,您只需在清单中为您的NotificationOnClickReceiver 添加一个<receiver> 元素。

<receiver android:name="NotificationOnClickReceiver" />

尽管您仍然可以在该广播 Intent 上设置一个操作,但您不需要在此处使用 &lt;intent-filter&gt;,因为明确的 Intent 无论如何都直接针对该类。如果 Receiver 仅用于该一项功能,则您不一定需要该操作,并且可以完全删除它。

然后您可以删除第 2 步中的代码,因为您不再需要动态注册的实例。

【讨论】:

【参考方案2】:

要发送广播,请使用此sendBroadcast(new Intent("NotificationClicked"));

现在要接收广播,请在清单中的应用程序标签下提及这一点

<receiver android:name=".NotificationOnClickReceiver" >
            <intent-filter>
                <action android:name="NotificationClicked" >
                </action>
            </intent-filter>
        </receiver>

【讨论】:

以上是关于点击android通知图标不会触发广播接收器的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio - 无法使用广播接收器设置通知

Ionic/Cordova 应用程序不会在后台收到推送通知

未触发 Android 地理围栏广播接收器

要在 Android 上显示的自定义广播接收器块通知 - IBM mobilefirst

Android BroadcastReceiver详解

android 如何实现后台时用通知栏显示有新的消息,当在前台时不显示通知