我之前编写了一个带有位置监听器的应用程序,但没有实际设备来测试。现在我有了一个Gingerbread手机(2.3.3),我的应用程序如预期一样会消耗大量电池。
我开始研究requestLocationUpdates中的更新时间和最小距离参数对电池消耗的影响,因为文档说这些参数会影响电池消耗。
我曾经想知道仅仅调整这些参数如何影响电池消耗,因为据我所见,GPS必须保持开启状态,以便知道设备移动的距离,只有通知应用程序的实际过程会改变,而芯片将继续使用电力。
这篇文章《了解Android中的LocationListener》提出了一个可信的解释,表明状态会变为“暂时不可用”,GPS图标会在一段时间内消失,直到根据指定的更新周期再次打开。
但是,在我的手机上并没有发生这种情况-即使更新周期为90秒,GPS图标也保持开启状态,我没有收到任何状态更改的消息,根据文章末尾的一些帖子,其他人也发现了同样的问题。
是否有SO上的用户与2.3.3遇到了同样的问题?
或者Android已经放弃管理GPS芯片,期望用户为GPS编写自己的电池管理方案?
有关信息,我演示此行为的最小代码如下:
public class GpsTimeOutTestActivity extends Activity implements
LocationListener {
private LocationManager mLocMgr;
private long mUpdatePeriod = 90000; // 90 seconds
private float mMinDistance = 10.0f;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onResume() {
super.onResume();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
mUpdatePeriod, mMinDistance, (LocationListener) this);
}
@Override
protected void onPause() {
mLocMgr.removeUpdates((LocationListener) this);
super.onPause();
}
@Override
public void onLocationChanged(Location loc) {
String str = null;
NumberFormat formatter = new DecimalFormat("##0.000");
String fLat = formatter.format(loc.getLatitude());
String fLon = formatter.format(loc.getLongitude());
String provider = loc.getProvider();
provider = (provider == null) ? "No provider" : provider;
str = "Locn chg " + provider + " Lat/Lon " + fLat + "/" + fLon;
if (loc.hasAccuracy())
str+= " accy " + loc.getAccuracy();
showSomeOutput(str);
}
@Override
public void onProviderDisabled(String provider) {
String str = "Prov disabled " + provider;
showSomeOutput(str);
}
@Override
public void onProviderEnabled(String provider) {
String str = "Prov enabled " + provider;
showSomeOutput(str);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
String str = "Status chg " + provider;
switch (status) {
case android.location.LocationProvider.OUT_OF_SERVICE:
str+= " OUT OF SERVICE";
break;
case android.location.LocationProvider.AVAILABLE:
str+= " AVAILABLE";
break;
case android.location.LocationProvider.TEMPORARILY_UNAVAILABLE:
str+= " TEMPORARILY UNAVAILABLE";
break;
default:
str+= " UNKNOWN STATUS";
}
showSomeOutput(str);
}
private void showSomeOutput(String str) {
Log.d("GPSTEST", str);
EditText et = (EditText) findViewById(R.id.editText1);
Editable existingText = et.getText();
existingText.append("\n" + str);
}
}
欢迎提出任何评论。