从开始时间起6个小时后自动停止位置服务

时间:2018-09-28 07:52:23

标签: android service android-service

我有一个定位服务,每隔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 :(得分:0)

您可以在3分钟计时器中添加一个计数器,直到您达到120分钟为止,然后停止Locationupdates并关闭服务。

答案 1 :(得分:0)

服务启动时,您可以通过AlarmManager安排警报-这将是您收到的意图。收到后,您可以停止正在运行的服务。

答案 2 :(得分:0)

尝试以下代码:

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()中将其注销。