Подтвердить что ты не робот

Сбой службы Android после того, как приложение вышло из списка последних приложений

У меня есть служба, которая запускается (не привязывается) к действию. Если действие уничтожается (например, нажатием кнопки "Назад" ), служба продолжает работать, это, конечно, предназначено. Однако, если я проведу активность из списка "последние приложения", служба немедленно перезапустится. Это воспроизводимо, каждый раз, когда действие/приложение вырывается из списка, появляется новый вызов службы onCreate-method. Нет звонка в onDestroy между ними!

Сначала я думал, что служба была убита андроидом, хотя я не видел причин для убийства (ни деятельность, ни служба не потребляют ресурсы, на самом деле они минималистичны и ничего не делают). Но потом я заметил, что служба действительно сбой.

V/MainActivity(856): onDestroy // swipe out of the list
I/ActivityManager(287): Killing 856:com.example.myapp/u0a10050: remove task
W/ActivityManager(287): Scheduling restart of crashed service com.example.myapp/.TestService in 5000ms

Код не примечателен, но здесь он

Активность:

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.v(TAG, "onCreate, starting service...");
        startService(new Intent(this, TestService.class));
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v(TAG, "onStart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy");
    }

    //[...]
}

Услуги:

public class TestService extends Service {

    private static final String TAG = "Service";

    // onBind omitted

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy");
    }

}

Вкратце: Мой сервис не зависит от жизненного цикла активности, но только до тех пор, пока я не удаляю приложение из списка последних приложений. В этом случае служба перезапускается, но без вызова onDestroy.

Каждый раз, когда это происходит, теряется не только состояние службы, но и работа, выполняемая службой. Я просто хочу знать, почему причиной этого является салфетка.

4b9b3361

Ответ 1

Прокрутка приложения из списка недавних задач фактически убивает процесс операционной системы, в котором размещается приложение. Поскольку ваша служба работает в том же процессе, что и ваши действия, это фактически убивает службу. Он не вызывает onDestroy() в службе. Это просто убивает процесс. Boom. Мертв. Прошло. Ваш сервис не разбивается.

Так как ваша служба вернула START_STICKY из вызова onStartCommand(), Android распознает, что ваша служба должна быть перезапущена и запланирована перезагрузка убитой службы. Однако, когда ваша служба будет перезапущена, она будет во вновь созданном процессе (вы можете увидеть onCreate(), вызванный в службе), поэтому ему придется снова начать работу.

Правило №1: никогда не прокручивайте приложения из списка недавних задач; -)

Ответ 2

Возможно, это может быть проблема с приемниками Broadcast, определенными в манифесте.

Есть ли у вас фильтр приемника/намерения, определенный в манифесте на уровне приложения? У меня была такая же проблема, и это было вызвано выражением получателя в манифесте на уровне приложения

Ответ 3

Смахивание, ваш процесс не гарантированно будет убит системой убить. Нет. Вы только удаляете задачу applciation (или задний стек). Задача приложения НЕ равна процессу подачи заявки.

Поэтому, если у вас есть какие-либо фоновые задания (потоки, сервисы и т.д.), Связанные с вашим задним стеком, и у вас есть хорошая политика отмены. Система может попытаться кэшировать ваш процесс, если он подходит для дальнейшего использования.

Если вы убьете процесс приложения из диспетчера задач, то это будет означать, что ваш процесс будет удален, а значит, и ваша JVM/песочница агрессивно системой.

Ответ 4

В моем телефоне Sony XPERIA XA1 функционирует START_FLAG_REDELIVERY

Ответ 5

Используйте * START_NOT_STICKY * как onStartCommand return

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.v(TAG, "onStartCommand");
    return START_NOT_STICKY;
}