首页 > 解决方案 > 如何将数据从广播接收器发送到片段?

问题描述

如何将数据从广播接收器发送到片段?在这里,我想将电话号码(OriginatingAddress)发送到另一个片段。

public void onReceive(Context context, Intent intent) {
    Bundle intentExtras = intent.getExtras();
    if (intentExtras != null) {
        Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
        String smsMessageStr = "";
        for (int i = 0; i < sms.length; ++i) {
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

            String smsBody = smsMessage.getMessageBody().toString();
            String phonenumber = smsMessage.getOriginatingAddress();

            smsMessageStr += "SMS From: " + phonenumber + "\n";
            smsMessageStr += smsBody + "\n";                                
        }                                                                  
    }
}

标签: androidandroid-fragmentsbroadcastreceiverandroid-broadcastandroid-broadcastreceiver

解决方案


在当前场景中,可以有两种方法向 Fragment 发送数据。

方法一:

您可以将 BroadcastReceiver 注册到托管 Fragment 的活动中,并且在接收到数据后,您可以从如下所示onReceive()调用该Fragment方法:Activity

ExampleFragment fragment = (ExampleFragment)getFragmentManager().
findFragmentById(R.id.example_fragment);
fragment.<specific_function_name_of_that_fragment>();

方法二:

您可以直接在 Fragment 中注册 BroadcastReceiver,然后调用其中定义的片段方法,如下所示:

private final BroadcastReceiver broadCastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          //receive your data here
        }
    };

然后onCreateView()在 Fragment 中注册 BroadcastReceiver,如下所示:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(broadCastReceiver,
                new IntentFilter("YOUR.INTENT.FILTER"));

        return inflater.inflate(R.layout.fragment_sub_categories, container, false);
    }

然后在onDestroyView()Fragment 中的 unRegister BroadcastReceiver 中,如下所示:

@Override
    public void onDestroyView() {
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadCastReceiver);
        super.onDestroyView();
    }

记住:

片段生命周期将在这里发挥重要作用。为了接收广播,您的片段需要被创建并且对用户可见。当片段将被销毁或对用户不可见时,您将不会收到广播。


推荐阅读