在Android

时间:2017-03-01 09:00:29

标签: android android-notifications

我想知道NotificationListenerService是否有办法知道是否已点击通知或已取消通知。我可以看到NotificationListenerService中的Inner类NotificationListenerWrapper有一个onNotificationClick()方法,但由于NotificationListenerWrapper被@hide注释隐藏,我无法使用它。

我的问题是我是否可以编写一个监听器,它基本上可以跟踪通知是否已被点击或解除。

基本上我想跟踪我的应用程序的通知是否被解雇,或者是否在每个通知中都没有任何侵入性代码而被点击。

P.S。 NotificationListenerService仅提供onNotificationPosted()和onNotificationRemoved(),但我的要求是知道是否单击或删除了通知。

由于

2 个答案:

答案 0 :(得分:12)

当您创建并显示通知时,您会在点击它时使用PendingIntent(使用.setContentIntent)。您还可以定义PendingIntent何时被解雇(使用.setDeleteIntent(PendingIntent)

如果您希望能够跟踪通知,则需要传递PendingIntent(如BroadcastReceiver或IntentService)并传递一些参数,如notificationId和isDismissed,并在BroadcastReceiver中完成您的工作。

您可以在this回答中看到完整的代码。

答案 1 :(得分:7)

我不认为有这样的倾听者。但您可以使用PendingIntentBroadcastReceiver

以另一种方式实现此逻辑

适用于OnClick

添加ContentIntentBroadcastReceiver。因此,您会知道BroadcastReceiver

中是否点击了您的通知
     Intent onClickIntent = new Intent(this, OnClickBroadcastReceiver.class);
     PendingIntent onClickPendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, onClickIntent, 0);
     mBuilder.setContentIntent(onClickPendingIntent);

BroadcastReceiver内你可以写出你的逻辑

 public class OnClickBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
       //Open your activity here
        Intent mainIntent = new Intent(context, YourActivity.class);
        context.startActivity(mainIntent);

        // Do your onClick related logic here
    }

}

for onDismiss

为此,您需要在通知构建器

中添加DeleteIntent
 Intent onCancelIntent = new Intent(this, OnCancelBroadcastReceiver.class);
            PendingIntent onDismissPendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, onCancelIntent, 0);
            mBuilder.setDeleteIntent(onDismissPendingIntent);

BroadcastReceiver就是

    public class OnCancelBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    //Do your logic here
    }

}

请勿忘记将这些BroadcastReceiver注册到AndroidManifest