Простейший жизненный цикл активности Android - PullRequest
18 голосов
/ 04 апреля 2011

Я заметил, что раздел «Активность разработчиков Android» был обновлен с тех пор, как я запустил свое приложение, но мне все еще неясно, каков самый простой жизненный цикл Activity.

Насколько я могу разобрать:

onCreate, onResume и onPause являются основными.

Действия могут быть удалены в любое время после onPause, поэтому я должен сохранить все состояние своего приложения в файл onPause, а не полагаться на onStop или onDestroy. Кроме того, onSaveInstanceState не вызывается перед каждым onPause, поэтому его не стоит использовать.

Вместо того, чтобы пытаться писать множество кода для обработки всех сценариев, почему бы не уничтожить Activity в конце ее onPause?

Тогда жизненный цикл будет onCreate и onResume, прежде чем он станет активным, а затем OnPause, когда он станет неактивным. Другие методы не понадобятся.

Я бы использовал onCreate для вызова setContentView и настройки прослушивателей представления, но все остальное будет помещено в onResume, включая загрузку восстановленного состояния из файла? Как указывалось ранее, onPause сохранит состояние в файл и уничтожит действие.

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

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

Есть мысли?

Обновление: Я предполагаю, что то, о чем я думал, было то, где действие на первой странице называет игровое действие. Активность на главной странице вызывает игровую активность, когда игрок нажимает «Играть»

.

Игровая активность настраивает свои представления, слушателей и т. Д. В onCreate, а в onResume загружает файл, содержащий состояние игры, или запускает новую игру, если файл не существует.

onPause игры, она записывает состояние игры в файл, а затем, что бы ни происходило с игровой активностью (ничего, или останавливается / уничтожается, или что-то еще), метод onResume всегда загружал бы все данные обратно из файл.

Это то, о чем я думал, если это имеет смысл?

Update2: Я разработал простое решение, которое я задокументировал в ответе ниже, если кому-то интересно!

Он не поддерживает состояния приостановки активности Android и состояния остановки. Когда он больше не отображается, он убивает себя и должен быть перезапущен вручную, но он продолжает с того места, где вы остановились!

Ответы [ 9 ]

31 голосов
/ 04 апреля 2011

Вы ищете это?

Activity Lifecycle

Чтобы еще больше ответить на ваш вопрос, да, как вы можете ясно увидеть на приведенной выше диаграмме, "самый простой"(т.е. наименьшее количество вызовов методов) - это действительно onCreate(); onStart(); onResume(); onPause();.

. Вы также должны знать о onSaveInstanceState() и onRetainNonConfigurationInstance().Это NOT методы жизненного цикла.

Все эти методы очень хорошо документированы.Пожалуйста, внимательно прочитайте эту документацию.

Чтобы прояснить ситуацию, вот пара реальных сценариев:

  1. Деятельность выполняется, другие действия идут поверх нее, onPause называется.Системе не хватает памяти, вызывает onSaveInstanceState, убивает активность.Пользователь нажал несколько раз назад, действие должно быть восстановлено (желательно с использованием данных, сохраненных в onSaveInstanceState).
  2. Деятельность выполняется, пользователь нажимает обратно.В этот момент набираются onPause->onDestroy, без вызова onSaveInstanceState.

Вы должны понимать существенную разницу между onPause и onSaveInstanceState.Первый всегда вызывается, а второй вызывается только тогда, когда действие экземпляр может быть повторно создано в будущем.Следуя этому ходу мыслей, ваши пользователи будут ожидать две вещи:

  1. Когда они уходят от вашей Активности и позже возвращаются к ней, они хотят, чтобы это было точно так же, как они ее оставили (будет достигнуто с помощью onSaveInstanceState).Они не ожидают, что если они выйдут из вашей деятельности.Однако:
  2. Они ожидают, что введенные ими данные будут сохранены (что будет сделано в onPause).Например, если они начали составлять сообщение, они ожидают увидеть его как черновик в следующий раз, когда вернутся, даже если они вышли из действия.

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

3 голосов
/ 04 апреля 2011

Система Android обрабатывает жизненный цикл: то есть создание экземпляров действий и вызов методов жизненного цикла.Так что я не знаю, что вы подразумеваете под «уничтожить деятельность».Вы, как разработчик, не обладаете такой способностью.

Во-вторых, процесс жизненного цикла деятельности иногда может сбивать с толку (я знаю, что я боролся с этим в начале).Итак, просто реализуйте все методы жизненного цикла и поместите в них операторы журналирования.Затем попробуйте все реальные варианты использования (включая получение вызова во время использования приложения), чтобы увидеть, как вызываются методы жизненного цикла.

2 голосов
/ 09 октября 2013

Я изучал жизненный цикл активности и весь процесс того, что происходит, когда вы начинаете какую-либо деятельность, начиная с onCreate.Вот диаграмма UML, чтобы помочь вам.

Нажмите эту ссылку, чтобы увидеть Высокое разрешение версию.

enter image description here

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

Я думаю, что нашел то, что искал!(Я 1, Боно 0)

Это для одного игрового действия, которое использует минимальные методы для управления потоком GameThread, который обрабатывает игру.В нем используется дополнительный класс «GameData» для хранения данных, которые должны быть постоянными между активациями.

Если приложение теряет фокус (например, входящий телефонный звонок или пользователь нажимает кнопку назад и т. Д.), Игра сохраняетGameData в файл и выходит.Чтобы возобновить, просто запустите приложение снова и оно вернется туда, где вы остановились.

Файл макета 'game.xml' представляет собой SurfaceView, охватывающий весь экран

