即使我发布唤醒锁,我的应用程序也会耗尽电量

时间:2012-09-30 01:37:26

标签: android battery proximity wakelock

我正在构建一个简单的应用,其中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

1 个答案:

答案 0 :(得分:1)

如果您的服务收到多个意图,则每次执行WakeLock时,您的代码都会创建一个新的onStartCommand。你将只释放最后一个WakeLock并泄漏其他人,这可以解释电池耗尽。在这种情况下,Logcat通常会提供有用的消息。

由于您的服务仍在运行一段时间,因此您可以在致电mWakeLock之前检查newWakeLock()是否已初始化。