Есть ли что-то, что мне нужно учитывать при повторном вызове одной и той же активности? - PullRequest
2 голосов
/ 28 октября 2010

Я занимаюсь разработкой приложения, в котором отдельное действие создается несколько раз само по себе.Я думаю, вы могли бы думать об этом как о книге, где каждое действие представляет собой страницу.В конце страницы (действия) пользователь нажимает кнопку, чтобы перейти на новую страницу.Я запускаю Намерение для одного и того же Действия, но помещаю разные данные в Пакет, чтобы загрузить другую страницу.

Это работает нормально, и мне нравится тот факт, что пользователь может выполнить резервное копирование на предыдущуюточка, но мой вопрос, будет ли это в конечном итоге проблемой?Что произойдет, если этот вид деятельности будет создан 10 раз, или 50, или 100?Будет ли устройству не хватать памяти, GC придет и очистит старые действия, или что?

Если GC действительно их очистит, что произойдет, когда пользователь нажмет кнопку Назад, а предыдущее действие больше не будетстек?

Лучше ли отслеживать путь пользователя, завершить () действие и переопределить кнопку «Назад», чтобы при переходе пользователя вперед или назад я загружал только одно действие?Другой подход, который я мог бы использовать, - обновить все данные на странице, чтобы они оставались такими же, но с новыми данными.В этом случае кнопка Назад не будет работать должным образом.

Мысли?

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Возможно, вы подумали, возможно, использовать ту же активность и просто изменить содержимое, которое она отображает.

Так в примере с книгойУ вас будет книга Activity, которая будет иметь Page ViewGroup где-то в своей иерархии представлений, которая отображает содержимое страницы.Затем, когда пользователь переходит на следующую или предыдущую страницу, View View Group просто отображает содержимое нужной страницы.Затем вы можете использовать структуру данных для управления вашим стеком страниц и текущей позицией пользователей.

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

Старые действия, которые больше не видны, будут уничтожены, если потребуется их память.Тем не менее, в Android есть механизм сохранения состояния, так что при перезапуске Activity (возвращаясь к странице, которая была уничтожена в вашем случае) ее можно восстановить должным образом.Это можно сделать с помощью механизма Общие предпочтения или объекта пакета, переданного в Activity.onCreate.Однако вам придется явно сохранить состояние в Activity.onStop (...) и Activity.onSaveInstanceState (...) , а затем восстановить состояние в Activity.onCreate (...) и Activity.onRestoreInstanceState

Подробнее о жизненном цикле Активов можно прочитать здесь (не уверен, каков ваш уровень понимания) http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle:

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

Нашел эту статью, которая может предоставить дополнительную информацию, но не уверен, что это была информация, которой вы былиищем хотя: http://zerocredibility.wordpress.com/2009/08/24/why-android-swap-doesnt-make-sense/

Ура и счастливой охоты!

0 голосов
/ 29 октября 2010

Я бы предпочел переопределить поведение кнопки «Назад» и использовать, например, ViewFlipper для выполнения анимации.Это довольно просто сделать:

    // You could do simpler by overriding onBackPressed() if you
    // don't need 1.6 compatibility
    //--
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            if (currentPage>0) {
                return super.onKeyDown(keyCode, event);
            } else {
                currentPage--;
                showPage(currentPage);
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }
...