Game.java:

  1. onCreate устанавливает SurfaceHolder для SurfaceView и создает GameThread
  2. SurfaceChanged вызывает GameThread.startThread для запуска GameThread, если он еще не запущен, передавая размер экрана
  3. onPause вызывает GameThread.endThread для завершения GameThread и завершает это действие.
  4. onTouch передает сенсорные события в метод GameThread.doTouch

GameThread.java:

  1. startThread устанавливает локально хранящиеся данные, загружает GameData из файла и запускает поток.
  2. run - это стандартный игровой цикл, вызывающий довольно стандартные процедуры updatePhysics и drawScreen для каждого кадра.После завершения игрового цикла GameData сохраняет данные в файл
  3. endThread останавливает игровой цикл в процессе выполнения и ожидает его завершения
  4. Действия касания действий doTouch из игровой активности

Кажется, работает.Это означает необходимость обрабатывать разные экраны (например, титульный экран, опции, игра и игра окончены) в одном потоке, но это не конец света, ИМХО.

Может быть, я опубликую код наCodeReview (я обновлю это, если я сделаю) и посмотрим, есть ли у кого-нибудь комментарии.Между тем, мне лучше кодировать следующие Angry Birds!

1 голос
/ 05 апреля 2011

Ответ так же прост, как и жизненный цикл. Переопределять обратные вызовы только тогда, когда вам нужно обрабатывать вещи там.

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

Тот факт, что определенные обратные вызовы не гарантированно будут вызываться, не означает, что они бесполезны. Только не пытайтесь обрабатывать разумные вещи в таких методах обратного вызова.

0 голосов
/ 04 апреля 2017

Зрелое, полнофункциональное и полнофункциональное Android-приложение переводится (состояние = функция времени) в соответствии с ответом @Felix.

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

Этот ответ, вероятно, вы найдете интересным.Система Android после прочтения AndroidManifest.xml знает, какая точка входа.Независимо от того, какое действие имеет это

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

Создание вашего основного процесса - задача системы Android.Когда компонент приложения запускается, и у приложения нет никаких других работающих компонентов, система Android запускает новый процесс Linux.После того, как процесс вызывает onCreate () , он создает основной поток. Именно поэтому вы должны вызвать onCreate () , потому что основной поток затем инициализируетсяи основной поток является триггером для всех ваших будущих действий.

В onCreate () вы получили ваш основной поток.После этого все зависит от вас, какие обратные вызовы вы хотите вызвать.Нет правила, которое вы должны вызывать onStart () после onCreate ().

Только один метод жизненного цикла onCreate () гарантированно вернет жизненный цикл вашего компонента.

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

//add the log line
        Log.i(this.getClass().getCanonicalName(), "##############");
        int count = 0;
        for (StackTraceElement stackTraceElement:  Thread.currentThread().getStackTrace()) {
            count++;
            Log.i(this.getClass().getCanonicalName(), "\""+Thread.currentThread().getStackTrace()[2].getMethodName()+"\" "+count+" "+stackTraceElement.getMethodName());
        }; //end of log line

Поэтому всегда добавляйте приведенный выше код для просмотра журналов в консоли log cat.

Когда ваше приложение запускает графический интерфейс, оно вызывает onStart ().Если вы не вызываете метод super () внутри обратного вызова, система Android показывает ошибку прерванного канала и не может выполнять дальнейшую обработку и отладку.

enter image description here

Но вы можете реализовать свою собственную логику внутри каждого метода обратного вызова.Например, вы можете выполнить суммирование двух чисел в onStart ().

Итак, все методы обратного вызова Android являются частично реализованными методами. Они не являются чисто абстрактными методами, потому что вы должны вызывать метод super () внутри них .

Прикрепленное изображение говорит: Главный процесс приложения вызывает onCreate (), он делегирует свои обязанности основному потоку (потоку пользовательского интерфейса), а основной поток вызывает эти 16 других обратных вызовов.

enter image description here

Далее, если вы хотите увидеть все ваши методы в определенное время, поместите этот код ниже.

//to see all the methods (including super methods) at this time, you call use the java reflection as below
    Log.i(this.getClass().getCanonicalName(), "##############");
    int count1 = 0;
    for (Method method:  this.getClass().getMethods()) {
        count1++;
        count++;
        Log.i(this.getClass().getCanonicalName(), count1+" "+method);
    }; //end of log line

    //At another time, after you add some other methods or android using GC removes some methods, you see your changed state (Bundle Snapshot) of your class
    //Because your bundle (i.e, the state of your class/activity) is the function of time.

В моем сценарии из приведенного выше фрагмента кода я вижу, что он вызвал 375 методов.

Примечание. Если бы вы добавили другой метод в onCreate () до того, как распечатали все свои методы, используя чуть выше фрагмент кода, вы бы также увидели этот метод.Это означает, что ваше состояние класса (т. Е. Снимок) соответствует вам, то, что вы делаете раз за разом, вы продолжаете обновлять свой снимок.

0 голосов
/ 17 октября 2015

Существует 7 методов, управляющих жизненным циклом активности в приложении Android:

  1. onCreate ()
  2. onStart ()
  3. onResume ()
  4. onRestart ()
  5. onPause ()
  6. onStop ()
  7. onDestroy ()

Я написал более подробно об этихметоды на моем блоге

0 голосов
/ 06 мая 2013

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

0 голосов
/ 04 апреля 2011

onCreate () очевидно первым. Ваша активность может затем войти в OnPause (). Оттуда это может быть либо onResume (), либо onDestroy (). Это самый простой путь в жизненном цикле, который я знаю.

У меня было действие, у которого не было метода onPause (). В ходе нечетной серии событий я заметил в DDMS, что мое приложение не было видно, но оно все еще запрашивало свежие объявления от AdMob :) Отличный аккумулятор. С тех пор это было решено, но напомнило мне, как важны простые вещи.

...