2012-01-30 2 views
0

Я пользуюсь Broadcast Receiver, чтобы получать трансляцию, когда телефон загружается, и оттуда я хотел бы зарегистрировать PhoneStateListener и ContentObserver. К сожалению, он не позволит мне использовать метод setReceiver() для ContentObserver, как в моем основном действии. Аналогичная проблема возникла с PhoneStateListener и startService(), но я смог использовать пройденный context, чтобы он работал. Это не решает проблему для setReceiver. Каков правильный способ вызова этого метода?Запуск ContentObserver при загрузке телефона

Кстати ошибка дает это "метод setReceiver (SmsObserver) не определено для типа контекста"

Мой код:

public class BootReceiver extends BroadcastReceiver { 

private Context mContext; 

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

    mContext = context; 

    // Get the telephony manager 
      TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); 

      // Create a new PhoneStateListener 
      PhoneStateListener listener = new PhoneStateListener() { 

       @Override 
       public void onCallStateChanged(int state, String incomingNumber) { 
        if (state == TelephonyManager.CALL_STATE_IDLE) { 
         Intent update = new Intent(mContext, 
           UpdateService.class); 
         mContext.startService(update); 
        } 
       } 

       @Override 
       public void onDataActivity(int direction) { 
        if (direction == TelephonyManager.DATA_ACTIVITY_NONE) { 
         Intent update = new Intent(mContext, 
           UpdateService.class); 
         mContext.startService(update); 
        } 
       } 
      }; 

      // Register the listener with the telephony manager 
      telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 
      telephonyManager.listen(listener, 
        PhoneStateListener.LISTEN_DATA_ACTIVITY); 

      SmsObserver smsSentObserver = new SmsObserver(new Handler(), mContext); 

      //Unable to call this method 
      mContext.setReceiver(smsSentObserver); 

} 

}

ответ

1

Это не решить проблему для setReceiver. Каков правильный способ вызова этого метода?

Тактически, нет setReceiver() метод в любом месте Android. Если SmsObserver должен быть ContentObserver, вы должны использовать ContentResolver и notifyChange() для его регистрации.

Стратегически ваш код бесполезен, так как ваш процесс может быть прерван вскоре после того, как onReceive() заканчивается, делая все это трудным.

+0

Может ли он быть разорван, потому что я запускаю его в BroadcastReceiver, или это относится также к действиям? Я использовал тот же бит кода в onCreate в своем основном действии и не заметил, что ContentObserver останавливается через какое-то время. Он просматривает отправленный поле SMS и обновляет мой виджет в onChange(), так как он завершается при завершении работы. Я пытаюсь запустить его снова, когда телефон загружается. –

+0

@MattHarris: «Можно ли его завершить, потому что я запускаю его в BroadcastReceiver, или это относится также к действиям?» - если вы не находитесь на переднем плане, Android в конечном итоге прекратит ваш процесс. http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle – CommonsWare

+0

Я вижу, спасибо. –

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