Что произойдет, если я запустил службу из onCreate в Activity, завершил () Activity и затем снова запустил приложение? - PullRequest
2 голосов
/ 12 октября 2011

Я пытаюсь выяснить, как работает Android, когда речь идет о проблемах жизненного цикла.

Я решил иметь долговременную Службу для хранения моих TCP-соединений и прочего.

У меня есть одно действие, StartupActivity. Это действие запускает службу, а затем я нажимаю кнопку, чтобы завершить действие. Затем я снова запускаю то же приложение / Activity, и, таким образом, startService выполняется снова.

Однако я ожидал, что служба все еще будет работать (не было вызвано onDestroy), но метод onCreate в службе все еще выполняется.

Почему?

ШАГ 1: onCreate в StartupActivit выполняется:

@Override
protected void onCreate(android.os.Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.startup);

    startService(new Intent(StartupActivity.this, SamcomService.class));
    registerReceiver(connectionReceiver, new IntentFilter("STARTUP_PROGRESS_MESSAGE"));
    registerReceiver(connectionReceiver, new IntentFilter("STARTUP_FINISH"));

    final Button button = (Button) findViewById(R.id.buttonExit);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            finish();
        }
    });
}

ШАГ 2: Я нажимаю кнопку и вызывается Activity.finish () (я возвращаюсь на домашний экран)

ШАГ 3: я снова запускаю приложение, и снова запускается onCreate для Activity, таким образом, запускается та же служба

Теперь, когда я запускаю приложение во второй раз, Служба должна работать ( как это проверить? ). Я не видел тост, который отображается, когда вызывается служба onDestroy, а также я вижу уведомление о том, что служба создает (и удаляет onDestroy).

Однако onCreate выполняется во второй раз. Теперь у меня одновременно работает несколько служб?

1 Ответ

7 голосов
/ 16 октября 2011

Однако onCreate выполняется во второй раз. Теперь у меня одновременно работает несколько служб?

Нет, и я знаю, что это сбивает с толку, но метод startService () не запускает службу. Он будет вызываться в сервисе каждый раз, когда вы запускаете его. Например, если служба не запущена, она запустит ее, а затем запустит. Если служба запущена, она просто запустит ее. В документации Android говорится, что он был разработан таким образом, чтобы метод startService () был самым простым способом связи с вашим сервисом.

ШАГ 2: Я нажимаю кнопку и вызывается Activity.finish () (я возвращаюсь на домашний экран)

Это зависит от того, работает ли ваша служба в том же процессе, что и ваша деятельность, или нет. Если у вас есть: process = "что-то" в декларации службы в манифесте, и вы все сделали отлично, служба находится в другом процессе, и существует только три ситуации, в которых ваша служба будет уничтожена. 1, ваша активность уничтожена (почти гарантировано, что этого не произойдет, поскольку у вашего процесса есть активный приоритет активности), 2, ОЧЕНЬ мало памяти, 3 служба вызывает selfStop ().

Поскольку finish () не разрушает ваше приложение (Android хранит его в памяти, если пользователь возвращается к нему), ваша служба либо просто приостановлена ​​(если она выполнялась в том же процессе), либо все еще работает (если она была в другом процессе). Независимо от другого вызова startService () он перезапустит , если , он был приостановлен и запустит метод startService службы. У вас есть только одна из ваших услуг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...