Почему код выполняется после кода переадресации?

У меня есть этот код Android :

      Intent launchIntent = packageManager.getLaunchIntentForPackage(context.getPackageName());
      cpa.startMainActivity(launchIntent.getComponent(), user);

      // try to move down
      if (dialogDismisser != null) {
        dialogDismisser.run();
      }

Как может быть, что dialogDismisser вызывается даже после cpa.startMainActivity ?

Предполагается, что перенаправление переназначения произойдет только в будущем?

Всего 3 ответа


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

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


Предполагается, что перенаправление переназначения произойдет только в будущем?

Конечно. Это асинхронная операция. Более того, вызов приводит к запуску нового (или приведения в действие уже запущенного) процесса через IPC без прерывания вызова.


Первые две строки кода (показаны ниже), которые вы написали, запускают другое действие.

Intent launchIntent = packageManager.getLaunchIntentForPackage(context.getPackageName());
cpa.startMainActivity(launchIntent.getComponent(), user);

Запуск новых мероприятий на Android не заканчивается нитями.

Таким образом, остальная часть вашего кода (показано ниже) будет продолжать работать до тех пор, пока она не дойдет до конца вашего кода.

if (dialogDismisser != null) {
    dialogDismisser.run();
}

И ответить на ваш последний вопрос:

Предполагается, что перенаправление переназначения произойдет только в будущем?

Вид. Новая деятельность начинается сразу же, вместе с намерением; однако остальная часть вашего кода будет продолжать работать до тех пор, пока не достигнет конца.


Есть идеи?

10000