2014-01-21 5 views
1

Это BroadcastReceiver находится внутри моего фрагмента:Мой BroadcastReceiver никогда не называется?

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 
    getActivity().startService(new Intent(getActivity(),LightSensor.class)); 
    Log.d(TAG, "Called the LightSensor Service Class to start"); 

    IntentFilter luxfilter = new IntentFilter("LuxUpdate"); 
    getActivity().getApplicationContext().registerReceiver(mLightReceiver, luxfilter); 


    ... 
    } 

... 

    // RECEIVE DATA FROM LIGHT SENSOR BROADCAST 
     public BroadcastReceiver mLightReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 

       String lux = intent.getStringExtra("Lux"); 
       Log.d(TAG, "Recieve Broadcast-Lux Update: " + lux); 
       //TextView tvSensorLightLux = (TextView) findViewById(R.id.tvSensorLightLux); 
       mLightValue.setText(lux); 

      } 
     }; 

Проблема заключается в том, что я думаю, думаю, что она слушает или приема. Log.d никогда не отображается в LogCat. Понятия не имею почему. Единственная разница в этой записи, а другая - работа, заключалась в том, что предыдущая запись была фактически в Activity. Этот находится в Фрагменте. Я что-то упустил здесь или должен быть что-то в моем манифесте для этого фрагмента или приемника?

UPDATE:

датчик посылает в эфир с:

private void sendLuxUpdate() { 

     if(isLightSensing){ 
     Log.d(TAG, "sender Broadcasting message " + Lux); 
     Intent intent = new Intent("LuxUpdate"); 
     intent.putExtra("Lux", Lux); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
     } 
    } 
+1

ли вы зарегистрировать приемник? –

+0

Извините, я редактировал выше, чтобы отразить рег. В регистрации я вижу запись Log.d. Это не означает, что он был зарегистрирован должным образом, только то, что оно прошло через это утверждение. –

+0

Вы должны также включить отправку «Intent» в приемник, чтобы кто-то мог посмотреть, все ли в порядке. – nKn

ответ

3

Вы делаете по крайней мере, 2 неправильные вещи:

  1. зарегистрировать приемник через Context.registerReceiver(), а затем вы отправляете трансляция обновлений через LocalBroadcastmanager. Вы никогда не получите эти сообщения. LocalBroadcastManager не знает о получателях, зарегистрированных через Context и наоборот.
  2. Я не думаю, что это хорошая идея зарегистрировать приемник непосредственно в контексте приложения, так как это приведет к утечке фрагмента.

Так попробовать это: зарегистрировать приемник в onCreate или onResume, а затем разрегистрировать тот же экземпляр в дополнительном методе: onDestroy или . Кроме того, при регистрации и отправке намерений используется тот же механизм: либо LocalBroadcastManager, либо основанный на Context. Первое имеет преимущество отправки сообщений только в вашем приложении.

Например, предположим, что ваш фрагмент называется DeviceView:

public class DeviceView extends Fragment{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(your_receiver, intent_filter); 
     /// other code 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(your_receiver); 
     /// other code 
    } 
} 
+0

не имеет смысла. Похоже, вы говорите, что я отправляю на одном языке и слушаю другого. Мне нужно только получить эти торги в приложении. onPause отключает трансляцию. Поскольку это фрагмент, как мне регистрировать Receivr, я хочу придерживаться LocalBroadcastManager? –

+0

'LocalBroadcastManager.getInstance (getActivity())' ... просто не забудьте зарегистрировать/отменить регистрацию в дополнительных методах. ... а также для увеличения;) – gunar

+0

Я пробовал это, но getInstance бросает ошибку, говоря, что он несовместим с Фрагментом –

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