Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接收Firebase消息时在RecyclerView适配器中添加列表项_Java_Android_Service_Firebase_Firebase Cloud Messaging - Fatal编程技术网

Java 接收Firebase消息时在RecyclerView适配器中添加列表项

Java 接收Firebase消息时在RecyclerView适配器中添加列表项,java,android,service,firebase,firebase-cloud-messaging,Java,Android,Service,Firebase,Firebase Cloud Messaging,我正在使用firebase消息服务发送消息和通知。我似乎无法将传入消息从服务传递到适配器,以便在收到消息时将其插入到RecycleView列表中 我尝试使用Broacastinent,如下所示: public class messaging extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage m) { store(m.getData());

我正在使用firebase消息服务发送消息和通知。我似乎无法将传入消息从服务传递到适配器,以便在收到消息时将其插入到RecycleView列表中

我尝试使用Broacastinent,如下所示:

public class messaging extends FirebaseMessagingService {

   @Override
   public void onMessageReceived(RemoteMessage m) {
      store(m.getData());
      broadcastIntent();
   }

   public void broadcastIntent() {
      Intent intent = new Intent();
      intent.setAction("com.myApp.CUSTOM_EVENT");
      sendBroadcast(intent);
   }
}
并且在Adpter中

public class ConvoAdapter extends RecyclerView.Adapter<ConvoHolder> {

   private List<Message> list;
   private Activity      A;

   public ConvoAdapter(List<Message> data) {

   }

   @Override
   public ConvoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
      return new ConvoHolder(v);
   }

   @Override
   public void onBindViewHolder(ConvoHolder h, int Position) {
      final Message M = list.get(Position);
      h.config(A, M);
   }

    @Override
    public int getItemCount() {
       return list.size();
    }

    public class MyReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "Intent Detected.",    Toast.LENGTH_LONG).show();
          }
    }
}
公共类ConvalAdapter扩展了RecyclerView.Adapter{
私人名单;
私人活动A;
公用适配器(列表数据){
}
@凌驾
公共视图持有者onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(布局,父项,false);
归还新的持有人(v);
}
@凌驾
BindViewHolder上的公共无效(h,int位置){
最终消息M=list.get(位置);
h、 配置(A,M);
}
@凌驾
public int getItemCount(){
返回list.size();
}
公共类MyReceiver扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
Toast.makeText(上下文,“检测到意图”,Toast.LENGTH_LONG.show();
}
}
}
和清单。

<receiver android:name=".fragments.chats.ConvoAdapter$MyReceiver"
                  android:enabled="true"
                  android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.CUSTOM_EVENT">
                </action>
            </intent-filter>
        </receiver>

实际上,广播接收器没有接收任何消息


我还将使用任何其他不涉及使用广播接收器的方法

如果您不想在任务中使用BroadCaseReceiver,请执行以下步骤:

这里有两件事需要注意

首先,检查活动是否打开(Activel可见)

一,。当屏幕处于活动状态时。(屏幕可见)

1.在onMessageReceived()中,随时间将收到的消息存储在SQLiteDataBase中。 2.在适配器中创建一个方法,通过从SQLiteDB获取数据来更新屏幕。 3.现在,每当收到新消息时,在适配器类中调用此方法

ii.如果屏幕未激活:

1.将收到的消息存储在sqliteDb中,并将其显示为通知

注:

1.确保在try-catch块中写入所有这些内容。 2.确保在第一次打开屏幕时同步SQLiteDB。
3.如果这对你没有帮助,请尝试这种方法

如果您不想在任务中使用BroadCaseReceiver,请执行以下步骤:

这里有两件事需要注意

首先,检查活动是否打开(Activel可见)

一,。当屏幕处于活动状态时。(屏幕可见)

1.在onMessageReceived()中,随时间将收到的消息存储在SQLiteDataBase中。 2.在适配器中创建一个方法,通过从SQLiteDB获取数据来更新屏幕。 3.现在,每当收到新消息时,在适配器类中调用此方法

ii.如果屏幕未激活:

1.将收到的消息存储在sqliteDb中,并将其显示为通知

注:

1.确保在try-catch块中写入所有这些内容。 2.确保在第一次打开屏幕时同步SQLiteDB。
3.如果这对你没有帮助,请尝试这种方法

