Имея один экземпляр деятельности
У меня проблема с навигацией Activity и обратно, и я надеялся, что вы сможете это очистить.
Проблема
Корневая активность → > SecondActivity → HomeButton
Затем это приведет меня к домашней странице, и оттуда я выбираю...
Gmail → Сообщение → Открыть вложение в моем приложении → ImportActivity → RootActivity
Результатом является запуск новой задачи и использование другого экземпляра моего приложения. Это неприемлемо, так как я не хочу запускать две отдельные задачи. Мне нужен только один.
Желаемый результат
То, что я хочу сделать, - это когда пользователь открывает вложение, а ImportActivity завершает то, что он делает (у него android:noHistory
установлено значение true) и запускаются вызовы startActivity(intent)
, RootActivity
но сохраняя только один экземпляр, а остальные действия поверх него в исходной задаче (в данном случае SecondActivity
) удаляются.
Причина, по которой я хочу, это то, что пользователь переходит из моего приложения после импорта файла, а затем касается значка приложения, он загружает первую задачу с помощью своего заднего стека, и у меня есть две задачи, в которых пользователь может находиться в двух различные части моего приложения сразу.
Что я пробовал
Я играл в режиме запуска, но ни один из них не дал мне необходимую мне функциональность.
Режимы запуска, которые я пробовал..
android: launchMode = "singleTask" - это только начало действие корня снова при каждом запуске. Даже если пользователь нажал кнопку "домой" внутри моего приложения и коснулся значка приложения, был поврежден задний стек.
android: launchMode = "singleInstance = не разрешает запуск других задач в задаче.
Также при вызове намерения запустить RootActivity
я использовал следующее безрезультатно.
Intent i = new Intent(ImportActivity.this,TrackingActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
Можно ли делать то, что я хочу?
Спасибо заранее
Ответы
Ответ 1
Вы говорите
Gmail >> Message >> Open attachment in my application >> ImportActivity >> RootActivity
но это может быть неверно. В этом случае gmail выпустит Intent
, нацеленный на ImportActivity
в вашем приложении. ImportActivity
будет выполняться. Однако мое чтение https://developer.android.com/guide/components/tasks-and-back-stack.html предполагает, что ImportActivity
будет выполняться как часть той же задачи, что и gmail, и будет помещен поверх назад для задачи gmail, если только вы не предпринимаете специальные действия в манифесте, чтобы предотвратить это, или gmail специально вызывает его как отдельную задачу. Когда ImportActivity
заканчивается, он не должен вызывать startActivity(intentForRootActivity)
, но должен просто вызвать finish()
, чтобы он был уничтожен, и появится активность из gmail, лежащего под ним в фоновом стеке.
Если ImportActivity
набрал startActivity(intentForRootActivity)
, то RootActivity
просто перейдет в начало задачи gmail и появится в стеке gmail back. Прикоснувшись к home
, а затем значок запуска для gmail увидит RootActivity
снова, скрывая gmail под ним.
Я думаю, вам нужно android:launchMode="standard"
в декларации манифеста ImportActivity
.
Задача, которая представляет собой старый, автономный экземпляр вашего приложения, не будет изменена. Если кто-то касается значка запуска для вашего приложения, старое состояние вашего приложения будет восстановлено, не затронутое тем, что произошло в задаче gmail.
Документ http://developer.android.com/guide/components/processes-and-threads.html довольно неопределенен в отношении того, как эта деятельность охватывает процессы здесь (заставляя Дэвида Вассера прокомментировать мою более раннюю версию этого ответа), но кажется, что действия gmail будут выполняться в одном Linux-процессе с одним идентификатором пользователя linux, а ImportActivity
будет выполняться в другом процессе linux с другим идентификатором пользователя. Тем не менее, все они могут быть частью одной задачи с одним стопкой.
ImportActivity
будет выполнять как часть задачи gmail с тем же эффективным идентификатором пользователя Linux, каким он был бы выполнен как часть вашего автономного приложения, и отличается от идентификатора пользователя Linux, с которым выполняется gmail. Это звучит маловероятно и сложно, но, по-видимому, подразумевается https://developer.android.com/guide/components/fundamentals.html. В этом есть смысл; если ImportActivity
нужно получить, скажем, пользовательские настройки, сохраненные для вашего приложения, ему необходимо прочитать файл настроек, как если бы он был определен пользователем для вашего приложения, а не для пользователя, определенного для gmail.
Я не пробовал выполнить какое-либо из этого. Если у меня будет совершенно неправильный конец палки, я уверен, что кто-то скоро скажет нам!
Ответ 2
Для этого не нужно никаких специальных launchMode
. Если ваша активность импорта запускает корневую активность с помощью Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP
, это должно делать то, что вы хотите. Я предполагаю, что у вас есть проблема с taskAffinity
. Попробуйте следующее:
В вашем манифесте в объявлении для importActivity добавьте следующее:
android:taskAffinity=""
Если это не сработает, напишите свой манифест, чтобы мы могли посмотреть на него.
Ответ 3
Я действительно не уверен, получил ли я его, но если вы захотите пойти в свою "корневую" деятельность, не потеряв лишний стек приложений, он будет Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
прямыми по флагам на вашем intent
, и без дополнительные конфиги на Manifest
... и если вам нужно отделить задачу, чтобы создать новый полный новый стек, чем вы можете использовать Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP
, как вы описали.