requestLocationUpdates参数对Gingerbread设备没有影响

时间:2011-10-03 15:46:48

标签: android

我之前使用位置监听器编写了一个应用程序,无法访问真实设备。现在我有一个姜饼手机(2.3.3),正如预期的那样,我的应用程序是电池杀手。

我开始检查更新时间和最小距离参数对requestLocationUpdates的影响,因为文档说这会影响电池消耗。

我想知道如何调整这些参数会影响电池消耗,据我所知,GPS必须保持开启状态,以便了解设备移动的距离以及通知应用程序的实际过程当芯片继续使用电源时会发生变化。

这篇文章Understanding the LocationListener in Android提出了一个可靠的解释,表明状态会变为“暂时不可用”,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);
    }
}

将非常感谢所有评论。

2 个答案:

答案 0 :(得分:5)

如果你深入了解GPS provider的内部,你会发现Android告诉本机驱动程序最短的更新时间。然后本机驱动程序可以决定做什么 - 根据我的经验,他们都忽略了这一点并继续全速运行。

这很烦人,但并没有完全违反javadocs

  

可以使用minTime和minDistance参数控制通知频率。如果minTime大于0,则LocationManager 可能可能在位置更新之间保持minTime毫秒以节省电量

(强调补充)

解决方案是仅根据需要注册LocationListener。如果在添加requestSingleUpdate之前需要定位API,则必须注册监听器,然后在对位置质量感到满意时取消注册。这将关闭GPS并节省电量。

答案 1 :(得分:0)

如果您正在收听gps,则无论您设置的间隔是什么,图标都会显示在菜单栏中。假设设置通知时间和距离只会在满足这些阈值时提醒您的应用程序,这是正确的。芯片必须保持开启以提醒您更改。

您的应用程序需要不断更新gps吗?我通常使用requestSingleUpdate函数来获取gps位置。