向服务提供位置信息的最佳方式

时间:2013-04-02 12:29:43

标签: android gps android-location

我搜索了很多,我并不完全无能为力。我已经实现了一个临时解决方案但是想知道是否有更好的方法。

我有一个应用程序,每隔60秒就会将一个人的位置发送到服务器。在我的仪表板(应用程序启动后将转到 onPause 的主屏幕)上,我已使用以下代码注册 LocationManager

service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabled = service
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        if (!enabled)
        {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }
        else
        {
            Criteria criteria = new Criteria();
            provider = service.getBestProvider(criteria, false);
            service.requestLocationUpdates(provider, 10000, 50, this);

            Location location = service.getLastKnownLocation(provider);

            // Initialize the location fields
            if (location != null)
            {
                onLocationChanged(location);
            }
            else
            {
                Log.d("Location: ", "No update received");
            }
        }

但是,正如我所提到的,用户将最小化此活动(通过按主页按钮)。每隔60秒就会有一个由AlarmManager调用的服务。该服务从Dashboard Activity(lat,lon)访问静态变量并将其发送到服务器。

我的问题:

如果活动为onPause,requestLocationUpdates函数会停止吗?或者它会继续工作吗?

如果它继续工作,它将继续更新两个lat和lon静态String对象,服务将不断获取更新值。如果他们停止,服务将一次又一次地获得相同的旧值。

此外,有没有更好的方法来解决这个问题?使用GPS提供商和网络提供商的混合? (我需要相当准确的数值)。

修改

这是我的闹钟。此代码位于登录活动

Intent i = new Intent(con, LocationPoller.class);
                i.putExtra(LocationPoller.EXTRA_INTENT, new Intent(con,
                        Login.class));
                i.putExtra(LocationPoller.EXTRA_PROVIDER,
                        LocationManager.GPS_PROVIDER);

                gps = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

                PendingIntent pi = PendingIntent.getBroadcast(con, 0, i, 0);
                gps.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),
                        10 * 1000, pi);
                Log.d("Service: ",
                        "GPS Service started and scheduled with AlarmManager");

这是我的接收者(也在登录活动中)

private class ReceiveMessages extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Location loc = (Location) intent.getExtras().get(
                    LocationPoller.EXTRA_LOCATION);

            String msg;

            if (loc == null)
            {
                msg = intent.getStringExtra(LocationPoller.EXTRA_ERROR);
            }
            else
            {
                msg = loc.toString();
            }

            if (msg == null)
            {
                msg = "Invalid broadcast received!";
            }

            Log.d("GPS Broadcast: ", msg);
        }
    }

什么都没发生:s没有在logcat上得到任何东西,这意味着没有收到广播。

1 个答案:

答案 0 :(得分:1)

当活动暂停时,所有已注册的听众都将停止。实现这一点的更好方法是,警报管理器每隔60秒发送一次广播,此广播接收器启动服务,此服务将在Wakeful线程上请求一个位置,一旦检索到位置信息,就更新服务器上的位置。

有一个开源库可以举例(CommonsWare提供),请参考下面的链接。它在Apache 2.0许可下

Location Polling Library

请使用上面的库查找我的示例项目。我在上面的库中修改了一些东西并创建了我自己的版本。

Location Polling Demo Application