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

IntentService будет убит после остановки моего приложения

Я имею в виду соображения дизайна Android: AsyncTask vs Service (IntentService?)

В соответствии с обсуждением AsyncTask не подходит, поскольку он тесно связан с вашей деятельностью

Итак, я запускаю Thread (я предполагаю, что AsyncTask и Thread принадлежат к той же категории), имеют в нем цикл бесконечности и выполнили следующее тестирование.

  • я выйти мое приложение, удерживая нажатой программную клавишу "Назад", пока не увижу главный экран. Поток все еще запущен.
  • я убить мое приложение, перейдя в Управление приложениями → Приложение → Силовая остановка. Поток остановлен.

Итак, я ожидаю, что после того, как я перейду от Thread до Service, мой Service будет продолжать работать даже после того, как мое приложение выйти или убить.


Intent intent = new Intent(this, SyncWithCloudService.class);
startService(intent);

public class SyncWithCloudService extends IntentService {
    public SyncWithCloudService() {
        super("SyncWithCloudService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        int i = 0;
        while (true) {
            Log.i("CHEOK", "Service i is " + (i++));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Log.i("CHEOK", "", ex);
            }
        }
    }
}

    // Doesn't matter whether I use "android:process" or not.
    <service 
        android:name="com.xxx.xml.SyncWithCloudService" 
        android:process=".my_process" >
    </service>

Однако, на мой взгляд,

  • я выйти мое приложение, удерживая нажатой программную клавишу "Назад", пока не увижу главный экран. Служба все еще работает.
  • я убить мое приложение, перейдя в Управление приложениями → Приложение → Силовая остановка. Служба остановлена.

Кажется, что поведение Service и Thread одинаково. Итак, почему я должен использовать Service вместо Thread? Я что-то пропустил? Я думал, что мой Service должен продолжать работать, даже после того, как я убью свое приложение?

4b9b3361

Ответ 1

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

В общем, поведение Thread и Service аналогично. Тем не менее, если вы запустите Thread из Activity и затем завершите работу (то есть: закройте приложение), в конечном итоге Android заметит, что ваш процесс не имеет в нем активных компонентов (поскольку Android не распознает ваш Thread как активный компонент) и он просто убьет ваш процесс, тем самым убив поток.

Однако, если у вас запущена служба, то Android заметит, что у вас есть работа, работающая и не убивающая ее так легко. Тем не менее, по-прежнему возможно, что Android убьет ваш сервисный процесс, если он не "используется".

Ответ 2

На самом деле существуют различные виды услуг, которые вы можете реализовать. Используйте Service вместо IntentService. Там вам нужно посмотреть START_STICKY, START_NOT_STICKY и START_REDELIVER_INTENT, чтобы ваша служба работала в фоновом режиме, даже если ваша деятельность умирает. Услуги Android

Ответ 3

Вы используете startService(). Service будет работать до тех пор, пока код не будет выполнен, или пока Android не решит, что он должен быть убит. Посмотрите связанные службы. На Activity.onDestroy() вы должны позвонить unbindService().

Ответ 4

В вашем IntentService вы можете переопределить onStartCommand(), возвращая START_REDELIVER_INTENT

Затем, если он был убит, ваша служба будет автоматически перезагружена системой через некоторое время с тем же намерением.

Обязательно вызовите супер-реализацию onStartCommand() следующим образом:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent,flags,startId);
    return START_REDELIVER_INTENT;
}