位置根据设备状态更新

Rit*_*itu 8 java android location google-api activity-recognition

我需要在ActivityRecognition Detect用户状态(每隔3分钟调用一次)之后获取用户的位置(通过fusionlocation API),如IN_VEHICLE,ON_FOOT,RUNNING等.

在每个事件上,我需要定期间隔后的用户位置例如:

如果用户仍然是,那么setInterval(5*60*60*1000);在5小时之前检查下一个位置更新.但ActivityRecognation将每3分钟调用一次.

如果用户正在运行,则setInterval(2*60*1000);在2分钟之前/之后检查下一个位置更新.但ActivityRecognation将每3分钟调用一次.

如果用户正在运行,则如果用户正在驾驶,则每隔1分钟发送一个位置,然后每15分钟发送一次位置.

我试图onConnected在类级别将boolean false设置为false和true.但它总是变成真实的,因为整个Intent服务在3分钟后被调用.

if (startLocationFirst){
requestLocatonSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); 
  LocationAPIclient.connect();// RequestLocation and GoogleAPIClient won't call until device comes from another ActivityRecognation State running,walking etc. And keep Updating location every 5 hours.
              }
Run Code Online (Sandbox Code Playgroud)

问题我现在有

  • ActivityRecognation每3分钟获取一次用户状态,但它不应该进入startLocationFirst布尔值,直到它来自另一个ActivityRecognation状态并保持更新位置设置为内部startLocationFirst

这是带有FusedLocation的IntentService

public class Activity_Recognized_Service extends IntentService implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks, LocationListener {
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public static final String TAG = "###RECOGNISED SRVCE###";
    Timer timer;
    GoogleApiClient LocationAPIclient;
    LocationRequest mLocationRequest;
    Location mCurrentLocation;
    boolean startLocationFirst=true;


    public Activity_Recognized_Service() {
        super("Activity_Recognized_Service");
    }

    public Activity_Recognized_Service(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d(TAG, "On Handle Intent");
        if (ActivityRecognitionResult.hasResult(intent)) {
            Log.d(TAG, "ActivityRecognition Has Result");
            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            handleDetectedActivities(result.getProbableActivities());
            Navigation_Drawer nav = new Navigation_Drawer();
            nav.UserMovementResult(result);

        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"On Create Calling");
        if (LocationAPIclient == null) {
            Log.d(TAG, "Location API is NULL Value Of This ");
            LocationAPIclient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
        }

    }

