Get LocationUpdates in background service continuously

前端 未结 2 1822
后悔当初
后悔当初 2021-02-06 14:17

I am working on application which requires to fetch location updates continuously in background service. I have used background sticky service with which it is working. But serv

2条回答
  •  长情又很酷
    2021-02-06 15:00

    Using notification, you can make your service alive. It works up to android 8.1. Below is code for background service

    Note:

    1) Use startForegroundService for above Build.VERSION_CODES.O

    2) Use targetSdkVersion 25

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                mainActivity.startService(new Intent(getContext(), GpsServices.class));
            } else {
                mainActivity.startForegroundService(new Intent(getContext(), GpsServices.class));
            }
    

    BackgroundGpsServices Class

    public class BackgroundGpsServices extends Service implements LocationListener {
    private LocationManager mLocationManager;
    public final long UPDATE_INTERVAL = 500;  /* 0.5 sec */
    public static final int NOTIFICATION_ID = 200;
    
    @Override
    public void onCreate() {
        sendNotification(this, false);
        startLocationUpdates();
    }
    
    private void startLocationUpdates() {
        if (!isLocationUpdateRunning) {
            isLocationUpdateRunning = true;
            mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            if (mLocationManager != null) {
                mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, UPDATE_INTERVAL, 0, this);
            }
        }
    }
    
    @Override
    public void onLocationChanged(Location location) {
        sendNotification(BackgroundGpsServices.this, true);
        System.out.println("onLocationChanged ----- location=" + location);
    }
    
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    
    }
    
    @Override
    public void onProviderEnabled(String provider) {
    
    }
    
    @Override
    public void onProviderDisabled(String provider) {
    }
    
    public static void sendNotification(Service service, boolean isUpdate) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Intent intent = new Intent(service, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(service, 0, intent, PendingIntent.FLAG_NO_CREATE);
            NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(service)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("INFO_NOTIFICATION_TITLE")
                    .setOngoing(true)
                    .setAutoCancel(false)
                    .setContentText("INFO_NOTIFICATION_MESSAGE")
                    .setContentIntent(pendingIntent);
            Notification notification = mNotifyBuilder.build();
    
            if (isUpdate) {
                NotificationManager notificationManager = (NotificationManager) service.getSystemService(NOTIFICATION_SERVICE);
                if (notificationManager != null) {
                    notificationManager.notify(NOTIFICATION_ID, notification);
                }
            } else {
                service.startForeground(NOTIFICATION_ID, notification);
            }
        }
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // If we get killed, after returning from here, restart
        return START_STICKY;
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }
    
    /* Remove the locationlistener updates when Services is stopped */
    @Override
    public void onDestroy() {
        try {
            stopLocationUpdates();
            stopForeground(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void stopLocationUpdates() {
        isLocationUpdateRunning = false;
        if (mLocationManager != null) {
            mLocationManager.removeUpdates(this);
        }
    }
    }
    

提交回复
热议问题