Есть ли простой способ остановить службу в ответ на щелчок пользователем уведомления?

Мне нужно следующее поведение: Пользователь нажимает уведомление, и Android останавливает мою службу.

Проблема в том, что остановка службы требует вызова stopService, и я не могу легко создать PendingIntent, который делает это.

Таким образом, единственный способ, которым я нашел это, - заставить мою службу получить специальный Intent extra, который заставляет Сервис вызывать stopSelf и останавливаться.

Есть ли более простой способ напрямую отменить услугу из уведомления?

Ответ 1

Вы можете создать простой BroadcastReceiver, который выполняет вызов stopService(), и использовать getBroadcast() PendingIntent для его запуска. То, что BroadcastReceiver может быть зарегистрировано в манифесте или через registerReceiver() самой Service (в последнем случае оно будет stopSelf(), а не stopService()).

Это, вероятно, не проще, чем то, что у вас есть, и нет способа напрямую вызвать вызов stopService() из PendingIntent.

Ответ 2

Спасибо CommonsWare.

Вот краткая иллюстрация вашего решения для тех, кто заинтересован.

Код находится в классе службы.

// Create Notification 
private void initNotification() {     
  //Register a receiver to stop Service   
  registerReceiver(stopServiceReceiver, new IntentFilter("myFilter"));
  PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, new Intent("myFilter"), PendingIntent.FLAG_UPDATE_CURRENT);
  notification.setLatestEventInfo(context, contentTitle, contentText,contentIntent);  
  mNotificationManager.notify(NOTIFICATION_ID,notification);  
...
}



//We need to declare the receiver with onReceive function as below
protected BroadcastReceiver stopServiceReceiver = new BroadcastReceiver() {   
  @Override
  public void onReceive(Context context, Intent intent) {
  stopSelf();
  }
};