    private void handleDetectedActivities(List<DetectedActivity> probableActivities) {

        for (DetectedActivity activity : probableActivities) {
            switch (activity.getType()) {
                case DetectedActivity.IN_VEHICLE:
                    Log.d(TAG, "In Vehicle " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("In Vehicle");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(10*60*1000,8*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                        if (startLocationFirst){
                            Log.d(TAG,"Start Location Update For Car");
                        }
                    }
                    break;
                case DetectedActivity.ON_BICYCLE:
                    Log.d(TAG, "On Bicycle " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("On Bicycle");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(7*60*1000,5*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                    }
                    break;
                case DetectedActivity.ON_FOOT:
                    Log.d(TAG, "On Foot " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("On Foot");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                    }
                    break;
                case DetectedActivity.RUNNING:
                    Log.d(TAG, "On Running " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Running");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                    }
                    break;
                case DetectedActivity.STILL:
                    Log.d(TAG, "On Still " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Still");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());

                            requestLocatonSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                          //  requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                            LocationAPIclient.connect();


                    }
                    break;
                case DetectedActivity.TILTING:
                    Log.d(TAG, "On Tilting " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Tilting");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());

                        requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                    }
                    break;
                case DetectedActivity.WALKING:
                    Log.d(TAG, "On Walking " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Let's Walk");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        LocationAPIclient.connect();

                    }
                    break;
                case DetectedActivity.UNKNOWN:
                    Log.d(TAG, "UnKnown " + activity.getConfidence());
                    break;
            }
        }
    }

    public void setTimer(int Minutes) {
        Log.d(TAG, "==================================================");
        Log.d(TAG, "Set Timeer Starts It will Run Every " + Minutes);
        int MilliSeconds = 60000 * Minutes;
        final Handler handler = new Handler();
        timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        try {
                            //CODE THAT YOU WANT TO EXECUTE AT GIVEN INTERVAL


                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                        }
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, 0, MilliSeconds);
        Log.d(TAG, "==================================================");
    }


    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.d(TAG, "On Connected Running");
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
         mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(LocationAPIclient);
        if (mCurrentLocation!=null){
            Log.d(TAG,"Last Known Location Is not Null ");
            new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
        }
        else {
            Log.d(TAG,"Last Known Location Is NULL Start Location Updates");
            LocationServices.FusedLocationApi.requestLocationUpdates(LocationAPIclient,mLocationRequest,this);
        }

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onLocationChanged(Location location) {
        Log.d(TAG,"On Location Changed Calling");
        mCurrentLocation=location;
        new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
        Log.d(TAG,"Stopping Location Update");
       // LocationServices.FusedLocationApi.removeLocationUpdates(LocationAPIclient,this);
    }

    public void requestLocatonSetting(int Interval,int FastestInterval,int LocationAccuracy){
        mLocationRequest=new LocationRequest();
        mLocationRequest.setInterval(Interval);
        mLocationRequest.setFastestInterval(FastestInterval);
        mLocationRequest.setPriority(LocationAccuracy);

    }

}
Run Code Online (Sandbox Code Playgroud)

Pab*_*ter 1

编辑

这是一个仅使用您上面提供的代码的更好示例:

注册 ActivityRecognitionApi 时使用此服务:

public class LocationUpdateService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    public static final String TAG = "###RECOGNISED SRVCE###";

    private GoogleApiClient apiClient;
    private PendingIntent pendingIntent;
    private DetectedActivity lastActivity;

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

    @Override
    public void onCreate() {
        apiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        apiClient.connect();
        pendingIntent = PendingIntent.getService(this, 1, new Intent(this, YourIntentService.class), PendingIntent.FLAG_UPDATE_CURRENT);
    }

    @Override
    public int onStartCommand(Intent intent, int flag, int startId) {
        Log.d(TAG, "onStartCommand");
        if (ActivityRecognitionResult.hasResult(intent)) {
            Log.d(TAG, "ActivityRecognition Has Result");
            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            handleDetectedActivity(result);

            /* You should really use LocalBroadcastManager to send events out to an activity for UI updates */

//            Navigation_Drawer nav = new Navigation_Drawer();
//            nav.UserMovementResult(result);
        }
        return START_STICKY;
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.d(TAG, "On Connected Running");
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        Location location = LocationServices.FusedLocationApi.getLastLocation(apiClient);
        if (location!=null){
            Log.d(TAG,"Last Known Location Is not Null ");
            Intent intent = new Intent(this, YourIntentService.class).putExtra("lastKnown", location);
            startService(intent);

            /* No more need for this! */
//            new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
        }
        else {
            Log.d(TAG,"Last Known Location Is NULL Start Location Updates");
            updateLocationSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY);
//            LocationServices.FusedLocationApi.requestLocationUpdates(apiClient,mLocationRequest,this);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    private void handleDetectedActivity(ActivityRecognitionResult result) {
        DetectedActivity mostProbableActivity = result.getMostProbableActivity();
        switch (result.getMostProbableActivity().getType()) {
            case DetectedActivity.IN_VEHICLE:
//                    Log.d(TAG, "In Vehicle " + activity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                        builder.setContentText("In Vehicle");
//                        builder.setSmallIcon(R.drawable.elaxer_x);
//                        builder.setContentTitle("Elaxer");
//                        NotificationManagerCompat.from(this).notify(0, builder.build());
                    //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                    if (apiClient.isConnected()) {
                        updateLocationSetting(10 * 60 * 1000, 8 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;
            case DetectedActivity.ON_BICYCLE:
                Log.d(TAG, "On Bicycle " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("On Bicycle");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());
                    if (apiClient.isConnected()) {
                        updateLocationSetting(7 * 60 * 1000, 5 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;

            case DetectedActivity.ON_FOOT:
                Log.d(TAG, "On Foot " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75) {
                    DetectedActivity nextHighest = result.getProbableActivities().get(1);
                    if (nextHighest.getType() == DetectedActivity.RUNNING && nextHighest != lastActivity) {
                        Log.d(TAG, "On Running " + mostProbableActivity.getConfidence());
                        //Send Notification To User
//                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                        builder.setContentText("Running");
//                        builder.setSmallIcon(R.drawable.elaxer_x);
//                        builder.setContentTitle("Elaxer");
//                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        if (apiClient.isConnected()) {
                            updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                            lastActivity = nextHighest;
                        }
                    }
                    else if (nextHighest.getConfidence() >= 75 && nextHighest != lastActivity) {
                        Log.d(TAG, "On Walking " + mostProbableActivity.getConfidence());
                        //Send Notification To User
//                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                        builder.setContentText("Let's Walk");
//                        builder.setSmallIcon(R.drawable.elaxer_x);
//                        builder.setContentTitle("Elaxer");
//                        NotificationManagerCompat.from(this).notify(0, builder.build());

                        if (apiClient.isConnected()) {
                            updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                            lastActivity = nextHighest;
                        }
                    }
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("On Foot");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());
                }
                break;
            case DetectedActivity.STILL:
                Log.d(TAG, "On Still " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("Still");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());

                    if (apiClient.isConnected()) {
                        updateLocationSetting(5 * 60 * 60 * 1000, 3 * 60 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;
            case DetectedActivity.TILTING:
                Log.d(TAG, "On Tilting " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("Tilting");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());

                    if (apiClient.isConnected()) {
                        updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;
//            case DetectedActivity.WALKING:
//                Log.d(TAG, "On Walking " + mostProbableActivity.getConfidence());
//                if (mostProbableActivity.getConfidence() >= 75) {
//                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("Let's Walk");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());
//
//                    if (apiClient.isConnected()) {
//                        updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
//                    }
//                }
//                break;
            case DetectedActivity.UNKNOWN:
                Log.d(TAG, "UnKnown " + mostProbableActivity.getConfidence());
                lastActivity = mostProbableActivity;
                break;
        }
    }

    private void updateLocationSetting(int Interval, int FastestInterval, int LocationAccuracy) {
        LocationRequest request = new LocationRequest();
        request.setInterval(Interval);
        request.setFastestInterval(FastestInterval);
        request.setPriority(LocationAccuracy);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_DENIED) {
            //TODO DO SOMETHING HERE!
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, pendingIntent);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将是要使用的 IntentService,而不是使用您正在使用的 AsyncTask:

public class YourIntentService extends IntentService {

    public YourIntentService() {
        super("YOUR_INTENT_SERVICE");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        if (intent != null) {
            if (LocationResult.hasResult(intent)) {
                LocationResult result = LocationResult.extractResult(intent);
                Location location = result.getLastLocation();
                Log.d("YourIntentService", "Got new location: " + location);
            }
            else if (intent.hasExtra("lastKnown")) {
                Location location = intent.getParcelableExtra("lastKnown");
                Log.d("YourIntentService", "Got last known location: " + location);
            }
            else if (LocationAvailability.hasLocationAvailability(intent)) {
                LocationAvailability locationAvailability = LocationAvailability.extractLocationAvailability(intent);
                Log.d("YourIntentService", "Location Availability: " + locationAvailability.isLocationAvailable());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只要在onHandleIntent.

我对handleDetectedActivity代码进行了一些修改,以便在每次活动更新时都不会发生新的位置更新。


首先,我不建议您使用IntentService现在的方式,因为服务一旦退出就会被终止onHandleIntent,这会导致很多问题,因为您依赖于回调。所有这些都应该放入 aService中。

至于基于活动识别处理位置更新,我确实发现了这个不错的库,它简化了这一过程并且非常易于使用。https://github.com/mrmans0n/smart-location-lib

以下是如何使用该库并根据活动结果进行位置更新的示例。

SmartLocation.with(this).location(new LocationBasedOnActivityProvider(new LocationBasedOnActivityProvider.LocationBasedOnActivityListener() {
    @Override
    public LocationParams locationParamsForActivity(DetectedActivity detectedActivity) {
        if (detectedActivity.getConfidence() >= 75) {
            LocationParams.Builder builder = new LocationParams.Builder();
            switch (detectedActivity.getType()) {
                case DetectedActivity.IN_VEHICLE:
                    builder.setInterval(/*Interval*/)
                            .setAccuracy(/*Locaiton Accuracy*/);
                    break;

                case DetectedActivity.ON_BICYCLE:
                    /* So on and so forth.... */

                    break;
            }
            return builder.build();
        }
        return null;
    }
})).start(new OnLocationUpdatedListener() {
    @Override
    public void onLocationUpdated(Location location) {
        //Do what you need here.
    }
});
Run Code Online (Sandbox Code Playgroud)

这应该放入Service函数中onStart,并onStartCommand根据您提供的意图额外处理更改。您还可以使用此库来获取最后的已知位置,并获得单个修复。

AsyncTask最后一件事,如果您向其传递上下文,我建议您远离。相反,请使用IntentService,因为该onHandleIntent函数在后台线程中运行,并且您可以使用 的IntentService上下文来执行您需要的任何任务。当您Location启动IntentService.