У меня небольшая проблема.
В моем приложении Служба запускается после успешного входа пользователя в систему. Раньше служба должна была прекратиться, если приложение было убито. (скажем, удалены из списка последних приложений путем прокрутки.) Таким образом, мы использовали android:stopWithTask="true"
. Теперь нам нужно, чтобы Служба запускалась так, как она есть, даже если запущенная Задание была удалена из списка последних приложений. Поэтому я изменил Сервис, включив android:stopWithTask="false"
. Но это не работает.
Связанный код:
Вот часть, относящаяся к Сервису:
<service
android:enabled="true"
android:name=".MyService"
android:exported="false"
android:stopWithTask="false" />
В MyService.java:
public class MyService extends AbstractService {
@Override
public void onStartService() {
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new Notification(R.drawable.ic_launcher, "My network services", System.currentTimeMillis());
notification.setLatestEventInfo(this, "AppName", "Message", pendingIntent);
startForeground(MY_NOTIFICATION_ID, notification);
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Toast.makeText(getApplicationContext(), "onTaskRemoved called", Toast.LENGTH_LONG).show();
System.out.println("onTaskRemoved called");
super.onTaskRemoved(rootIntent);
}
}
AbstractService.java - это пользовательский класс, который расширяет Sevrice
:
public abstract class AbstractService extends Service {
protected final String TAG = this.getClass().getName();
@Override
public void onCreate() {
super.onCreate();
onStartService();
Log.i(TAG, "onCreate(): Service Started.");
}
@Override
public final int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStarCommand(): Received id " + startId + ": " + intent);
return START_STICKY; // run until explicitly stopped.
}
@Override
public final IBinder onBind(Intent intent) {
return m_messenger.getBinder();
}
@Override
public void onDestroy() {
super.onDestroy();
onStopService();
Log.i(TAG, "Service Stopped.");
}
public abstract void onStartService();
public abstract void onStopService();
public abstract void onReceiveMessage(Message msg);
@Override
public void onTaskRemoved(Intent rootIntent) {
Toast.makeText(getApplicationContext(), "AS onTaskRemoved called", Toast.LENGTH_LONG).show();
super.onTaskRemoved(rootIntent);
}
}
Теперь, если я вхожу в приложение, запускается MyService. После этого я нажимаю кнопку "Домой", поэтому приложение перемещается в фоновый режим. Теперь я удаляю приложение из списка недавних приложений. В это время я должен увидеть сообщение Toast и консоль, как описано в этом методе:
public void onTaskRemoved (Intent rootIntent)
Добавлен в уровень API 14
Это вызывается, если служба в настоящее время запущена, и пользователь имеет удалена задача, которая поступает из приложения-службы. Если у вас есть установите ServiceInfo.FLAG_STOP_WITH_TASK, тогда вы не получите этого Перезвони; вместо этого служба будет просто остановлена.
Параметры rootIntent Исходный корень, который использовался для запустите задачу, которая удаляется.
Но я не вижу ничего подобного. Служба возвращает START_STICKY в onStartCommand
, поэтому я думаю, что onTaskRemoved
должен быть запущен вместе с флагом android:stopWithTask="false"
.
Я что-то пропустил?
Сообщите мне, если мне нужно добавить код, который может быть важным для выяснения того, что неправильно.
P.S.: Я тестировал это на 4.2.2 до сих пор.
P.S.: Я только что протестировал тот же код в 4.1.2, на котором Служба продолжает работать, и я получаю сообщение "onTaskRemoved called" в журнале тоже.
Что делать, чтобы сделать эту работу во всех версиях?