Сервис Android Oreo - событие изменения местоположения не запускается, когда приложение находится в фоновом режиме - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь создать службу, чтобы она продолжала работать, даже если приложение не на переднем плане. когда он находится на переднем плане, все работает хорошо, но после переключения с него onLocationChanged вызывается один раз каждые ~ 10 минут (вместо 5 секунд на переднем плане).

Цель состоит в том, чтобы продолжать сканировать местоположение и отправлять обновления для обработки, даже если приложение находится в фоновом режиме каждые 5 секунд (я хочу, чтобы служба продолжала работать, пока приложения пользовательского интерфейса не были полностью закрыты).

Я пытался следить за многими руководствами и сообщениями в сети, и ни одно из них не помогло решить эту проблему. В прошлом он работал нормально с Android 6.0, но я обновился до 8.0, и он перестал работать.

Это код, который я использую:

public class MainActivity extends AppCompatActivity {
    private Intent _scanServiceIntent;

    @Override
    public void onStart()
    {
        super.onStart();
        _scanServiceIntent = new Intent(this,ScanService.class);
        bindService(_scanServiceIntent, m_serviceConnection, BIND_AUTO_CREATE);
    }

    private ServiceConnection m_serviceConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            _scanService = ((ScanService.ScanServiceBinder)service).getService();
        }

        public void onServiceDisconnected(ComponentName className) {
            Log.v("lsx", "onServiceDisconnected");
            _scanService = null;
        }
    };
}


This is the ScanService class:


public class ScanService extends Service {

    private LocationListener _locListener;
    private LocationManager _locManager;

    private static final String TAG = "locationtrigger";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.v(TAG, "onBind");
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "ScanServiceonStartCommand");
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    @SuppressLint("MissingPermission")
    @Override
    public void onCreate() {
        Log.v(TAG, "ScanServiceonCreate - start");
        List<UserLocationManager> locationsManagers = GetLocationsManagers();
        _locListener = new MyLocationListener(locationsManagers);
        _locManager = (LocationManager)getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        _locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, _locListener);
        Log.v(TAG, "ScanServiceonCreate - end");
    }


    @Override
    public void onDestroy() {
        _locManager.removeUpdates(_locListener);
    }

    public List<UserLocationManager> GetLocationsManagers(){
        // returning some managers
    }

    public class ScanServiceBinder extends Binder {
        public ScanService getService() {
            Log.v(TAG, "ScanServiceBinder.getService");
            return ScanService.this;
        }
    }

    class MyLocationListener implements LocationListener {

        private List<UserLocationManager> _locationManagers;

        public MyLocationListener(List<UserLocationManager> locationManagers)
        {
            _locationManagers = locationManagers;
        }

        @Override
        public void onLocationChanged(Location location)
        {
            if (location != null)
            {
                // call managers
            }
        }
    }
}
...