我运行我的应用程序,它使用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");
}
答案 0 :(得分:0)
您正在OnStart上添加GPS侦听器和蓝牙,并在onDestroy()上删除它们。如果您的活动进入Stop状态(因为您启动了另一个活动),然后返回到执行初始化的那个,而没有调用onDestroy,那么这可能会导致多次调用监听器和蓝牙初始化而不先停止它们。
但是,我认为这不会导致GPS出现问题,因为您只在活动中定义了一次监听器,我希望GPS监听器添加例程来测试并避免添加两次相同的监听器。此外,如果退出应用程序后GPS正在运行,您应该会在手机顶部状态栏中看到GPS图标。
您没有显示蓝牙代码,因此您可能遇到问题。
将初始化代码移动到onResume()并将代码停止到onPause()会解决问题,否则你需要进行测试以避免连续两次初始化而不停止。
祝你好运。