2015-06-19 5 views
3

У меня есть ретранслятор в моем фрагменте, чтобы отслеживать все полученные SMS.Широковещательный приемник в фрагменте

private BroadcastReceiver smsBroadcastReceiver; 
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    smsBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.e("smsBroadcastReceiver", "onReceive"); 
     } 
    }; 
} 

@Override 
public void onStart() { 
super.onStart(); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(smsBroadcastReceiver, filter); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(smsBroadcastReceiver); 
} 

и разрешения в манифесте:

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 

Проблема в том, я никогда не получаю журнал Log.e("smsBroadcastReceiver", "onReceive"); Я определенно получаю SMS, пока приемник по-прежнему зарегистрирован.

Однако, если я пишу приемник как отдельный класс и помещаю его в манифест, тогда вызывается onReceive().

Я что-то пропустил?

+0

ANSW er, это обеспечивает лучшую производительность: http://stackoverflow.com/a/42323093/3923839 – abedfar

ответ

7

Я что-то пропустил?

Ya вам не хватает одной точки, что срок службы объекта. Когда вы регистрируете широковещательный приемник в фрагменте, объект-приемник будет действовать до тех пор, пока фрагмент не будет существовать. Когда фрагмент уничтожается, приемник также незарегистрирован. Поэтому, когда фрагмент жив, тогда вы получите трансляцию, иначе это не сработает. Чтобы получать трансляцию, когда приложение не находится на переднем плане, вам необходимо зарегистрировать трансляцию в файле манифеста.

UPDATE

попробовать, как это

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
private BroadcastReceiver smsBroadcastReceiver=new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.e("smsBroadcastReceiver", "onReceive"); 
     } 
    }; 

И зарегистрировать ваш ресивер как

getActivity().registerReceiver(smsBroadcastReceiver, filter); 

и разрегистрировать как

getActivity().unregisterReceiver(smsBroadcastReceiver); 
+0

Я только то, что получатель, когда я нахожусь в этом фрагменте. Поэтому я не зарегистрировал его в манифесте. Также я записывал журналы onStart() и onStop(), и, конечно же, sms получен, когда ресивер все еще зарегистрирован. – Housefly

+0

Отметьте мой последний ответ !!! – Chandrakanth

+0

Местный широковещательный приемник в основном используется для обновления ui непрерывно от приемника, здесь вы можете использовать простой приемник для отслеживания sms –

Смежные вопросы