Остановить службу определения местоположения через 6 часов от времени запуска автоматически - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть служба определения местоположения, которая отправляет местоположение на мой сервер через каждые 3 минуты. Эта служба определения местоположения запускается из Активности одним нажатием кнопки. Я хочу, чтобы эта служба автоматически отключалась через 6 часов после запуска. Вот мой файл службы.Сервис запускается нормально, и я могу остановить его, нажав кнопку в действии. Но я хочу остановить его автоматически через 6 часов, даже если приложение свернуто. Любая помощь будет высоко оценена.

public class LocationService extends Service {

            private LocationListener listener;
            private LocationManager locationManager;

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

            @Override
            public void onCreate() {

                listener = new LocationListener() {
                    @Override
                    public void onLocationChanged(Location location) {
                        Log.i("location:","location is "+location.getLongitude()+" "+location.getLatitude());
                        LocationApi.sendGpsLocation(getApplicationContext(),location.getLongitude(),location.getLatitude());
                    }

                    @Override
                    public void onStatusChanged(String s, int i, Bundle bundle) {
                    }

                    @Override
                    public void onProviderEnabled(String s) {

                    }

                    @Override
                    public void onProviderDisabled(String provider) {
                        Log.e("disabled provider is :","location is "+provider);
                        Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(i);
                    }
                };

             //   locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

                if (ContextCompat.checkSelfPermission(DashboardActivity.activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ) {
                    locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,0,listener);
                }

            }

          /*  @Override
           public final void  stopSelf(){

            }*/

            @Override
            public boolean onUnbind(Intent intent) {

                LocationApi.stopLocation(getApplicationContext());
                //super.onDestroy();
                if (locationManager != null) {
                    //noinspection MissingPermission
                    locationManager.removeUpdates(listener);
                }
              return  super.onUnbind(intent);
            }

            @Override
            public void onDestroy() {
                LocationApi.stopLocation(getApplicationContext());
                super.onDestroy();
                if(locationManager != null){
                    //noinspection MissingPermission
                    locationManager.removeUpdates(listener);
                }
            }
        }

и я запускаю эту услугу в разделе «Активность» под кодом.

  Intent i = new Intent(getApplicationContext(), LocationService.class);
  if (Build.VERSION.SDK_INT >= 26) {
      startForegroundService(i);
  }else{
      startService(i);
  }

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы можете запланировать тревогу через AlarmManager при запуске службы - это будет намерение, которое вы получите.При получении вы можете остановить свой работающий сервис.

0 голосов
/ 28 сентября 2018

Попробуйте этот код:

public class LocationService extends Service {

public static final String ACTION_STOP = "com.mycompany.myapp.SERVICE_STOP";

/*private static final long UPDATE_INTERVAL = 3 * 60 * 1000;
private static final long STOP_INTERVAL = 6 * 3600 * 1000;*/
private static final long UPDATE_INTERVAL = 3 * 1000;
private static final long STOP_INTERVAL = 20 * 1000;

private LocationListener listener;
private LocationManager locationManager;

private BroadcastReceiver receiver;

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

@Override
public int onStartCommand(Intent i, int flags, int startId){
    if (Build.VERSION.SDK_INT >= 26){
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationChannel channel = new NotificationChannel("Location",
                "Location", NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(channel);

        Notification notif = new NotificationCompat.Builder(this, "Location")
                .setContentTitle("Location service")
                .build();
        startForeground(3001, notif);
    }
    return START_STICKY;
}

@Override
public void onCreate() {

    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            Log.i("location:","location is "+location.getLongitude()+" "+location.getLatitude());
            LocationApi.sendGpsLocation(getApplicationContext(),location.getLongitude(),location.getLatitude());
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.e("disabled provider is :","location is "+provider);
            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }
    };

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ) {
        locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,UPDATE_INTERVAL,0,listener);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,UPDATE_INTERVAL,0f,listener);
    }

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    Intent i = new Intent(ACTION_STOP);
    PendingIntent pi = PendingIntent.getBroadcast(this, 100, i, PendingIntent.FLAG_UPDATE_CURRENT);
    am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + STOP_INTERVAL, pi);

    receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            stopSelf();
        }
    };
    IntentFilter filter = new IntentFilter();
    filter.addAction(ACTION_STOP);
    registerReceiver(receiver, filter);

}

@Override
public void onDestroy() {
    Log.i("location:","stopping updates");
    unregisterReceiver(receiver);
    LocationApi.stopLocation(getApplicationContext());
    super.onDestroy();
    if(locationManager != null){
        locationManager.removeUpdates(listener);
    }
}
}

Объяснение: используйте AlarmManager.set () для планирования трансляции через определенное время (STOP_INTERVAL).Для получения трансляции зарегистрируйте получателя в onCreate () и отмените его регистрацию в onDestroy ().

0 голосов
/ 28 сентября 2018

Вы можете добавить счетчик к вашему 3-минутному таймеру и считать до тех пор, пока не достигнете 120, а затем остановите обновление местоположения и отключите службу.

...