Android 如何监听任何活动上的firebase通知

Android 如何监听任何活动上的firebase通知,android,notifications,Android,Notifications,我已经按照几个教程将通知从firebase发送到Android应用程序,我能够毫无问题地接收通知 我试图理解两件事: 当用户查看未处理通知的活动时,如何处理通知的接收 当应用程序正在运行但不在前台时,我收到一个通知,当我从系统托盘中单击它时,应用程序打开已定义广播者的活动-我如何控制打开的活动 下面是处理通知的活动的代码 public class DisplayNotificationActivity extends AppCompatActivity { private Broadca

我已经按照几个教程将通知从firebase发送到Android应用程序,我能够毫无问题地接收通知

我试图理解两件事:

  • 当用户查看未处理通知的活动时,如何处理通知的接收

  • 当应用程序正在运行但不在前台时,我收到一个通知,当我从系统托盘中单击它时,应用程序打开已定义广播者的活动-我如何控制打开的活动

  • 下面是处理通知的活动的代码

    public class DisplayNotificationActivity extends AppCompatActivity {
        private BroadcastReceiver mRegistrationBroadcastReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_display_notification);
    
            mRegistrationBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // checking for type intent filter
                if (intent.getAction().equals(Config.REGISTRATION_COMPLETE)) {
                    // gcm successfully registered
                    // now subscribe to `global` topic to receive app wide notifications
                    FirebaseMessaging.getInstance().subscribeToTopic(Config.TOPIC_GLOBAL);
                } else if (intent.getAction().equals(Config.PUSH_NOTIFICATION)) {
                    // new push notification is received
                    String message = intent.getStringExtra("message");
                    Toast.makeText(getApplicationContext(), "Push notification: " + message, Toast.LENGTH_LONG).show();
                    txtMessage.setText(message);
                }
            }
        };
    
    如果您需要查看代码的其他部分,请告诉我

    当用户查看未处理通知的活动时,如何处理通知的接收

    我会尽量把它缩短。当您的应用程序位于前台时,会在您实现的
    FirebaseMessagingService
    onMessageReceived()
    方法中接收通知。现在,您应该向哪个活动广播该事件?创建一个基本活动类,并使您的所有活动扩展它。在BaseActivity中,您可以使用广播方法或尝试使用一些
    Eventbus
    库,如我所做的:

    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onNotificationReceived(NotificationReceieveBean bean){
    
     if(bean != null){
    
           ViewUtils.showJobOfferSnackBar(this, bean.map);
    
           EventBus.getDefault().removeStickyEvent(bean);
        }
    
    
    
    }
    
    扩展基本活动的任何活动都将能够接收通知事件。你可以据此处理

    当应用程序正在运行但不在前台时,我收到一个通知,当我从系统托盘中单击它时,应用程序打开已定义广播者的活动-我如何控制打开的活动

    通常,当您单击系统生成的通知时,您的第一个活动就会打开。在onCreate()示例中,您必须检查
    捆绑包中的数据
    实例的密钥与从服务器发送的密钥相同:

    **编辑**

    public abstract class BaseNotificationHandlerActivity extends AppCompatActivity {
    
     protected int activityFlag = 0; // set a unique value from each extending Activity
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    }
    
     @Override
     public void onStart(){
      super.onStart();
      EventBus.getDefault().register(this);
    }
    
      @Override
      public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
     }
    
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(NotificationItem notif) {
      if(activityFlag == 1){ 
       // this means Starting Activity, so handle for it particularly
           NotificationHelper notifHelper = new NotificationHelper(this);
           notifHelper.AddNotificationItem(notif);
       }
      else if(activityFlag ==2){
        // for some other Activity
        }
    
      }
    }
    
    
    public class StartingActivity extends BaseNotificationHandlerActivity {
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_starting);
      activityFlag = 1; // add unique flag for Activity here
    }
    
     @Override
     public void onResume() {
     super.onResume();
    }
    

    好的-关于问题1,对于某些活动,我如何以不同的方式处理通知的接收?@andrewb,只需在BaseActivity中创建一个处理通知的方法,如果实现活动希望以不同的方式处理通知,则应覆盖该方法:)您提到BaseActivit,y,在我的例子中,这是DisplayNotificationActivity吗?在我的回答中,我已经解释了BaseActivity的目的和用法。你所有的活动都应该扩展它。您可以为它命名任何您想要的名称。我正在尝试扩展它,但当我这样做时,广播侦听器不会收到通知
    public abstract class BaseNotificationHandlerActivity extends AppCompatActivity {
    
     protected int activityFlag = 0; // set a unique value from each extending Activity
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    }
    
     @Override
     public void onStart(){
      super.onStart();
      EventBus.getDefault().register(this);
    }
    
      @Override
      public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
     }
    
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(NotificationItem notif) {
      if(activityFlag == 1){ 
       // this means Starting Activity, so handle for it particularly
           NotificationHelper notifHelper = new NotificationHelper(this);
           notifHelper.AddNotificationItem(notif);
       }
      else if(activityFlag ==2){
        // for some other Activity
        }
    
      }
    }
    
    
    public class StartingActivity extends BaseNotificationHandlerActivity {
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_starting);
      activityFlag = 1; // add unique flag for Activity here
    }
    
     @Override
     public void onResume() {
     super.onResume();
    }