我正在写一个简单的应用程序来跟踪我的手机信号强度差的时期。我使用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
停止自己。
那么,在Service
中注册这样的侦听器的模式是什么呢?
好了,我找到解决方案了。我的坏。我应该使用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();
}
}