Как отправить данные с приемника вещания на фрагмент? - PullRequest
0 голосов
/ 13 ноября 2018

Как отправить данные с приемника вещания на фрагмент?Здесь я хочу отправить номер телефона (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";                                
        }                                                                  
    }
}

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

В текущем сценарии возможны два подхода для отправки данных во фрагмент.

Первый подход:

Вы можете зарегистрировать BroadcastReceiver для действия, которое размещаетФрагмент и после получения данных в onReceive() вы можете вызвать метод Fragment из Activity, как показано ниже:

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

Подход второй:

Вы можете напрямую зарегистрировать BroadcastReceiver во Fragment, а затем вызвать метод фрагмента, определенный там, как показано ниже:

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

, а затем в onCreateView() Зарегистрировать BroadcastReceiver во Fragment следующим образом:

@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() unRegister BroadcastReceiver во фрагменте, подобном следующему:

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

Имейте в виду:

Жизненный цикл фрагмента будет играть здесь важную роль.Для получения Трансляции Ваш Фрагмент должен быть Создан и видим для Пользователя.Когда фрагмент будет уничтожен или не виден пользователю, вы не получите трансляцию.

0 голосов
/ 13 ноября 2018

Просто зарегистрируйте другого приемника вещания в своем фрагменте. Код примечания работает, когда ваш фрагмент прикреплен к активности и находится на переднем плане.

Если вы хотите отправить данные во Fragment, когда ваше приложение не запущено, вам нужно будет отобразить уведомление в строке состояния и прикрепить ваши данные в ожидании уведомления о намерении. В качестве цели вам нужно указать класс Activity, который содержит интересующий вас фрагмент, а затем вручную извлечь данные в onCreate действия и передать их во 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);
    }
}

Причина, по которой мы регистрируем и отменяем регистрацию приемника Broadcast в методах onResume и onPause, заключается в том, что мы не хотим, чтобы Fragment получал данные и действовал в этом случае, когда он находится на переднем плане. Подробнее в этой ссылке

В вашем 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);                             
        }                                                                  
    }
}
...