簡體   English   中英

如何在Android中將數據從BroadcastReceiver發送到Fragment

[英]How to send data from BroadcastReceiver to Fragment in android

我正在嘗試制作一個聊天應用程序。我有一個SlidingDrawer活動,它有很多片段,其中ChatFragment是其中ChatFragment現在當我向朋友發送消息時,我有一個Chatting Window ,如果有消息來自GCM服務並且我在ChatFragment那么此消息將轉到該Fragment並更新listview,因為當我在聊天時收到任何消息時,我想更新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並試圖在ChatFragment onReceive() ,但是沒有ChatFragment 。我試圖通過登錄查看。

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()?

嘗試這個

  • 創建一個具有這樣方法的接口。

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

現在,在您的片段中實現此功能,並在BroadcastReceiver注冊偵聽器,現在您的廣播接收器收到任何消息后,便可以通過此Listener將其用於您的片段。
希望這可以幫助。

注冊廣播您正在使用:

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

希望這個答案能幫助您理解您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM