Android 定位服务 - 电池使用情况
Android Location Service - battery usage
我正在开发一个从一开始就使用定位服务的应用程序。我的 phone (Sony Z3 Compact) 在位置设置菜单中有一个使用位置服务的应用程序列表。每个应用程序都有 "battery usage" 消息,例如电池使用率低、电池使用率高等。我的应用程序列为 "High battery usage"。其他使用位置数据的应用程序(如 Tinder)将其设置为 "low battery usage"。
我想知道造成这种情况的原因以及节省电量的最佳方法是什么。我看到每个位置提供者都有一个 "battery usage" 数据。这是否意味着如果我只使用网络提供商而不是 GPS 提供商,我会得到 "low battery usage" 标记?
还是取决于请求位置更新?因为我只需要一次位置,但是我可能想检查用户是否已经移动,为此我需要打开位置更新。
对此有什么想法吗?
这是我正在使用的服务:
public class LocationTracker2 extends Service implements LocationListener {
protected Context context;
protected LocationManager locationManager;
protected OnLocationChanged event;
protected Location currentLocation;
public interface OnLocationChanged {
public void onLocationChanged(double latitude, double longitude);
}
public LocationTracker2(Context context, OnLocationChanged event) {
this.context = context;
this.event = event;
locationManager = (LocationManager)context.getSystemService(LOCATION_SERVICE);
}
public boolean canGetLocation() {
// getting GPS status
boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
return (isGPSEnabled || isNetworkEnabled);
}
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
context.startActivity(intent);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
public Location getCurrentLocation() {
if(currentLocation != null) return currentLocation;
List<String> providers = locationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location l = locationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
// Found best last known location: %s", l);
bestLocation = l;
}
}
if(bestLocation != null) {
currentLocation = bestLocation;
this.event.onLocationChanged(currentLocation.getLatitude(), currentLocation.getLongitude());
}
return currentLocation;
}
public void startLocationUpdates() {
Criteria criteria = new Criteria();
String bestProvider = locationManager.getBestProvider(criteria, false);
locationManager.requestLocationUpdates(bestProvider, 60000, 10, this);
}
public void stopLocationUpdates() {
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
this.currentLocation = location;
this.event.onLocationChanged(this.currentLocation.getLatitude(), this.currentLocation.getLongitude());
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
当您的应用使用 GPS 提供商时,它将被列为高使用率应用。网络提供商将被列为低使用率。
如果您仅将 GPS 提供商用于一点,您将被列为高使用率,但持续时间很短。
我可以为您推荐两个备选方案:
- 首先尝试使用 Passive Provider,如果此时其他应用正在使用定位服务,您也会收到它们的更新,但系统会将它们列为使用电池的应用。
- 使用 Google 播放位置客户端,它会在 Google 播放服务上列出电池使用情况,而不是在您身上。
我正在开发一个从一开始就使用定位服务的应用程序。我的 phone (Sony Z3 Compact) 在位置设置菜单中有一个使用位置服务的应用程序列表。每个应用程序都有 "battery usage" 消息,例如电池使用率低、电池使用率高等。我的应用程序列为 "High battery usage"。其他使用位置数据的应用程序(如 Tinder)将其设置为 "low battery usage"。
我想知道造成这种情况的原因以及节省电量的最佳方法是什么。我看到每个位置提供者都有一个 "battery usage" 数据。这是否意味着如果我只使用网络提供商而不是 GPS 提供商,我会得到 "low battery usage" 标记?
还是取决于请求位置更新?因为我只需要一次位置,但是我可能想检查用户是否已经移动,为此我需要打开位置更新。
对此有什么想法吗?
这是我正在使用的服务:
public class LocationTracker2 extends Service implements LocationListener {
protected Context context;
protected LocationManager locationManager;
protected OnLocationChanged event;
protected Location currentLocation;
public interface OnLocationChanged {
public void onLocationChanged(double latitude, double longitude);
}
public LocationTracker2(Context context, OnLocationChanged event) {
this.context = context;
this.event = event;
locationManager = (LocationManager)context.getSystemService(LOCATION_SERVICE);
}
public boolean canGetLocation() {
// getting GPS status
boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
return (isGPSEnabled || isNetworkEnabled);
}
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
context.startActivity(intent);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
public Location getCurrentLocation() {
if(currentLocation != null) return currentLocation;
List<String> providers = locationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location l = locationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
// Found best last known location: %s", l);
bestLocation = l;
}
}
if(bestLocation != null) {
currentLocation = bestLocation;
this.event.onLocationChanged(currentLocation.getLatitude(), currentLocation.getLongitude());
}
return currentLocation;
}
public void startLocationUpdates() {
Criteria criteria = new Criteria();
String bestProvider = locationManager.getBestProvider(criteria, false);
locationManager.requestLocationUpdates(bestProvider, 60000, 10, this);
}
public void stopLocationUpdates() {
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
this.currentLocation = location;
this.event.onLocationChanged(this.currentLocation.getLatitude(), this.currentLocation.getLongitude());
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
当您的应用使用 GPS 提供商时,它将被列为高使用率应用。网络提供商将被列为低使用率。
如果您仅将 GPS 提供商用于一点,您将被列为高使用率,但持续时间很短。
我可以为您推荐两个备选方案:
- 首先尝试使用 Passive Provider,如果此时其他应用正在使用定位服务,您也会收到它们的更新,但系统会将它们列为使用电池的应用。
- 使用 Google 播放位置客户端,它会在 Google 播放服务上列出电池使用情况,而不是在您身上。