我有一个等待TelephonyManager.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<Sensor> 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);
取消注册,但是它会工作 - 我在收到第一个事件时取消注册听众,这是有意义的。
我怎么能解决这个问题?
答案 0 :(得分:5)
这个电池耗尽来自哪里?
永远不会永远不会永远不会永远不会在BroadcastReceiver
以外的明确注册onReceive()
生活中拥有某些东西。 IOW,您无法安全地从已注册的清单SensorListener
注册BroadcastReceiver
。
请让您的BroadcastReceiver
代表工作到Service
(通过startService()
),在onStartCommand()
注册SensorListener
。当您获得传感器读数时,或超时后(提示:电话并不总是改变方向),或onDestroy()
(如果Android决定关闭您的服务),取消注册监听器并呼叫{{1}关闭服务。