带有监听器的BroadcastReceiver在不使用时会耗尽电池电量

jac*_*cek 1 java android battery broadcastreceiver

我有一个等待的接收器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();   
}
Run Code Online (Sandbox Code Playgroud)

当它得到它,我注册听众(为方向传感器):

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);
    }
}   
Run Code Online (Sandbox Code Playgroud)

然后,在Listener的onSensorChanged()方法中:

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

现在问题是:我接到电话,接收器启动,然后听众启动,一切按设计工作.但是,稍后,当我查看电池统计数据时,我的应用程序被列为2-3%的排放量.即使没有呼叫,这个百分比也在增加- 因此接收器工作.

这个电池耗尽来自哪里?启动接收器的活动不起作用(无论如何它都是单个复选框).我想,听众可能不会被注册sensorManager.unregisterListener(this);,但它会工作 - 我在收到第一个事件时取消注册听众,这是有意义的.

我怎么能解决这个问题?

Com*_*are 5

这个电池耗尽来自哪里?

绝不会永远不会永远不会永远不会永远不会在明显的BroadcastReceiver现实生活中拥有一些东西onReceive().IOW,你不能安全地注册SensorListener一个清单注册的BroadcastReceiver.

请让您的BroadcastReceiver代表工作到Service(通过startService()),在哪里onStartCommand()注册SensorListener.当您获得传感器读数时,或超时后(提示:电话并不总是改变方向),或者onDestroy()(如果Android决定关闭您的服务),取消注册监听器并调用stopSelf()以关闭服务.

  • 我取消注册两次!首先,在`onSensorChanged()`:`sensorManager.unregisterListener(this);`和第二,在`onDestroy()`服务`sensorManager.unregisterListener(sensorEventListener);`.两种方法都被执行,但似乎这种取消注册不起作用,至少不总是......奇怪. (2认同)