BroadcastReceiver的一个监听器水渠电池在不使用时 [英] BroadcastReceiver with a Listener drains battery when not in use

查看:116
本文介绍了BroadcastReceiver的一个监听器水渠电池在不使用时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个接收器,等待 TelephonyManager.ACTION_PHONE_STATE_CHANGED

 公共无效的onReceive(上下文的背景下,意图意图){
串theAction = intent.getAction();
如果(theAction = NULL和放大器;!&安培; theAction.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
        CONTEXT =背景;
        startListening();
}
 

当它得到它,我注册了监听器(用于方向传感器):

 公共无效startListening(){
    的SensorManager =(的SensorManager)CONTEXT.getSystemService(Context.SENSOR_SERVICE);
    名单<传感器>传感器= sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
    如果(sensors.size()大于0){
        传感器= sensors.get(0);
        运行= sensorManager.registerListener(sensorEventListener,传感器,SensorManager.SENSOR_DELAY_FASTEST);
    }
}
 

,然后在听者的 onSensorChanged()方法:

 公共无效onSensorChanged(SensorEvent事件){
    如果(运行){
        sensorManager.unregisterListener(本);
        //做一些不显著的东西在这里
    }
 

而现在的问题:我接到一个电话,接收器开始,然后侦听器开始,一切都会按设计。但是,后来,当我看到在电池的统计,我的应用程序被列为一个与排水2-3%。 的这一比例还在不断增加的尽管的无呼叫 - 因此,接收器的不是的工作

在哪里这个电池消耗从何而来?这将启动接收器的活动不工作(它是一个复选框反正)。我想,听者可能无法获得注册的由 sensorManager.unregisterListener(本); ,但它shoudl工作 - 我注销监听器,当它接收到的第一个事件,它使感。

我怎么能解决这个问题?

解决方案
  

在哪里这个电池消耗从何而来?

永远永远永远永远永远永远永远永远永远永远永远永远有东西在清单注册的BroadcastReceiver 活过<$ ​​C $ C>的onReceive() 。 IOW,你不能安全地注册 SensorListener 从清单注册的BroadcastReceiver

请有你的的BroadcastReceiver 工作委托给一个服务(通过 startService()),其中,在 onStartCommand()您注册 SensorListener 。当你得到一个传感器读数,或超时后(提示:手机不经常改变方向),或在的onDestroy()(Android是否决定要关闭服务),注销监听器和呼叫 stopSelf()关闭该服务。

I have a receiver which waits for 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();   
}

When it gets it, I register the listener (for orientation sensor):

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);
    }
}   

And then, in the Listener's onSensorChanged() method:

public void onSensorChanged(SensorEvent event) {
    if(running) {   
        sensorManager.unregisterListener(this);
        // do some not significant stuff here
    }

And now the problem: I get a phone call, receiver starts, then listener starts and everything works as designed. But, later on, when I look at the battery stats, my app is listed as the one with 2-3% of drain. And this percentage is increasing even though there are no calls - hence the receiver is not working.

Where does this battery drain come from? The activity which starts the receiver is not working (and it is single checkbox anyway). I suppose, that the listener may not get unregistered by sensorManager.unregisterListener(this);, but it shoudl work - I unregister the listener when it received the first event, it makes sense.

How could I solve the problem?

解决方案

Where does this battery drain come from?

Never never never never never never never never have something in a manifest-registered BroadcastReceiver live beyond onReceive(). IOW, you cannot safely register a SensorListener from a manifest-registered BroadcastReceiver.

Please have your BroadcastReceiver delegate work to a Service (via startService()), where in onStartCommand() you register the SensorListener. When you get a sensor reading, or after a timeout (hint: phones don't always change orientation), or in onDestroy() (if Android decides to shut down your service), unregister the listener and call stopSelf() to shut down the service.

这篇关于BroadcastReceiver的一个监听器水渠电池在不使用时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