单击推送通知时如何做一些逻辑

时间:2017-07-13 10:56:51

标签: java android firebase push-notification firebase-cloud-messaging

当管理员从控制面板激活用户帐户时,我的应用程序会收到FCM通知,我想从一个方法做一些操作,比如吐司或当用户点击推送通知时从我的数据库中删除一些数据。!

这可能吗?

这是FirebaseMessagingService class

中的代码
public class CustomFirebaseMessagingService extends FirebaseMessagingService {

  public static String INTENT_FILTER = "INTENT_FILTER";

  @Override
  public void onMessageReceived(RemoteMessage remoteMessage) {

    try {

      if (remoteMessage.getNotification() != null) {

        Intent intent = new Intent(INTENT_FILTER);
        sendNotification(remoteMessage.getNotification().getBody(), intent);
        sendBroadcast(intent);
      }
    } catch (Exception ex) {
    }
    }


    private void sendNotification(String messageBody, Intent intent) {

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
        PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.logo)
        .setContentTitle("UPDATE")
        .setContentText(messageBody)
        .setAutoCancel(true)
        .setSound(defaultSoundUri)
        .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
  }
}

5 个答案:

答案 0 :(得分:1)

是的,你可以使用意图传递一些整数值 putextra用于活动和onCreate活动中的参考 class只需检查if条件并相应地进行更改。

答案 1 :(得分:1)

您需要在监听器中添加LocalBroadcastReceiver来处理您活动中的传入通知:

boolean isReceiverRegistered = false ; // to not create receiver twice

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mBroadcastReceiver = new MyBroadcastReceiver();
    registerReceiver();
    //code
 }

private class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            switch (action) {
                case YOUR_ACTION:
                    handleIncomingAction(intent);
                    break;
            }
        }
    }

private void registerReceiver() {
        if (!isReceiverRegistered) {
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(YOU_ACTION);
            LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(mBroadcastReceiver, intentFilter);
            isReceiverRegistered = true;
        }
    }

答案 2 :(得分:1)

逻辑是在intent中添加一个额外的参数,并在启动活动中检查onCreate方法

private void sendNotification(String messageBody, Intent intent) {
// set extra param
intent.putExtra("is_from_notification", true);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
    PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.logo)
    .setContentTitle("UPDATE")
    .setContentText(messageBody)
    .setAutoCancel(true)
    .setSound(defaultSoundUri)
    .setContentIntent(pendingIntent);

NotificationManager notificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

在您的活动中

 @override
 protected void onCreate(Bundle savedInstance) {
     super.onCreate(savedInstance);

     if (getIntent().getBooleanExtra("is_from_notification", false)) {
        // TODO: do whatever you want in here
     } 
 }

答案 3 :(得分:1)

要让应用在后台时可以点击通知,您需要在通知有效负载中使用click_action属性。这与FirebaseMessagingService和其他此类类完全分开,因为这些类在应用程序位于前台时起作用。

请查看Firebase文档的section

此外,当您定义click_action属性时,您还需要在要启动的活动的<action>中使用相应的<intent-filter>属性。

video以非常详细的方式解释了它。

但请注意,如果您要从Firebase控制台发送通知,则无法设置click__action属性。只有从自己的管理服务器或使用Firebase云功能发送通知时,才能执行此操作。

最后,在启动的活动中,您可以使用数据属性设置其他Data(也显示在我上面链接的同一文档中)。当您通过单击通知启动应用程序时,您可以使用getIntent()获取通知数据。查看this answer了解有关如何执行此操作的详细信息。

它非常简单而优雅。

<强>更新

例如,如果您的通知有效内容具有以下结构,

payload = {
  notification: {
    title: `You ordered a new product`,
    click_action : 'HANDLE_NOTIFICATION',

  },
  data : {
        product_id : 'ABC98292',
        type : `Clothes`,
        product_name : 'Cotton spring shirt'
    }
};

然后,将过滤器放在单击通知时要打开的活动的标记中。一个例子如下: -

<intent-filter>
    <action android:name="HANDLE_NOTIFICATION" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

然后,您可以使用getIntent().getStringsExtra("product_id")等来从通知中获取product_id。

这样,您就可以打开所需的活动,并可以使用从您的通知中获得的相关详细信息填充该活动。

答案 4 :(得分:1)

我建议你添加一个&#34;标志&#34;当您开始活动的意图时,要查看用户来自哪个活动,如下所示:

Intent intent = new Intent(NotificationActivity.this, SecondActivity.class);
intent.putExtra("call_from", "NotificationActivity");

并回来:

String fromActivity = (String) getIntent().getExtras().get("call_from");
if(fromActivity.equals(NotificationActivity.class.getSimpleName())) {
    //call your method to delete what you want
}

希望它有所帮助。