Я пытаюсь создать службу, чтобы она продолжала работать, даже если приложение не на переднем плане. когда он находится на переднем плане, все работает хорошо, но после переключения с него 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
}
}
}
}