#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. Да, я запустил ее с помощью службы переднего плана. Служба переднего плана также принимает уведомление в качестве аргумента. Ранее мой подход был неправильным.