监听器内的IntentService注册只收到一次通知监听器、通知、IntentService

2023-09-04 05:27:58 作者:爱你无果i

我写一个简单的应用程序来跟踪周期的时候,我的手机有信号强度差。我这样做是使用 IntentService ,它侦听 PhoneStateListener.LISTEN_SIGNAL_STRENGTHS 如下:

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_STRENGTHS as follows:

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()被称为(presumably,在 IntentService 电话 stopSelf())。

However, I see that after the first signal strength changed notification is received, the onDestroy() is called (presumably, the IntentService calls stopSelf()).

这个问题并不仅限于 PhoneStateListener 。我还有一个简单的应用程序,它使用了接近传感器是这样的:

This problem is not limited to PhoneStateListener. I have another simple app which uses the Proximity Sensor thus:

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

在此情况下,也只有第一个接近变化通知,在此之后,服务停止本身。

In this case too, only the first proximity change was notified, after which the Service stopped itself.

那么,什么是图案注册监听器这样的在服务

So, what is the pattern for registering listeners like these in a Service?

推荐答案

好吧,我找到了解决办法。我的错。我应该使用服务,而不是 IntentService ,因为后者要求 stopSelf()处理它接收 onHandleIntent的意图后()

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().

这里的工作code延伸服务

Here's the working code which extends 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();
    }
}