2011-12-26 123 views
0

我正在寫一個簡單的應用程序來跟蹤我的手機信號強度較差的時段。我這樣做是使用IntentService,該監聽PhoneStateListener.LISTEN_SIGNAL_STRENGTHS如下:在IntentService中註冊的監聽器只接收一次通知

public class PoorSignalIntentService extends IntentService { 

    private TelephonyManager mTelephonyManager; 
    private PhoneStateListener mPhoneStateListener; 
    public PoorSignalIntentService() { 
     super("PoorSignalIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     mPhoneStateListener = new PhoneStateListener(){ 
      @Override 
      public void onSignalStrengthsChanged(SignalStrength signalStrength) { 
       doSomething(signalStrength); 
       super.onSignalStrengthsChanged(signalStrength); 
      } 

      @Override 
      public void onServiceStateChanged(ServiceState serviceState) { 
       doSomething(serviceState); 
       super.onServiceStateChanged(serviceState); 
      } 
     }; 

     mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
     mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS|PhoneStateListener.LISTEN_SERVICE_STATE); 

    } 

    private void doSomething(SignalStrength signalStrength){ 
     Log.d(TAG, "Signal Strength changed! New strength = "+signalStrength.getGsmSignalStrength()); 
    } 

    private void doSomething(ServiceState serviceState){ 
     Log.d(TAG, "Service State changed! New state = "+serviceState.getState()); 
    } 

    @Override 
    public void onDestroy() { 
     Log.d(TAG, "Shutting down the IntentService"); 
     mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 
     super.onDestroy(); 
    } 
} 

但是,我看到後收到的第一信號強度變更通知,onDestroy()被稱爲(據推測,IntentService電話stopSelf())。

此問題不限於PhoneStateListener。我還有一個簡單的應用程序,它使用了接近傳感器這樣的:

@Override 
    protected void onHandleIntent(Intent intent){ 
     mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

在這種情況下,也只被告知第一鄰近的變化,在這之後Service停止本身。

那麼,在Service中註冊類似聽衆的模式是什麼?

+0

任何投入?我很樂意提供任何其他信息.. – curioustechizen 2011-12-27 05:24:20

回答

2

好的,我找到了解決方案。我的錯。我應該使用Service而不是IntentService,因爲後者在處理它在onHandleIntent()中收到的意圖後調用stopSelf()

這裏的延伸Service工作代碼:

public class PoorSignalService extends Service { 

    private TelephonyManager mTelephonyManager; 
    private PhoneStateListener mPhoneStateListener; 


    @Override 
    public IBinder onBind(Intent intent) { 
     // We don't want to bind; return null. 
     return null; 
    } 


    @Override 
    public void onCreate() { 
     mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
     mPhoneStateListener = new PhoneStateListener(){ 
      @Override 
      public void onSignalStrengthsChanged(SignalStrength signalStrength) { 
       doSomething(signalStrength); 
       super.onSignalStrengthsChanged(signalStrength); 
      } 

      @Override 
      public void onServiceStateChanged(ServiceState serviceState) { 
       doSomething(serviceState); 
       super.onServiceStateChanged(serviceState); 
      } 
     }; 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //Register the listener here. 
     mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS|PhoneStateListener.LISTEN_SERVICE_STATE); 
     return super.onStartCommand(intent, flags, startId); 
    } 


    private void doSomething(SignalStrength signalStrength){ 
     Log.d(TAG, "Signal Strength changed! New strength = "+signalStrength.getGsmSignalStrength()); 
    } 

    private void doSomething(ServiceState serviceState){ 
     Log.d(TAG, "Service State changed! New state = "+serviceState.getState()); 
    } 

    @Override 
    public void onDestroy() { 
     Log.d(TAG, "Shutting down the Service"); 
     mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 
     super.onDestroy(); 
    } 
}