我以前编写过一个应用程序,它有一个位置侦听器,但无法访问真正的设备。现在我有了一个姜饼手机(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并节省电源。

10-07 19:50
查看更多