即使应用程序关闭屏幕,电池也会耗尽,可能是位置服务吗?

时间:2012-09-30 21:35:33

标签: android

我运行我的应用程序,它使用GPS和蓝牙,然后点击后退按钮,使其关闭屏幕。我通过LogCat验证了app的onDestroy被调用了。 OnDestroy删除位置监听器并关闭我的应用程序的蓝牙服务。 8小时后我看了手机,电池电量已经消耗了一半,我的应用程序负责根据手机的电池使用屏幕。如果我使用手机的“设置”菜单强制停止应用程序,则不会发生这种情况。所以我的问题是:除了删除侦听器以阻止位置服务消耗能力之外,我还需要做些什么吗?这是我唯一可以想到的,当应用程序被认为处于休眠状态时,会将电池耗尽到那个程度。

这是我的onStart(),我打开与位置相关的东西和蓝牙:

@Override
public void onStart() {
    super.onStart();

    if(D_GEN) Log.d(TAG, "MainActivity onStart, adding location listeners");

    // If BT is not on, request that it be enabled.
    // setupBluetooth() will then be called during onActivityResult
    if (!mBluetoothAdapter.isEnabled()) {
        Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        // Otherwise, setup the Bluetooth session
    } else {
        if (mBluetoothService == null) 
            setupBluetooth();
    }
    // Define listeners that respond to location updates
    mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_UPDATE_INTERVAL, 0, this);    
    mLocationManager.addGpsStatusListener(this);
    mLocationManager.addNmeaListener(this);

}

这是我的onDestroy(),我将其删除:

public void onDestroy() {
    super.onDestroy();
    if(D_GEN) Log.d(TAG, "MainActivity onDestroy, removing update listeners");
    // Remove the location updates
    if(mLocationManager != null) {
        mLocationManager.removeUpdates(this); 
        mLocationManager.removeGpsStatusListener(this);
        mLocationManager.removeNmeaListener(this);
    }
    if(D_GEN) Log.d(TAG, "MainActivity onDestroy, finished removing update listeners");
    if(D_GEN) Log.d(TAG, "MainActivity onDestroy, stopping Bluetooth");
    stopBluetooth();
    if(D_GEN) Log.d(TAG, "MainActivity onDestroy finished");
}

1 个答案:

答案 0 :(得分:0)

您正在OnStart上添加GPS侦听器和蓝牙,并在onDestroy()上删除它们。如果您的活动进入Stop状态(因为您启动了另一个活动),然后返回到执行初始化的那个,而没有调用onDestroy,那么这可能会导致多次调用监听器和蓝牙初始化而不先停止它们。

但是,我认为这不会导致GPS出现问题,因为您只在活动中定义了一次监听器,我希望GPS监听器添加例程来测试并避免添加两次相同的监听器。此外,如果退出应用程序后GPS正在运行,您应该会在手机顶部状态栏中看到GPS图标。

您没有显示蓝牙代码,因此您可能遇到问题。

将初始化代码移动到onResume()并将代码停止到onPause()会解决问题,否则你需要进行测试以避免连续两次初始化而不停止。

祝你好运。