我以前编写过一个应用程序,它有一个位置侦听器,但无法访问真正的设备。现在我有了一个姜饼手机(2.3.3),正如预期的那样,我的应用程序是一个电池杀手。
我开始研究update time和minimum distance参数对requestlocationupdates的影响,因为文档中说这些参数会影响电池消耗。
我一直想知道,只要调整这些参数就可以影响电池消耗,因为我可以看到GPS必须保持开启状态,以便知道设备移动了多远,只有在芯片继续使用电源时,通知应用程序的实际过程才会改变。
本文提出了一个可信的解释,即状态将变为“暂时不可用”,GPS图标将从屏幕上消失一段时间,直到需要根据指定的更新周期重新打开为止。
这不会发生在我的手机上——GPS图标即使在90秒的更新周期内也会保持打开,我不会得到任何状态更改,根据文章末尾的一些帖子,其他人也会发现相同的情况。
上的任何用户是否体验了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);
}
}
我们将非常感谢您的评论。
最佳答案
如果您深入研究GPS provider的内部,您会发现android告诉本机驱动程序最短的更新时间。本地司机可以决定做什么-以我的经验,他们都无视这一点,继续全速行驶。
这很烦人,但并不完全违反javadocs:
通知的频率可以使用mintime和mindistance参数来控制。如果mintime大于0,locationmanager可能会在位置更新之间停留mintime毫秒以节省电源
(强调)
解决方案是根据需要只注册LocationListener。如果在添加requestsingleupdate之前需要以api为目标,则必须注册侦听器,然后在对位置的质量满意时注销它。这将关闭GPS并节省电源。