我正在构建一个简单的应用,其中BroadcastReciever
可以收听PHONE_STATE:
<receiver android:name=".PhoneStateBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
在BroadcastReciever
的{{1}}中,当状态为onRecieve()
时启动服务,并在状态为OFFHOOK
时停止服务:
IDLE
在服务中,我正在注册接近传感器监听器,并创建public class PhoneStateBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
context.startService(new Intent(context, ProximityService.class));
}
else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
context.stopService(new Intent(context, ProximityService.class));
}
}
}
,以便屏幕在通话时关闭。
通话结束后,我停止服务,在WakeLock
我取消注册听众并释放onDestroy()
。
但似乎有些东西没有在那里发布,因为我看到我的应用程序耗尽了大量电池(30%)。
我在侦听器取消注册时以及WakeLock
版本上放置了一个日志,我可以看到WakeLock
已发布并且侦听器已成功注销(我也可以看到Log from { {1}}侦听器未注册)。
我在这里缺少什么? 那太烦人了。
服务的一些代码:
WakeLock
我看到的日志:
SensorManager
非常感谢! ELAD
答案 0 :(得分:1)
如果您的服务收到多个意图,则每次执行WakeLock
时,您的代码都会创建一个新的onStartCommand
。你将只释放最后一个WakeLock
并泄漏其他人,这可以解释电池耗尽。在这种情况下,Logcat通常会提供有用的消息。
由于您的服务仍在运行一段时间,因此您可以在致电mWakeLock
之前检查newWakeLock()
是否已初始化。