Требуется разъяснение FLAG_ACTIVITY_NEW_TASK
Итак, моя проблема:
- Я запускаю App1, открываю Screen1, а затем Screen2.
- Я нажимаю Home, оставляя App1 в фоновом режиме.
- Я открываю App2, запускаю App1.Screen1 с FLAG_ACTIVITY_NEW_TASK, ожидая, что вы будете в App1.Screen2 в предыдущей левой задаче. Вместо Im на App1.Screen1 и системе, называемой onNewIntent().
Когда я нажимаю, он снова возвращает Sceen2 и Screen1.
Я не использую никаких других флагов намерения или режимов запуска.
Может ли кто-нибудь объяснить, что происходит?
Ответы
Ответ 1
Android имеет TONS ошибок, связанных с действиями и задачами.
Тем не менее, Google изменил поведение задач между версиями ОС и не сообщил разработчикам, что является самым неприятным в этом отношении.
jakk - Если вы не указали какие-либо флаги в действиях (A или B), чем поведение, которое вы описываете, НЕПРАВИЛЬНО.
И для всех тех, кто говорит, что проблем с документацией нет, попробуйте следующее:
- Создайте приложение с активностью A (запуск) и B (с режимом запуска по умолчанию для обоих).
- Запустить приложение - задача создается только с активностью A.
- От кнопки в действии A запустите операцию B с FLAG_ACTIVITY_NEW_TASK.
- Нажмите кнопку несколько раз, и вы увидите, что активность B создается несколько раз внутри задачи, а это НЕ, как говорится в документации.
Существует больше сценариев, подтверждающих, что документация BAD/WRONG.
Ответ 2
На третьем шаге, когда вы открываете App2 и запускаете App1.Screen1 с помощью Intent.FLAG_ACTIVITY_NEW_TASK
, вам также нужно установить Intent.FLAG_ACTIVITY_SINGLE_TOP
, чтобы заставить это делать то, что вы хотите. Это ошибка Android: - (
Также помните, что поведение также немного нарушено, если вы впервые запускаете приложение из своей среды IDE (IntelliJ, Eclipse) или после ее установки через рынок (Google Play) или из загрузки браузера. См. Как предотвратить несколько экземпляров активности при запуске с разными намерениями и http://code.google.com/p/android/issues/detail?id=26658
Ответ 3
Попробуй это. Меня устраивает.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Ответ 4
Это похоже на документацию на http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html.
FLAG_ACTIVITY_NEW_TASK эквивалентен launchMode = singleTask, и там я читаю
Однако, если экземпляр активности уже существует в отдельном задача, система направляет намерение на существующий экземпляр посредством вызовите его метод onNewIntent(), а не создайте новый экземпляр
Запуск активности без FLAG_ACTIVITY_NEW_TASK должен дать вам ожидаемое поведение.
Ответ 5
FLAG_ACTIVITY_NEW_TASK
Запустите действие в новой задаче. Если задача уже запущена для действия, которое вы сейчас запускаете, эта задача выводится на передний план с восстановленным последним состоянием и действие получает новое намерение в onNewIntent().
Это приводит к тому же поведению, что и значение "singleTask" launchMode.
Ответ 6
fun isConnectedToInternet(): Boolean {
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork = connectivityManager.activeNetworkInfo
if (activeNetwork != null)
return activeNetwork.isConnected
else
return false
}
Ответ 7
Мы должны использовать два флага, а именно:
-
Intent.FLAG_ACTIVITY_NEW_TASK
-
Intent.FLAG_ACTIVITY_CLEAR_TASK
Первый флаг просто добавит активность в жизненный цикл так же, как элемент добавляется в стек.
Второй флаг просто удалит первое действие из стека, так что когда пользователь вернется на домашний экран, он не сможет увидеть действие и увидит только второе действие.
Ответ 8
FLAG_ACTIVITY_NEW_TASK помещает ваше новое действие в новый стек задач. Я буду ссылаться на действия как A и B.
Когда вы запускаете первое приложение, у вас есть одна задача с A в ней. Задача 1 = A
Нажатие на второе действие помещает B в задачу. Задача 1 = AB
Когда вы нажимаете на дом, вы сохраняете задачу. Задача 1 = AB (все еще)
Открытие второго приложения и отправка намерения А с новым флагом задачи будет создано новое задание с только A на нем. Теперь у вас есть две задачи. Задача 1 = AB, Задача 2 = A
Развертывание этой компоновки с помощью обратного ключа приведет к тому, что вы видите 2A, 1B, 1A. Это ожидаемый результат.