我写一个简单的应用程序来跟踪周期的时候,我的手机有信号强度差。我这样做是使用 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();
}
}