如何将数据从广播接收器发送到片段? [英] How to send a data from a broadcast receiver to fragment?

本文介绍了如何将数据从广播接收器发送到片段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How to send a data from a broadcast receiver to fragment? Here I want to send the phonenumber (OriginatingAddress) to another fragment.

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

推荐答案

只需在您的Fragment中注册另一个广播接收器.当您的片段连接到活动"并且位于前台时,下面的注释代码将起作用.

Just register another Broadcast receiver in your Fragment. Note code below works when your Fragment is attached to Activity and are in foreground.

如果您想在应用未运行时将数据发送到Fragment,则需要在状态栏上显示通知,并将数据附加到未决的NotificationIntent中.作为目标,您需要指定保存感兴趣的Fragment的Activity类,然后在Activity的onCreate中手动提取数据并将其传递给Fragment.

If you want to send data to Fragment when your app is not running you will need to show notification on status bar and attach your data in pendingIntent of notification. As a target you need to specify your Activity class that holds Fragment of interest and then manually extract data in Activity's onCreate and pass it to Fragment.

在您的片段中:

// receiver as a global variable in your Fragment class
private BroadcastReceiver messagesReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getExtras() != null) {
            String smsMessageStr = intent.getExtras().getString("smsMessageStr");
            if (smsMessageStr != null && ! smsMessageStr()) {
                // do what you need with received data
            }
        }
    }
};

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // ...
}

@Override
public void onResume() {
    super.onResume();
    if (getActivity() != null) {
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(messagesReceiver,
                new IntentFilter("your_intent_filter"));
    }
}

@Override
public void onPause() {
    super.onPause();
    if (getActivity() != null) {
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(messagesReceiver);
    }
}

之所以在onResumeonPause方法中注册和注销广播接收器,是因为我们不希望Fragment接收数据并在前台时对其采取行动. 链接

The reason we register and unregister Broadcast receiver in onResume and onPause methods is because we don't want Fragment to receive data and act upon that when is it being in foreground. More in this link

在您的BroadcastReceiver中:

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

            // send data only if we have smsMessageStr
            Intent newIntent = new Intent("your_intent_filter");
            newIntent.putExtra("smsMessageStr", smsMessageStr);
            LocalBroadcastManager.getInstance(this).sendBroadcast(newIntent);                             
        }                                                                  
    }
}

这篇关于如何将数据从广播接收器发送到片段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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