Подтвердить что ты не робот

Имея один экземпляр деятельности

У меня проблема с навигацией 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);

Можно ли делать то, что я хочу?

Спасибо заранее

4b9b3361

Ответ 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, как вы описали.