Java 接收Firebase消息时在RecyclerView适配器中添加列表项
我正在使用firebase消息服务发送消息和通知。我似乎无法将传入消息从服务传递到适配器,以便在收到消息时将其插入到RecycleView列表中 我尝试使用Broacastinent,如下所示: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());
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类的封闭类。我将