我正在制作一款使用GPS跟踪系统的Android应用程序,但它使用大量电池,如何优化我的应用程序以降低电池使用量?如何优化我的应用程序以降低电池使用量?
-2
A
回答
1
这真的取决于你的场景。
您需要考虑尽可能地“减少”应用程序中的GPS使用,与您的功能成比例。例如,如果您的应用程序只需要将设备的跟踪“点”发送到服务器 - 您可以打开GPS,使当前位置“快照”,然后关闭GPS或暂停GPS等。 ..
你的问题没有通用的解决方案,你需要在这里做一点思考:)。
2
您需要配置刷新位置之后的时间。请参阅给定类中的常量。
MIN_TIME_BW_UPDATES和 MIN_DISTANCE_CHANGE_FOR_UPDATES
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
public class GPSTracker extends Service implements LocationListener {
private final Context mContext;
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location networklocation; // location
Location gpslocation; // location
double latitude; // latitude
double longitude; // longitude
float accuracy;
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
private static final float HOW_ACCURATE = 50;
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
float currentAccuracy = HOW_ACCURATE + 1;
int returnWhat = 0;
try {
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
networklocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (networklocation != null) {
this.latitude = networklocation.getLatitude();
this.longitude = networklocation.getLongitude();
currentAccuracy = networklocation.getAccuracy();
returnWhat = 1;
}
}
}
if (isGPSEnabled) {
if (networklocation == null
|| currentAccuracy > HOW_ACCURATE) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
gpslocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (gpslocation != null) {
//Toast.makeText(mContext, "GPS Accuracy: "+gpslocation.getAccuracy()+", Current Accuracy: "+currentAccuracy, Toast.LENGTH_LONG).show();
if (gpslocation.getAccuracy() < currentAccuracy) {
this.latitude = gpslocation.getLatitude();
this.longitude = gpslocation.getLongitude();
returnWhat = 2;
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (returnWhat == 1) {
Toast.makeText(mContext, "Getting location from Network", Toast.LENGTH_LONG).show();
gpslocation = null;
this.accuracy = networklocation.getAccuracy();
return networklocation;
} else if (returnWhat == 2) {
Toast.makeText(mContext, "Getting location from GPS", Toast.LENGTH_LONG).show();
networklocation = null;
this.accuracy = gpslocation.getAccuracy();
return gpslocation;
} else {
return null;
}
}
public float getLocAccuracy() {
return this.accuracy;
}
public void stopUsingGPS() {
if (locationManager != null) {
locationManager.removeUpdates(GPSTracker.this);
}
}
public double getLatitude() {
return this.latitude;
}
public double getLongitude() {
return this.longitude;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
public void showSettingsAlert() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
// 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);
mContext.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();
}
@Override
public void onLocationChanged(Location location) {
}
@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 arg0) {
return null;
}
}
相关问题
- 1. 优化动态壁纸应用程序以便高效使用电池(降低电池使用量)
- 2. Android应用程序:降低电池使用率
- 3. 如何优化Android应用程序的电池使用情况
- 4. 如何降低我的应用程序的内存使用量?
- 5. 如何降低基于位置的应用程序的电池消耗
- 6. 降低FPS以在iPhone opengl-ES应用程序中节省电池寿命?
- 7. 如何降低基于位置的Android应用程序的用电量?
- 8. 如何降低iPhone的电池消耗,同时利用GPS
- 9. Android的电池电量低
- 10. iphone应用程序允许使用多少电池电量?
- 11. 使用BroadcastReceiver检查电池电量但应用程序崩溃?
- 12. 如何计算Meego OS中特定应用程序使用的电池电量?
- 13. 降低电池消耗的Android
- 14. 如何在ios下测量我的应用程序的电池消耗量?
- 15. Android电池应用程序
- 16. Android电池优化
- 17. 如何使用RequireJS优化器优化我的应用程序以不再使用RequireJS?
- 18. 我们可以优化代码以降低功耗吗?
- 19. 检查电池优化是否已启用或不适用于应用程序
- 20. 如何减少应用程序的电池使用情况?
- 21. 我的应用程序在背景中耗尽大量电池
- 22. 如何设计耗电量较低的移动应用程序?
- 23. 降低多处理的进程优先级。在Windows上的池
- 24. 如何在我的应用程序中获取电池信息?
- 25. 节流(降低)在Spring应用程序
- 26. 如何将我的应用归类为电池电量不足?
- 27. 如何分析android应用程序的电池使用情况并对其进行优化?
- 28. 优化我的游戏应用程序
- 29. 如何使用BatteryStatsHelper获取应用程序电池信息?
- 30. iOS应用程序检查背景中的电池电量
非常感谢我解决了这个问题,现在我面临的新问题是我的标记被拖动的很好,但是我希望标记随着设备移动而不断移动,而不是继续更新其位置 –
是的,我认为你在这里有两个选择(如果你想保持电池使用率低),你可以保持视图更新的原样,或者你可以计算标记的“潜在”移动并在“快照”三角洲之间绘制。因此,用户将获得流畅的动画体验,但动作会被伪造... –