Как остановить службу даже после перезапуска активности?

#android #android-activity #android-service

#Android #android-активность #android-сервис

Вопрос:

Я хочу остановить службу от активности. Он останавливается, когда я не закрываю приложение. Но когда я закрываю приложение и снова запускаю приложение, служба не останавливается.

Поток :

—> Нажмите Включить
-> Показать уведомление / прослушиватель местоположения
-> Убить приложение
-> Уведомление все еще остается (служба запущена, значит)
-> Снова откройте приложение и
-> Нажмите Выключить
-> Служба не останавливается, и уведомление сохраняется

Класс обслуживания

 public class locationService extends Service {

NotificationCompat.Builder builder;
NotificationManager notificationManager;

public static final String serviceTag = "LocationServiceTag";


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

@Override
public boolean onUnbind(Intent intent) {
    return super.onUnbind(intent);
}

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

    SharedPreferences sharedPref = getSharedPreferences("AppPref",Context.MODE_PRIVATE);
    userCurrentRoute= sharedPref.getString("RouteNo","");

    mDatabase = FirebaseDatabase.getInstance().getReference();

    notificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);

    Intent repeating_intent =new Intent(this,MainActivity.class);

    PendingIntent pendingIntent= PendingIntent.getActivity(this,10,repeating_intent,PendingIntent.FLAG_UPDATE_CURRENT);


     builder = new NotificationCompat.Builder(this)
            .setContentIntent(pendingIntent)
            .setSmallIcon(R.drawable.bus_small)
            .setContentTitle("BusBuzz")
            .setContentText("Sharing Location to all")
            .setAutoCancel(false)
            .setOnlyAlertOnce(true)
            .setOngoing(true)
            ;

    notificationManager.notify(10,builder.build());

    provider = new LocationGooglePlayServicesProvider();
    provider.setCheckLocationSettings(true);

    return START_NOT_STICKY;
}

@Override
public void onCreate() {
    super.onCreate();
}


@Override
public void onDestroy() {
    notificationManager.cancel(10);
    Toast.makeText(this, "App Closed Location Sharing Stopped", Toast.LENGTH_SHORT).show();
    SmartLocation.with(this).location().stop();
    super.onDestroy();
}

}
  

Активность

  if (isChecked) {

                startService(new Intent(MainActivity.this,locationService.class).addCategory(locationService.serviceTag));

            }
            else
            {


                stopService(new Intent(MainActivity.this,locationService.class).addCategory(locationService.serviceTag));

            }
  

Комментарии:

1. вы использовали концепцию таймера anywhere?

Ответ №1:

Вы написали:

 --> Click Switch ON
--> Show Notification / Location Listener
--> Kill App
--> Notification still remains (Service is running means)
  

То, что уведомление существует, не означает, что Service оно все еще работает. На самом деле, он мертв. Вы убили приложение, которое убивает Service , и, поскольку вы возвращаетесь START_NOT_STICKY onStartCommand() , Android не перезапустит Service , пока ваше приложение не выполнит еще один явный вызов startService() . Поскольку приложение было убито, onDestroy() оно никогда не вызывалось, поэтому уведомление никогда не удалялось.

Вы можете проверить это, используя adb shell dumpsys activity services , чтобы узнать, работает ли ваше Service приложение после завершения работы.

Комментарии:

1. Да, я запустил ее с помощью службы переднего плана. Служба переднего плана также принимает уведомление в качестве аргумента. Ранее мой подход был неправильным.