0

У меня есть простой фрагмент в моей деятельности, в котором я включаю и отключаю адаптер Bluetooth, и я хочу прослушивать изменения состояния адаптера Bluetooth с помощью BroadcastReceiver изнутри фрагмента. Причина в том, что я хочу напрямую изменять элементы интерфейса Fragment при изменении состояния Bluetooth. Это мой код:Метод BroadcastReceiver фрагментации onCreate не вызван

public class FragmentBT extends Fragment 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     IntentFilter iFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(BtStateChangedReceiver, iFilter); 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(BtStateChangedReceiver); 
    } 

    public BroadcastReceiver BtStateChangedReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      ... change UI based on the extra data from intent ... 
     } 
    } 
} 

Когда я включить или отключить BT в устройстве с помощью кнопки действия в ActionBar моего фрагмента, БТ включается и выключается, но мой приемник никогда не вызывается. Я никогда не попадаю в метод onReceive приемника. Я понимаю, что здесь довольно распространенный вопрос, но я пробовал решения от нескольких, но не работал (и все они включены в мой текущий код).

Благодарим за любые советы!

+0

Надеюсь, вы уже определили разрешение на использование в вашем манифесте. –

+0

Bhavesh: Да, у меня есть разрешения BLUETOOTH и BLUETOOTH_ADMIN. Mateus: Я не. Я только слушаю трансляцию. Я предполагаю, что состояние БТ изменилось, а трансляция передается системой. Не было бы смысла слушать это иначе, я ошибаюсь? –

+0

Это из-за обмана, как будто я стараюсь по возможности поместить своих приемников в манифест. – e4c5

ответ

0

Попробуйте это:

getActivity().registerReceiver(BtStateChangedReceiver, iFilter); 
getActivity().unregisterReceiver(BtStateChangedReceiver); 

docs говорят, что «LocalBroadcastManager» используется для 'зарегистрировать и отправить вещание на местных намерениях объектов в рамках вашего процесса.

+0

Да, это была именно проблема. Я также заметил это о LocalBroadcastManager. Я использовал обходной путь, используя BroadcastReceiver, зарегистрированный в манифесте и объявленный в отдельном классе. При этом я анализирую данные Intent и распространяю Broadcast дальше в свое приложение, используя метод sendBroadcast для LocalBroadcastManager. Чем широковещательная передача окончательно получена моим BtStateChangedReceiver (в опубликованном мной коде). В любом случае, спасибо за полезный совет! –

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