如何在应用程序最小化时保持服务运行

时间:2018-01-10 12:53:16

标签: java android service

我正在开发一个跟踪用户位置的应用。 我已经实现了一个管理位置请求部分的自定义服务,它在每个Activity中都可以正常工作。该服务甚至出现在“正在运行的服务”中。设置面板。

当我最小化应用程序或锁定屏幕时,问题就开始了。

我希望的效果是即使应用程序最小化或屏幕被锁定也会继续接收位置更新,但当用户从最近的应用程序中滑动应用程序时,请停止所有相关应用程序(确切地说Google地图或Waze的行为方式 - 显示应用程序最小化时的通知 - 可以直接从通知中关闭应用程序)。

我已经尝试了很多建议的解决方案,唯一一个接近的是startForegroundService(),但即使应用程序被解除,也不会停止服务。

我正在使用Google Pixel(8.1)和5.0和8.0的模拟器进行测试。

Min SDK版本:21。目标SDK版本:26。

到目前为止,这是我的代码:

的AndroidManifest.xml

<service android:name=".logic.service.LocationService"/>

MainActivity.java

if (checkNeedLocationPermission(this)) {
        startService(new Intent(getBaseContext(), LocationService.class));
    }

LocationService.java

public class LocationService extends Service {

private FusedLocationProviderClient fusedLocationProviderClient;
private LocationRequest locationRequest;
private LocationCallback locationCallback;

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

@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
    startFusedLocationProviderClient();
    return START_STICKY;
}

@Override
public void onDestroy() {
}

/**
 * Configures and starts Google Api Client for location services.
 */
private void startFusedLocationProviderClient() {
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

    getCurrentLocation();
}

/**
 * Gets the current location of the device.
 */
@SuppressLint("MissingPermission")
private void getCurrentLocation() {
    createLocationRequestAndCallback();

    fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, null);
}

/**
 * Creates the location request with the specified settings.
 */
private void createLocationRequestAndCallback() {
    locationRequest = new LocationRequest();
    locationRequest.setInterval(LOCATION_REQUEST_INTERVAL);
    locationRequest.setFastestInterval(LOCATION_REQUEST_FASTEST_INTERVAL);
    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(final LocationResult locationResult) {
            for (Location location : locationResult.getLocations()) {
                Log.d("lat", String.valueOf(location.getLatitude()));
            }
        }
    };
}

在上面的类中,LocationService.java,Log.d("lat", String.valueOf(location.getLatitude()));在应用程序最小化或屏幕被锁定时停止记录。

任何帮助或建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

从Android Oreo开始,由于引入了后台服务限制,因此无法执行此操作。请参阅documentation

但是对于低于26的API级别,您可以通过设置

来实现此目的
 <service
            android:name=".YourLocationService"
            android:exported="false"
            android:process=":YourLocationService"
            android:stopWithTask="false" />

@Override
    public void onTaskRemoved(Intent rootIntent) {

        Intent restartService = new Intent(getApplicationContext(), this.getClass());
        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME, 5000, pendingIntent);


    }