метод stopForeground()
может остановить службу, но он является частью класса Service. он не может быть вызван ни получателем.
Вот два решения, вы можете понять, что.
одно решение в вашем классе обслуживания регистрирует BroadcastReceiver
, когда цель BroadcastReceiver
получает сообщение, отправляет широковещательную рассылку получателю услуги.
//the service class
private final BroadcastReceiver closeService = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Bla bla bla
stopForeground(NOTIF_ID);
};
IntentFilter filter = new IntentFilter(""my.close.service"");
registerReceiver(mYReceiver, iFilter);
public class NotificationReceiver extends BroadcastReceiver {
private static final String TAG = "NotificationReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("toastMessage");
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
// here to send it to service
sendBroadcast(new Intent("my.close.service"))
}
}
другое решение - в вещании, перезапустите службу, в методе onStartCommad
, в соответствии с действием по ее закрытию.
public class NotificationReceiver extends BroadcastReceiver {
private static final String TAG = "NotificationReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("toastMessage");
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
// here to restart the service
startService(new Intent(this, YourService.class).setAction("STOP_ACTION"));
}
}
// in the Service.java onStartCommand method, check the action and stop it.
public void onStartCommand(){
if(intent.getAction() != null &&
intent.getAction().equals("STOP_ACTION")) {
stopForeground(true);
}
}
В конце концов, если вы знакомы с EventBus
, вы можете использовать его для отправки события службе напрямую. или вы можете определить BroadcastReceiver
как внутренний класс в Сервисе, тогда вы также можете вызвать его напрямую