带有监听器的BroadcastReceiver在不使用时会耗尽电池电量
我有一个等待TelephonyManager.ACTION_PHONE_STATE_CHANGED
的接收器.ACTION_PHONE_STATE_CHANGED:
public void onReceive(Context context, Intent intent) { String theAction = intent.getAction(); if (theAction != null && theAction.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { CONTEXT = context; startListening(); }
当它得到它,我注册听众(为方向传感器):
public void startListening() { sensorManager = (SensorManager) CONTEXT.getSystemService(Context.SENSOR_SERVICE); List sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION); if (sensors.size() > 0) { sensor = sensors.get(0); running = sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_FASTEST); } }
然后,在Listener的onSensorChanged()
方法中:
public void onSensorChanged(SensorEvent event) { if(running) { sensorManager.unregisterListener(this); // do some not significant stuff here }
现在问题是:我接到电话,接收器启动,然后听众启动,一切都按设计工作。 但是,稍后,当我查看电池统计数据时,我的应用程序被列为2-3%的排放量。 即使没有呼叫,这个百分比也在增加 – 因此接收器不工作。
这个电池耗尽来自哪里? 启动接收器的活动不起作用(无论如何它都是单个复选框)。 我想, sensorManager.unregisterListener(this);
可能不会被sensorManager.unregisterListener(this);
取消注册sensorManager.unregisterListener(this);
,但是它应该工作 – 当我收到第一个事件时我取消注册听众,这是有道理的。
我怎么能解决这个问题?
这个电池耗尽来自哪里?
从来没有永远不会永远不会永远不会在onReceive()
注册的BroadcastReceiver
超越onReceive()
。 IOW,您无法从清单注册的BroadcastReceiver
安全地注册SensorListener
。
请让您的BroadcastReceiver
委托工作到Service
(通过startService()
),在onStartCommand()
注册SensorListener
。 当您获得传感器读数时,或超时后(提示:电话并不总是改变方向),或者在onDestroy()
(如果Android决定关闭您的服务),取消注册监听器并调用stopSelf()
关闭服务。