основы функций жизненного цикла активности Android

Я тестировал этот код, который показывает, в каком состоянии находится действие.

public class Activity101Activity extends Activity {
    String tag  =  "Lifecycle";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        // setContentView(R.layout.main);
        setContentView(R.layout.activity_activity101);
        Log.d(tag , "In the onCreate() event");
    }
    public void onStart()
    {
        super.onStart();
        Log.d(tag , "In the onStart() event");
    }

    public void onRestart()
    {
         super.onRestart();
        Log.d(tag , "In the onRestart() event");
    }

    public void onResume()
    {
         super.onResume();
        Log.d(tag , "In the onResume() event");
    }

    public void onPause()
    {
         super.onPause();
        Log.d(tag , "In the onPause() event");
    }

    public void onStop()
    {
         super.onStop();
        Log.d(tag , "In the onStop() event" );
    }

    public void onDestroy()
    {
         super.onDestroy();
        Log.d(tag , "In the onDestroy() event");
    }
}  

поэтому я вижу, что onDestroy() вызывается только тогда, когда мы нажимаем кнопку «Назад», когда активность находится на экране, и никогда не вызывается в противном случае. Таким образом, он должен работать в фоновом режиме, если я нажимаю кнопку «Домой» во время выполнения действия. Однако, если я перейду к Settings -> Apps -> Running, я не увижу его в списке. Значит ли это, что он работает в фоновом режиме или нет?

Опять же, этот код показывает, что за onPause() всегда следует onStop(), а за onStart() всегда следует onResume(). Так почему же они определены как разные функции в среде Android, а не объединены?


person user13267    schedule 20.08.2013    source источник
comment
Google: android lifecycle первый результат developer.android.com/training/basics/activity -lifecycle/ Вы не можете видеть его в приложении -› работающим, потому что оно на самом деле не работает, как в случае, у него нет запущенного фонового потока, когда оно больше не находится на переднем плане, это просто остановлен, и информация о его переменной состояния временно сохраняется до тех пор, пока вы не откроете его повторно, ИЛИ не будет удалена, если системе потребуются эти ресурсы.   -  person LuckyMe    schedule 20.08.2013


Ответы (4)


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

Чтобы понять, почему onStart нужен перед onResume, перейдите по ссылке ниже. Это ясно рассеет все ваши сомнения:

Разница между onStart() и onResume()

person Sushil    schedule 20.08.2013

Здесь я даю вам biref представление о жизненном цикле деятельности...

введите здесь описание изображения

при создании():

Вызывается при первом создании действия. Здесь вы должны выполнить всю обычную статическую настройку: создать представления, привязать данные к спискам и т. д. Этот метод также предоставляет вам пакет, содержащий ранее замороженное состояние активности, если оно было. Всегда следует onStart().

при перезапуске():

Вызывается после того, как ваша активность была остановлена, прежде чем она будет запущена снова. Всегда следует onStart()

при запуске():

Вызывается, когда действие становится видимым для пользователя. За ним следует onResume(), если активность выходит на передний план, или onStop(), если она становится скрытой.

onResume():

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

при паузе ():

Вызывается как часть жизненного цикла действия, когда действие переходит в фоновый режим, но (еще) не было уничтожено. Аналог onResume(). Когда действие B запускается перед действием A, этот обратный вызов будет вызываться для A. B не будет создан до тех пор, пока не вернется onPause() A, поэтому не делайте здесь ничего длинного.

приостановке():

Вызывается, когда вы больше не видны пользователю. Затем вы получите либо onRestart(), onDestroy(), либо ничего, в зависимости от дальнейшей активности пользователя.

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

при уничтожении():

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

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

И как только вы нажимаете кнопку «Домой» или кнопку «Назад», ваше приложение работает в фоновом режиме, и как только вы убиваете его из диспетчера задач, оно ничего не показывает в настройках...

person Archan Desai    schedule 30.11.2015

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

person Matthew    schedule 20.08.2013

Это потому, что есть шанс, что onStart может не вызываться, даже если onResume на самом деле есть, есть сценарий, когда активность может перейти только в onPause, без перехода в onStop [это происходит только тогда, когда активность частично видна, а не полностью покрыта другой активностью ], поэтому при возвращении к активности будет вызываться только onResume, а не onStart.

То же самое с onPause, он всегда выполняется до onStop, но onStop может не вызываться после onPause, как упоминалось ранее, он может быть вызван без фактического вызова onStop. Если вы нажмете ДОМОЙ, вы не увидите поведение, которое я только что объяснил, потому что действие частично не видно, чтобы воспроизвести его, вы должны найти способ сделать другой компонент выше, не полностью закрывая действие...

Надеюсь это поможет.

С уважением!

person Martin Cazares    schedule 20.08.2013
comment
Если я начну полноэкранное действие 2 из своего действия 1, будет ли оно считаться полным перекрытием действия 1? - person user13267; 20.08.2013