在Android中单击或关闭通知时的通用侦听器

Ane*_*eez 12 android android-notifications

我想知道NotificationListenerService是否有一种方法可以知道是否已单击Notification或已将其解除.我可以看到NotificationListenerService中的Inner类NotificationListenerWrapper有一个onNotificationClick()方法,但由于NotificationListenerWrapper被@hide注释隐藏,我无法使用它.

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

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

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

谢谢

Adi*_*rzi 13

创建并显示通知时,您可以PendingIntent在单击(使用.setContentIntent)时提供for .你也可以定义一个PendingIntentfor何时被解雇(使用.setDeleteIntent(PendingIntent).

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

您可以在答案中看到完整的代码.


Vin*_*k B 7

我认为没有听众.但是您可以使用PendingIntent和以另一种方式实现此逻辑BroadcastReceiver

对于OnClick

添加ContentIntentBroadcastReceiver.因此,您将知道您的通知是否被点击了BroadcastReceiver

     Intent onClickIntent = new Intent(this, OnClickBroadcastReceiver.class);
     PendingIntent onClickPendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, onClickIntent, 0);
     mBuilder.setContentIntent(onClickPendingIntent);
Run Code Online (Sandbox Code Playgroud)

在里面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
    }

}
Run Code Online (Sandbox Code Playgroud)

对于onDismiss

为此,您需要DeleteIntent在通知构建器中添加一个

 Intent onCancelIntent = new Intent(this, OnCancelBroadcastReceiver.class);
            PendingIntent onDismissPendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, onCancelIntent, 0);
            mBuilder.setDeleteIntent(onDismissPendingIntent);
Run Code Online (Sandbox Code Playgroud)

而且BroadcastReceiver因为这是

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

}
Run Code Online (Sandbox Code Playgroud)

不要忘了这些注册BroadcastReceiverAndroidManifest

  • 您的PendingIntent用于FLAG_UPDATE_CURRENT.问题要求每个通知. (3认同)