Служба будет перезапущена после удаления приложения из недавней задачи - PullRequest
0 голосов
/ 13 мая 2019

Я занимаюсь разработкой приложения для определения местоположения пользователя в фоновом режиме. Мой сценарий как ниже

  1. пользователь переходит к действию и запускает фоновую службу.
  2. сервис должен получить местоположение пользователя в период 5000 миллисекунд и отправить эти данные для активности вызывающего абонента и показать пользователю.
  3. пользователь удаляет приложение из последних задач.
  4. сервис обычно должен собирать данные о местоположении пользователя в период 5000 Миллисекунды.
  5. когда пользователь заходит обратно, приложение должно видеть себя в пройденных местах от начала до текущего местоположения.

Я искал об этом в Google, и я нахожу ответы, но когда я использую их решения, мой сервис будет перезапущен после того, как я вернусь в приложение и отправлю мне пустые данные, когда приложение было уничтожено.

MyService

@Override
public int onStartCommand(Intent intent, int flags, int startId) {


        return START_STICKY; 

}

Моя активность

private BroadcastReceiver receiver = new BroadcastReceiver() {

 @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
               do stuff;
            }
        }
    };

@Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, new IntentFilter(
                MyService.NOTIFICATION));
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }

1 Ответ

0 голосов
/ 13 мая 2019

Вот служба отслеживания, которая отслеживает ваше местоположение с помощью API с привязанным местоположением и которая также запускается, когда приложение закрывается и отправляет данные в базу данных, вы можете отслеживать, как вы хотите

public class TrackingService extends Service implements LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {
    private LocationRequest mLocationRequest;
    private GoogleApiClient mGoogleApiClient;

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference(Constant.DISPATCHER_LOCATION);

    private DatabaseReference mDatabase;
    private static String TAG = "MyService";

    @Override
    public void onCreate() {
        super.onCreate();
        mDatabase = FirebaseDatabase.getInstance().getReference(Constant.TBL_USER);

        Log.d(TAG, "onCreate");

        if (isGooglePlayServicesAvailable()) {
            createLocationRequest();
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            mGoogleApiClient.connect();

        }

    }

    protected void createLocationRequest() {
        Log.d(TAG, "onCreateLocationRequest");

        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setInterval(7000).setFastestInterval(5000);
        ;
    }

    public void startTracking() {
        if (mGoogleApiClient != null) {
            startLocationUpdates(getApplicationContext());
//            Toast.makeText(this, "start tracking", Toast.LENGTH_LONG).show();

        }
    }

    public void stopTracking() {
        if (mGoogleApiClient != null) {
            try {
                Log.d(TAG, "onStop fired ..............");
                stopLocationUpdates();
            } catch (Exception e) {
                ref.getParent().child(Constant.TBL_USER).child(new SaveInSharedPreference(this).getString(Constant.CURRENT_USER)).child("dispatcher").setValue(false);

                Intent i = new Intent(this, UserWelcome.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
            }
        }
    }

    protected void startLocationUpdates(Context context) {

        if (mGoogleApiClient.isConnected()) {

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
                    mGoogleApiClient, mLocationRequest, this);

            Log.d(TAG, "Location update started ..............: ");

        }

    }

    protected void stopLocationUpdates() {
        try {
            // stop update location
            LocationServices.FusedLocationApi.removeLocationUpdates(
                    mGoogleApiClient, this);
            Log.d(TAG, "Location update stopped .......................");
//            mGoogleApiClient.disconnect();
            Log.d(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected());

        } catch (Exception e) {
            ref.getParent().child(Constant.TBL_USER).child(new SaveInSharedPreference(this).getString(Constant.CURRENT_USER)).child("dispatcher").setValue(false);
            Intent i = new Intent(this, UserWelcome.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
        }
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");

        return START_NOT_STICKY;
    }

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

    @Override
    public void onDestroy() {
        try {
            stopTracking();
        } catch (Exception e) {
            ref.getParent().child(Constant.TBL_USER).child(new SaveInSharedPreference(this).getString(Constant.CURRENT_USER)).child("dispatcher").setValue(false);
            Intent i = new Intent(this, UserWelcome.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }
    }

    @Override
    public void onLocationChanged(final Location location) {
        Constant.CURRENT_LOCATION = new LatLng(location.getLatitude(), location.getLongitude());
        if (!new SaveInSharedPreference(getApplicationContext()).getString(Constant.CURRENT_USER).equals("no")) {
            mDatabase.child(new SaveInSharedPreference(getApplicationContext()).getString(Constant.CURRENT_USER)).child("lat").setValue(location.getLatitude());
            mDatabase.child(new SaveInSharedPreference(getApplicationContext()).getString(Constant.CURRENT_USER)).child("lon").setValue(location.getLongitude());

            if (new SaveInSharedPreference(this).getString(Constant.ACCEPT_ORDER).equals("no")) {
                mDatabase.child(new SaveInSharedPreference(getApplicationContext()).getString(Constant.CURRENT_USER)).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        firebaseUserModal firebaseUserModal = dataSnapshot.getValue(firebaseUserModal.class);
                        if (firebaseUserModal.isDispatcher()) {
                            GeoFire geoFire = new GeoFire(ref);
                            geoFire.setLocation(new SaveInSharedPreference(getApplicationContext()).getString(Constant.CURRENT_USER), new GeoLocation(location.getLatitude(), location.getLongitude()), new GeoFire.CompletionListener() {
                                @Override
                                public void onComplete(String key, DatabaseError error) {
                                    if (error != null) {
                                        System.err.println("There was an error saving the location to GeoFire: " + error);
                                    } else {
                                        System.out.println("Location saved on server successfully!");
                                    }
                                }

                            });
                        } else {
                            mDatabase.getParent().child(Constant.DISPATCHER_LOCATION)
                                    .child(new SaveInSharedPreference(getApplicationContext())
                                            .getString(Constant.CURRENT_USER))
                                    .removeValue();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        }
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
        startTracking();
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.d(TAG, "Connection failed: " + connectionResult.toString());
    }

    private boolean isGooglePlayServicesAvailable() {
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
        if (ConnectionResult.SUCCESS == status) {
            return true;
        } else {
            try {

                GooglePlayServicesUtil.getErrorDialog(status, (Activity) getApplicationContext(), 0).show();
            } catch (Exception ex) {
                Log.e("error", ex.getMessage());
            }
            return false;
        }
    }
}
...