Продолжить обслуживание, даже если приложение удалено из приложения Недавние
У меня небольшая проблема.
В моем приложении служба запускается после успешного входа пользователя. Ранее сервис необходимо было остановить, если приложение было убито. (скажем, удалили из списка недавних приложений, проведя пальцем по экрану.) Итак, мы использовали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 и console согласно описанию этого метода:
public void onTaskRemoved (намерение 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 named» в журнале тоже.
Что я должен сделать, чтобы это работало во всех версиях?