【问题标题】:How to send data from BroadcastReceiver to Fragment in android如何将数据从广播接收器发送到android中的片段
【发布时间】:2015-05-05 17:20:51
【问题描述】:

我正在尝试制作一个聊天应用程序。我有一个SlidingDrawer 活动,它有很多片段,其中ChatFragment 是一个。现在当我向我的朋友发送消息时,我有一个Chatting Window 和如果有任何消息来自GCM 服务并且我在ChatFragment 中,那么此消息将转到该片段并更新列表视图,因为我想在聊天时收到任何消息时更新 chatWindow 现在我尝试执行以下操作。
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);
    }

这里我在 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);


    }
}

这是我的 ChatBroadCastReceiver 类,如果有任何消息,它会通过 onReceive() 方法成功接收。现在我想将此消息发送到 Fragment。我尝试了什么,我用它注册了 Fragment 并尝试获取ChatFragmentonReceive() 的数据相同。但它没有调用。我试图通过记录查看。

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");

    }

现在我怎样才能将我在 Broadcastreceiver 中收到的消息发送到 ChatFragment 的 onReceive()??

【问题讨论】:

  • LocalBroadcastManager.getInstance()有什么用?
  • 我从一个答案中得到了这句话。" 如果您的广播接收器在一个片段中,请使用 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice); 注册它并使用 LocalBroadcastManager.getInstance 取消注册(getActivity()).unregisterReceiver(onNotice);"。但我尝试不使用 LocalBroadCastManager 但结果相同。
  • 如果你知道任何其他方式,你可以建议我。 @Dhaval 帕特尔
  • 好的,我对 LocalBroadcastManager 做了一些研究,发现 this 非常有帮助。可能与您的问题无关。
  • 我想让你评论 mReceiver = new ChatBroadCastReceiver();行并尝试 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater"));

标签: android service broadcastreceiver fragment google-cloud-messaging


【解决方案1】:

试试这个

  • 创建一个具有类似方法的接口。

    public interface DemoListener { public void receiveMessage(String message); }

现在在您的片段中实现此功能并在BroadcastReceiver 中注册侦听器,现在,一旦您的广播接收器收到任何消息,您的片段就可以通过此侦听器使用它。
希望这会有所帮助。

【讨论】:

  • 如何在 BroadcastReceiver 中注册监听器
【解决方案2】:

注册您正在使用的广播:

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 ,new IntentFilter("chatupdater"))

希望这个答案能帮助你理解你的问题。

【讨论】:

  • 你的意思是 ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver(); LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mChatBroadCastReceiver ,new IntentFilter("chatupdater")) 包含在 ChatBroadCastReceiverclass 或 ChatFragment onCreate() 中。
  • @setu basak 是的,你是对的。如果您想在 ChatBroadCastReceiver 类中接收广播,请注册 mChatBroadCastReceiver;如果您想在 ChatFragment 类中接收广播,请注册 mReceiver。
  • 我很困惑你想让我在哪里写这些行 ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver(); LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mChatBroadCastReceiver ,new IntentFilter("chatupdater"))..你要我写在 ChatBroadCaster 类 onCreate() 中。
  • 如果你想在 ChatFragment 类中接收广播,只需使用 ocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater"));您已经为 mReceiver 编写了代码。所以不需要做任何其他事情。
  • 如果你想在 ChatBroadCastReceiver 类中接收广播,那么只需要注册就好。 ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver(); LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mChatBroadCastReceiver ,new IntentFilter("chatupdater"))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多