我认为上面的代码不起作用,因为上面给出的操作名与清单中注册的操作名不同

<action android:name="com.myApp.CUSTOM_EVENT">
                </action>

intent.setAction("com.myApp.CUSTOM_EVENT");

intent.setAction(“com.myApp.CUSTOM_事件”);

给出相同的名称我认为上面的代码会起作用

我认为上面的代码不起作用,因为上面给出的操作名称与清单中注册的操作名称不同

<action android:name="com.myApp.CUSTOM_EVENT">
                </action>

intent.setAction("com.myApp.CUSTOM_EVENT");

intent.setAction(“com.myApp.CUSTOM_事件”);

使用相同的名称我认为上述代码会起作用

您的流程或体系结构不是标准做法

标准流程应为

  • 火基服务
  • 使用
    LocalBroadcastManager

  • 1。Firebase服务

    public class messaging extends FirebaseMessagingService {
    
       @Override
       public void onMessageReceived(RemoteMessage m) {
          store(m.getData());
          broadcastIntent();
       }
    
      public void broadcastIntent() {
          Intent intent = new Intent();
          intent.setAction("com.myApp.CUSTOM_EVENT");
          // We should use LocalBroadcastManager when we want INTRA app
          // communication
          LocalBroadcastManager.getInstance(YOUR_CONTEXT).sendBroadcast(intent);
      }
    }
    
    2。活动

  • 注册
    接收器
    服务进行广播

     public void onCreate(Bundle savedInstance) {
           // REST OF YOUR CODE
           IntentFilter if= new IntentFilter("com.myApp.CUSTOM_EVENT");
           LocalBroadcastManager.getInstance(this).registerReceiver(onMessage, if);
      }
    
  • 活动中写入
    接收器

    private BroadcastReceiver onNotice= new BroadcastReceiver() {        
          @Override
          public void onReceive(Context context, Intent intent) {        
                 // Update your RecyclerView here using notifyItemInserted(position);
          }};
    

  • 摘要
    服务
    将本地广播发送到
    活动
    ,活动反过来接收广播,并使用
    回收视图
    实例更新或添加项目

    您的流程或架构不是标准做法

    标准流程应为

  • 火基服务
  • 使用
    LocalBroadcastManager

  • 1。Firebase服务

    public class messaging extends FirebaseMessagingService {
    
       @Override
       public void onMessageReceived(RemoteMessage m) {
          store(m.getData());
          broadcastIntent();
       }
    
      public void broadcastIntent() {
          Intent intent = new Intent();
          intent.setAction("com.myApp.CUSTOM_EVENT");
          // We should use LocalBroadcastManager when we want INTRA app
          // communication
          LocalBroadcastManager.getInstance(YOUR_CONTEXT).sendBroadcast(intent);
      }
    }
    
    2。活动

  • 注册
    接收器
    服务进行广播

     public void onCreate(Bundle savedInstance) {
           // REST OF YOUR CODE
           IntentFilter if= new IntentFilter("com.myApp.CUSTOM_EVENT");
           LocalBroadcastManager.getInstance(this).registerReceiver(onMessage, if);
      }
    
  • 活动中写入
    接收器

    private BroadcastReceiver onNotice= new BroadcastReceiver() {        
          @Override
          public void onReceive(Context context, Intent intent) {        
                 // Update your RecyclerView here using notifyItemInserted(position);
          }};
    

  • 摘要
    服务
    将本地广播发送到
    活动
    ,活动反过来接收本地广播,并使用
    回收视图
    实例更新或添加项目

    您给我们的是一个BroadCastReceiver类,而不是适配器。是的,适配器是BroadCastReceiver类的封闭类。我将编辑以附上it@RushiAyyappa查看新编辑。是否尝试使用sqlDataBase?在onMessageReceived()中,检查屏幕是否处于活动状态。如果未处于活动状态,请将其存储在sqLiteDataBase中,并在打开屏幕时同步数据库。如果屏幕处于活动状态,则创建一个更新屏幕的方法,并通过在onMessageReceived()中为适配器类创建对象来访问此方法。请确保在try and catch()中编写此方法blocks@RushiAyyappa,我真的不明白你的建议,你能写下这个作为一个答案并详细解释一下吗。你给我们的是一个BroadCastReceiver类而不是你的适配器。是的,适配器是BroadCastReceiver类的封闭类。我将