从 FirebaseMessagingService 类调用活动类方法

Posted

技术标签:

【中文标题】从 FirebaseMessagingService 类调用活动类方法【英文标题】:Calling activity class method from FirebaseMessagingService class 【发布时间】:2016-12-11 09:34:45 【问题描述】:

如何从 fcm 服务调用活动类方法。

我已经尝试过这种方式Calling activity class method from Service class

但是在 fcm 服务中onBind 方法是最终的,所以我们不能覆盖,所以任何其他方式都可以从 fcm 服务调用活动类方法。

参考一些代码如何实现fcm。

public class FCMListenerService extends FirebaseMessagingService 
 @Override
    public void onMessageReceived(RemoteMessage message) 
   

当我的活动正在运行并收到 fcm 通知时,我想更新代码吗?有没有办法处理这个要求?

【问题讨论】:

什么时候想从FCMListenerService开始Activity? 当我们捕获 fcm 监听器时,我不想启动活动,如果活动正在运行并且 fcm 来了,那么我想更新 gui, 是的 ***.com/users/1844392/piyush-gupta 但如何? Calling activity class method from Service class的可能重复 【参考方案1】:

我认为您必须尝试使用​​ BroadcastReceiver。这是您从 FCMListenerService 发送消息的方式:

  public class FCMListenerService extends FirebaseMessagingService 

        public static final String INTENT_FILTER = "INTENT_FILTER";
         @Override
         public void onMessageReceived(RemoteMessage message) 
              Intent intent = new Intent(INTENT_FILTER);
              sendBroadcast(intent);
         
  

然后您可以尝试以这种方式捕获它,在您的活动中使用广播接收器:

private BroadcastReceiver myReceiver = new BroadcastReceiver() 
    @Override
    public void onReceive(Context context, Intent intent) 
        updateUi();
    
;

不要忘记在活动的 onCreate() / onDestroy() 方法中注册/取消注册您的接收器。

onCreate()

registerReceiver(myReceiver, new IntentFilter(FCMListenerService.INTENT_FILTER));

onDestroy()

unregisterReceiver(myReceiver);

【讨论】:

能否分享示例代码,如何从服务配置 我刚刚编辑了我的帖子,这是您唯一需要的配置。当您注册广播接收器时,您的活动将使用 INTENT_FILTER。 意图意图=新意图(INTENT_FILTER);什么是 INTENT_FILTER 它是常量还是什么? 是的,它是一个常量,通常您需要在代码中的某处定义一个 public static final String INTENT_FILTER = "INTENT_FILTER" 并且在您创建意图和活动时在您的服务中使用此常量当您注册接收器时 您的代码适用于一项活动,如何使用相同的广播配置多个活动【参考方案2】:

试试这个假设你想调用MainActivity的方法; 使static 变量Context context 并在MainActivity 的onCreate() 中初始化。 并让你想在 MainActivity 中调用的方法 static

public static void updateUi()

// code to update Ui
 

然后像这样从服务中调用:-

((MainActivity)MainActivity.context).updateUi();

更新: 如果您想在多个活动中执行,那么您可以使用此方法并处理此updateUi() 方法中的逻辑

【讨论】:

这不是正确的方法..那么我最好使用静态对象变量..我想在我的活动运行时添加代码...所以这是修复...您的解决方案可能会在以下情况下工作我从同一个活动开始服务..但我 fcm 服务自动启动,我想更新另一个活动 @YogeshRathi 在否决答案之前最好先进行分析。你能解释一下这有什么问题吗?对于您的知识,我想告诉 FCM 服务是在 androidManifest.xml 中声明的,您不需要从 Activity 开始。我从过去 1 年开始在 Firebase 上工作 @YogeshRathi 你能告诉用例它在哪里不起作用,我可以帮助你更好的方法吗? 我想从 12 个活动中更新 GUI...如果我在所有活动中添加了上述代码,那么它不是很好的编程,以上要求在界面的帮助下完成,我正在检查是否可能在界面的帮助下 @YogeshRathi 你在说什么??之前您说代码不起作用现在您说这不是一个好习惯。在你说之前请先分析一下。请在您的问题中提及这一点?人们怎么会知道你想要这个?看到你的问题,它说当我的活动正在运行并且 fcm 通知来了,然后我想更新代码?有没有办法处理这个要求?就是我这样回答的

以上是关于从 FirebaseMessagingService 类调用活动类方法的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从