0

我正在构建一项服务,如果位置在一段时间内没有改变一定米数,我会知道。

然后事情是我的onLocationChanged监听器上有事件..但我不知道如何做相反的事情..也就是说,如果位置在我提供的几分钟后的距离内,则发送广播。

这是我到目前为止的代码

定位服务

public class LocationService extends Service {

    public static final String LOC_INTENT = "com.xxx.intent.action.LOCATION";

    private Thread triggerService;
    protected LocationManager locationManager;
    protected MyLocationListener MyLocationListener;
    protected Criteria criteria;

    public static final int MIN_TIME = 300000; // 5 Minutes
    public static final long MIN_DISTANCE_MOTOR = 50; // 50 Metres

    private SharedPreferences settings;


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {

        settings = getSharedPreferences(getString(R.string.settings_prefsName), 0);
        addLocationListener();

        return START_STICKY;
    }

    private void addLocationListener()
    {
        triggerService = new Thread(new Runnable(){
            public void run(){
                try{
                    Looper.prepare();//Initialise the current thread as a looper.
                    locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

                    criteria = new Criteria();
                    criteria.setAccuracy(Criteria.ACCURACY_FINE);

                    final String PROVIDER = locationManager.getBestProvider(criteria, true);

                    updateLocation(getLastBestLocation(MIN_TIME, MIN_DISTANCE_MOTOR));

                    MyLocationListener = new MyLocationListener();
                    locationManager.requestLocationUpdates(PROVIDER, MIN_TIME, MIN_DISTANCE_MOTOR, MyLocationListener);
                    Log.d("LOC_SERVICE", "Service RUNNING! ("+PROVIDER+")");
                    Looper.loop();
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        }, "LocationThread");
        triggerService.start();
    }


    public Location getLastBestLocation(int minDistance, long minTime) {
        Location bestResult = null;
        float bestAccuracy = Float.MAX_VALUE;
        long bestTime = Long.MIN_VALUE;

        List<String> matchingProviders = locationManager.getAllProviders();
        for (String provider: matchingProviders) {
            Location location = locationManager.getLastKnownLocation(provider);
            if (location != null) {
                float accuracy = location.getAccuracy();
                long time = location.getTime();

                if ((time > minTime && accuracy < bestAccuracy)) {
                    bestResult = location;
                    bestAccuracy = accuracy;
                    bestTime = time;
                }
                else if (time < minTime && bestAccuracy == Float.MAX_VALUE && time > bestTime) {
                    bestResult = location;
                    bestTime = time;
                }
            }
        }

        return bestResult;
    }

    public static void updateLocation(Location location)
    {
        Context appCtx = MyApplication.getAppContext();

        double latitude, longitude;
        float speed;

        latitude = location.getLatitude();
        longitude = location.getLongitude();
        speed = location.getSpeed();

        Intent filterRes = new Intent();
        filterRes.setAction(LOC_INTENT);
        filterRes.putExtra("latitude", latitude);
        filterRes.putExtra("longitude", longitude);
        filterRes.putExtra("speed", speed);
        appCtx.sendBroadcast(filterRes);
    }


    class MyLocationListener implements LocationListener
    {

        @Override
        public void onLocationChanged(Location location)
        {
            if(settings.getBoolean("active", false))
                updateLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }

}
4

1 回答 1

1

设置一个计时器,无论您想测试多久。当它响起时,检查您进入的最后一个位置是否onLocationChanged超过计时器长度。

编辑

这是我想象的您的服务的样子

服务启动

服务运行

  • 当您的计时器关闭或被onLocationChanged调用时执行必要的操作

服务停止

于 2011-12-09T22:15:19.673 回答