0

我正在编写一个简单的应用程序来跟踪我的手机信号强度差的时期。我使用 an 来执行此操作IntentService,它侦听PhoneStateListener.LISTEN_SIGNAL_STRENGTHS如下:

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自己停止了。

那么,在 a 中注册这样的听众的模式是Service什么?

4

1 回答 1

2

好的,我找到了解决方案。我的错。我应该使用Service而不是IntentService,因为后者stopSelf()在处理它接收到的意图后调用onHandleIntent()

这是扩展的工作代码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();
    }
}
于 2011-12-28T14:25:35.980 回答