Skip to content Skip to sidebar Skip to footer

Listener Registered Within An Intentservice Receives Notification Only Once

I am writing a simple app to keep track of the periods when my phone has poor signal strength. I do this using an IntentService, which listens for PhoneStateListener.LISTEN_SIGNAL_

Solution 1:

Ok, I found the solution. My bad. I should be using a Service rather than IntentService, since the latter calls stopSelf() after processing the intents it receives in onHandleIntent().

Here's the working code which extends Service:

publicclassPoorSignalServiceextendsService {

    privateTelephonyManager mTelephonyManager;
    privatePhoneStateListener mPhoneStateListener;


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


    @OverridepublicvoidonCreate() {
        mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        mPhoneStateListener = newPhoneStateListener(){
            @OverridepublicvoidonSignalStrengthsChanged(SignalStrength signalStrength) {
                doSomething(signalStrength);
                super.onSignalStrengthsChanged(signalStrength);
            }

            @OverridepublicvoidonServiceStateChanged(ServiceState serviceState) {
                doSomething(serviceState);
                super.onServiceStateChanged(serviceState);
            }
        };
        super.onCreate();
    }

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


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

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

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

Post a Comment for "Listener Registered Within An Intentservice Receives Notification Only Once"