Требуется разъяснение 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

Мы должны использовать два флага, а именно:

  1. Intent.FLAG_ACTIVITY_NEW_TASK
  2. 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. Это ожидаемый результат.