Управление стеками активности андроида: как конкретный экземпляр действия может выйти на передний план? - PullRequest
1 голос
/ 26 августа 2011

У меня есть набор действий, между которыми я перемещаюсь, и, поскольку эти действия слишком дороги для инициализации, я хотел бы сохранить существующее состояние, если это возможно. Проблема в том, что у меня может быть одно и то же действие, открытое несколько раз, с различным состоянием в каждом, и я не видел, как стандартные флаги Android могли бы помочь мне в этой ситуации.

Вот наглядный пример:

Представь, у меня есть три занятия:

А, В, С

Каждое из этих действий может быть открыто более одного раза, каждое из которых имеет свое состояние. Эти действия не только дороги для инициализации, но я также хотел бы сохранить текущее состояние пользователя, такое как положение прокрутки, выбранные элементы и т. Д. *

Допустим, A (1) является экземпляром активности A в состоянии 1, а A (2) является экземпляром активности A в состоянии 2. A (1) и B (1) не связаны.

Я хочу реализовать круговой стек навигации следующим образом:

... -> A (1) -> A (2) -> B (1) -> B (2) -> B (3) -> A (3) - > C (1) -> A (1) -> ...

Поскольку эти действия дорогостоящие, я действительно хотел бы просто использовать существующие экземпляры. Однако мне может потребоваться сохранить примерно 2 или 3 экземпляра того же действия, что вы можете видеть выше.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 26 сентября 2011

Хорошо, так что на самом деле это возможно, но вам нужно использовать отражение и флаг Intent.FLAG_ACTIVITY_MULTIPLE_TASK.

Вот как я это сделал:

Контроллер: запускает действия с Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK

Операции: Зарегистрируйте себя в контроллере, передав уникальный идентификатор для определения их состояния, и идентификатор их задачи с помощью getTaskId ()

Контроллер: создает действие, если задача имеетумер (проверяется с помощью ActivityManager.getRunningTasks ()).Если задача еще жива, то для вывода задачи на передний план она использует следующий код отражения:

Class ActivityManagerNative = Class.forName("android.app.ActivityManagerNative");

Method getDefault = ActivityManagerNative.getMethod("getDefault", null);
Object activityManagerNative = getDefault.invoke(ActivityManagerNative, null);

Method[] methods = activityManagerNative.getClass().getMethods();

Method moveTaskToFront;

for (final Method method : methods) { if (method.getName().equals("moveTaskToFront")) { moveTaskToFront = method;}}

...

moveTaskToFront.invoke(activityManagerNative, registeredTaskId);

Анимациями можно управлять, вызывая overridePendingTransition из действия, которое запросило изменение задачи.

Надеюсь, это поможет кому-то еще.

2 голосов
/ 08 октября 2012

moveTaskToFront.invoke доступно только после API 11. Как реализовать то же самое в приложении уровня API 8.

1 голос
/ 26 августа 2011

В файле AndroidManifest.xml вы можете определить для каждой активности вашего приложения, как система времени выполнения должна запускать определенную активность.В вашем случае вы должны определить свойство launchMode вашей активности со значением «singleTask».Тогда система времени выполнения не будет создавать несколько экземпляров определенного действия.Каждый раз, когда нужно запустить конкретное действие, система времени выполнения запускает действие onNewIntent ().В этом методе вы можете обрабатывать различные состояния одного конкретного действия.

0 голосов
/ 26 августа 2011

Что может сработать так: не допускайте более 1 экземпляра определенного действия. Вы делаете это, когда объявляете каждое действие в манифесте, устанавливая launchMode. Затем следите за состояниями экземпляра, создавая объект приложения, содержащий каждый объект Bundle действий. Открывая упражнение, передайте ему соответствующий комплект.

...