如何将数据从BroadcastReceiver发送到android中的Fragment [英] How to send data from BroadcastReceiver to Fragment in android

查看:174
本文介绍了如何将数据从BroadcastReceiver发送到android中的Fragment的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图做一个聊天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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