2011-12-26 23 views
0

私の電話の信号強度が弱い期間を記録する簡単なアプリケーションを作成しています。私は、これは次のようにPhoneStateListener.LISTEN_SIGNAL_STRENGTHSをリッスンIntentServiceを使用して行う: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(); 
    } 
} 

しかし、私は、第1の信号強度が受信された通知を変更した後、onDestroy()は(おそらく、IntentServiceコールstopSelf())と呼ばれていることがわかります。

この問題はPhoneStateListenerに限定されません。私は、このように近接センサを使用する別のシンプルなアプリがあります:あまりにも、唯一の第1の近接変更がService自体を停止した後、この場合

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

を通知しました。

したがって、Serviceにこれらのようなリスナーを登録するパターンは何ですか?

+0

任意の入力?私は追加情報を提供して喜んで.. – curioustechizen

答えて

2

私は解決策を見つけました。私の悪い。後者は受信したインテントをonHandleIntent()で処理した後にstopSelf()を呼び出しますので、IntentServiceではなくServiceを使用する必要があります。

ここ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(); 
    } 
} 
関連する問題