如何将数据从BroadcastReceiver发送到android中的Fragment [英] How to send data from BroadcastReceiver to Fragment in android
问题描述
我试图做一个聊天app.I有一个 SlidingDrawer
Activity,它有很多片段,其中 ChatFragment
是one.Now当我发送消息给我的朋友,我有一个聊天窗口
,如果有任何消息来自 GCM
服务和我在 ChatFragment
然后这条消息将去该片段和更新列表视图,因为当聊天时,任何消息来时,我想更新chatWindow现在我试过了如下所示。
GcmIntentService:
公共类GcmIntentService扩展IntentService {
public GcmIntentService(){
super(GcmIntentService);
@Override
protected void onHandleIntent(意图意图){
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
// getMessageType()意图参数必须是您在BroadcastReceiver中收到
//的意图。
字符串messageType = gcm.getMessageType(intent);
if(extras!= null&&!extras.isEmpty()){//有不合适的效果Bundle
//因为我们没有使用双向信息, (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)){
Logger.getLogger(GCM_RECEIVED).log(Level.INFO,extras.toString());我们真的需要检查
。
showToast(extras.getString(message));
Intent sendData = new Intent(chatupdater);
sendData.putExtra(msg,extras.getString(message));
LocalBroadcastManager.getInstance(this).sendBroadcast(sendData);
Log.i(聊天,我在GCMIntentService);
}
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
$ / code>
这里我在onHandleIntent()中启动一个broadcastreceiver。
ChatBroadCastReceiver:
public class ChatBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context,Intent intent){
Log.i(chat,我在ChatBroadCastReceiver);
String msg = intent.getStringExtra(msg);
Log.i(聊天,味精);
// Intent data = new Intent(chatupdater);
// Intent data = new Intent(chatupdater);
//data.putExtra(\"key\",\"data);
//data.putInt(\"fragmentno\",1); //传递我们之前讨论过的片段的唯一ID
//context.sendBroadcast(intent);
}
}
这是我的 ChatBroadCastReceiver
类,如果有消息传入,它会在 onReceive()
方法中成功接收。现在我想发送这条消息到Fragment.What我试过了,我注册了它的片段,并尝试获取相同的数据在 onReceive()
的 ChatFragment
。但它没有调用。我尝试通过日志记录来查看。
public class ChatFragment extends Fragment {
// ChatBroadCastReceiver mReceiver;
private EditText et_chat;
捆绑mailData;
字符串caller_mail;
私人ListView chatListview;
私人ChatWindowAdapter chatWindowAdapter;
私人列表< ChatSession> PreviousChatSession;
私人列表< ChatInfo> chatListItems;
按钮chat_send;
public ChatFragment(){
}
public BroadcastReceiver mReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context意图){
Log.i(聊天,我在BroadCastReceiver);
String msg = intent.getStringExtra(msg);
Toast.makeText(getActivity(),msg,Toast.LENGTH_LONG).show();
}
};
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mReceiver = new ChatBroadCastReceiver();
//getActivity().registerReceiver(new ChatBroadCastReceiver(),new IntentFilter(chatupdater));
LocalBroadcastManager.getInstance(getActivity())。registerReceiver(new ChatBroadCastReceiver(),new IntentFilter(chatupdater));
Log.i(聊天,我在onCreate);
$ b $ p现在我怎么能得到我的消息进入BroadcastReceiver的ChatReader()的ChatFragment ?? 解决方案注册您的广播您正在使用:
mReceiver = new ChatBroadCastReceiver();
LocalBroadcastManager.getInstance(getActivity())。registerReceiver(mReceiver,new IntentFilter(chatupdater));
所以你只能在 ChatBroadCastReceiver
类。因为mReceiver是一个 ChatBroadCastReceiver
类的实例。
现在接收广播消息在您创建的匿名类上你的 ChatFragment
你需要注册下面的代码。其中mReceiver是您在 ChatFragment
类中实现的匿名BroadcastReceiver类的实例。
LocalBroadcastManager.getInstance(getActivity())。registerReceiver(mReceiver,new IntentFilter(chatupdater))
接收广播消息ChatFragment和ChatBroadCastReceiver都需要注册两次广播接收者。
LocalBroadcastManager.getInstance( getActivity())。registerReceiver(mReceiver,new IntentFilter(chatupdater))
ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver();
LocalBroadcastManager.getInstance(getActivity())。registerReceiver(mChatBroadCastReceiver,newIntentFilter(chatupdater))
希望这个答案能帮助你理解你的问题。
I am trying to make an chatting app.I have a SlidingDrawer
Activity and it has many fragments and among which ChatFragment
is one.Now when i am sending message to my friend , i have a Chatting Window
and if any message comes from GCM
service and i am in ChatFragment
then this message will go to that Fragment and update the listview as i want to update the chatWindow when any message comes while chatting Now I tried to do like below.
GcmIntentService :
public class GcmIntentService extends IntentService {
public GcmIntentService() {
super("GcmIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
// The getMessageType() intent parameter must be the intent you received
// in your BroadcastReceiver.
String messageType = gcm.getMessageType(intent);
if (extras != null && !extras.isEmpty()) { // has effect of unparcelling Bundle
// Since we're not using two way messaging, this is all we really to check for
if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
Logger.getLogger("GCM_RECEIVED").log(Level.INFO, extras.toString());
showToast(extras.getString("message"));
Intent sendData = new Intent("chatupdater");
sendData.putExtra("msg", extras.getString("message"));
LocalBroadcastManager.getInstance(this).sendBroadcast(sendData);
Log.i("chat","i am in GCMIntentService");
}
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
Here i am starting a broadcastreceiver in onHandleIntent().
ChatBroadCastReceiver:
public class ChatBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("chat","I am in ChatBroadCastReceiver");
String msg = intent.getStringExtra("msg");
Log.i("chat",msg);
//Intent data = new Intent("chatupdater");
//Intent data = new Intent("chatupdater");
//data.putExtra("key","data");
//data.putInt("fragmentno",1); // Pass the unique id of fragment we talked abt earlier
//context.sendBroadcast(intent);
}
}
This is my ChatBroadCastReceiver
class and if any message comes it successfully receives at the onReceive()
method.Now i want to send this message to the Fragment.What i tried , i registered the Fragment with it and tried to get the same data at the onReceive()
of ChatFragment
.But it didn't call.I tried to see by logging.
public class ChatFragment extends Fragment {
//ChatBroadCastReceiver mReceiver;
private EditText et_chat;
Bundle mailData;
String caller_mail;
private ListView chatListview;
private ChatWindowAdapter chatWindowAdapter;
private List<ChatSession>PreviousChatSession;
private List<ChatInfo> chatListItems;
Button chat_send;
public ChatFragment() {
}
public BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("chat","I am in BroadCastReceiver");
String msg = intent.getStringExtra("msg");
Toast.makeText(getActivity(),msg,Toast.LENGTH_LONG).show();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mReceiver = new ChatBroadCastReceiver();
//getActivity().registerReceiver(new ChatBroadCastReceiver(),new IntentFilter("chatupdater"));
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(new ChatBroadCastReceiver(),new IntentFilter("chatupdater"));
Log.i("chat", "I am in onCreate");
}
Now how can i get the message which i got in the Broadcastreceiver to the onReceive() of ChatFragment??
解决方案 To Register your Broadcast You are using:
mReceiver = new ChatBroadCastReceiver();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater"));
So you will Only receive Broadcast on ChatBroadCastReceiver
class. Because mReceiver is a Instance of ChatBroadCastReceiver
class.
Now to Receive broadcast Message on anonymous class that you have created in your ChatFragment
you need to register that like below code. Where mReceiver is a Instance of anonymous BroadcastReceiver class that you have implemented in your ChatFragment
class.
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater"))
To Receive Broadcast Message Both on ChatFragment and ChatBroadCastReceiver you need to register broadcast receiver twice.
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater"))
ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mChatBroadCastReceiver ,new IntentFilter("chatupdater"))
Hope this answer will help you to understand your problem.
这篇关于如何将数据从BroadcastReceiver发送到android中的Fragment的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!