1

我有一个接收器等待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);,但它应该可以工作 - 我在侦听器收到第一个事件时注销它,这是有道理的。

我该如何解决这个问题?

4

1 回答 1

5

这种电池消耗从何而来?

Never never never never never never never never never never never have something in an manifest-registered BroadcastReceiverlive beyond永远永远永远永远永远永远永远永远不会在清单上注册的生活中拥有某些东西onReceive()。IOW,您不能安全地SensorListener从 manifest-registered 注册a BroadcastReceiver

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

于 2011-07-30T17:41:38.077 回答