Как жизненные циклы Activity и ее видов могут перекрываться в android - PullRequest
1 голос
/ 25 февраля 2020

В android есть два жизненных цикла, в основном жизненный цикл Activity и View LifeCycle, но на какой фазе жизненного цикла активности запускается View LifeCycle? И с момента запуска View Lifecycle, проходит ли go весь жизненный цикл или завершается в различных частях жизненного цикла действия? (Если так, то, пожалуйста, укажите, какие методы в каких частях вызываются)

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Настоящим, это не 100% официальная диаграмма, которую я смешиваю с официальной диаграммы жизненного цикла активности и просмотра жизненного цикла , так как я не видел никаких диаграмм в android документация о жизненном цикле представления (если мы можем назвать его жизненным циклом).

enter image description here

Итак, на диаграмме оранжевые стрелки добавлены в виде наблюдения следующего демонстрационного приложения, которое просто для демонстрации взаимосвязи обоих жизненных циклов; где я создал фиктивный пользовательский TextView и зарегистрировал его методы жизненного цикла суперкласса вместе с его методами жизненного цикла удерживающей активности; и добавьте оранжевые стрелки соответственно.

Итак, как и на диаграмме, действие создается его onCreate(), и сразу после того, как макет действия накачан на setContentView(), система вызывает конструкторы вашего макета представления для их построения.

Теперь действие только что создано, и экземпляры представлений построены; и все еще ничего не видно на экране; тогда вызываются методы действия onStart(), & onResume() соответственно, и, следовательно, действие теперь видно на экране; и все же на нем ничего не нарисовано.

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

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

Рисование вида на экране проходит серию вызовов для определения некоторых измерений, таких как размеры и атрибуты; такие как ширина, высота, цвета, текст, отступы и т. д. c .. для этого необходимо несколько раз вызвать measure(); и впоследствии onMeasure() называется

В конце концов, вызывается onDraw() с аргументом canvas, который служит целевой поверхностью для рисования вида.

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

Когда действие уничтожено с помощью onDestroy(), затем, прежде чем главное окно действия отсоединится от оконного менеджера, базовые представления сначала будут иметь возможность отсоединиться от окна действия; и когда это на месте, представление onDetachedFromWindow() вызывается, чтобы объявить, что оно удалено с экрана, и, следовательно, действие теперь может быть отсоединено от оконного менеджера; когда это произойдет, onDetachedFromWindow() будет вызываться соответствующим образом.

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

Таким образом, в представлении нет ничего похожего на onDestroy(), представления могут присоединяться или отсоединяться от окна действия; Вы можете проверить этот ответ для этого. Кроме того, onDetachedFromWindow() представлений тесно связано с onDestroy() их действия, где, если вызывается onStop() действия, представление все еще присоединено к окну действия.

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

Обратите также внимание, что onAttachedToWindow() действия и представлений очень связаны с onCreate() действия; поэтому, когда вызывается onRestart() действия, действие и его представления уже связаны с окном, поэтому onAttachedToWindow() не вызывается (это не очень понятно на диаграмме).

Аналогично, onDetachedFromWindow() просмотров и активности связано только с onDestroy(); поэтому, когда действие приостановлено или остановлено, onDetachedFromWindow() не будет вызывать, и, следовательно, представления все еще прикреплены к окну.

Вы также можете играть с parentLayout.removeView(customView); и наблюдать за обратными вызовами.

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

Макет

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <com.example.android.androidxtest.CustomTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/long_text"
        android:textSize="22sp" />

</LinearLayout>

Активность

public class LifeCycleActivity extends AppCompatActivity {

    private static final String TAG = "LOG_TAG_ACTIVITY";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate: ");
        setContentView(R.layout.activity_view_lifecycle);
        Log.d(TAG, "onCreate: after setContentView()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart: ");
    }


    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        Log.d(TAG, "onAttachedToWindow: ");
    }

    @Override
    public boolean isDestroyed() {
        Log.d(TAG, "isDestroyed: ");
        return super.isDestroyed();
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        Log.d(TAG, "onDetachedFromWindow: ");
    }


}

Пользовательский вид

public class CustomTextView extends TextView {

    private static final String TAG = "LOG_TAG_VIEW";

    public CustomTextView(Context context) {
        super(context);
        Log.d(TAG, "CustomTextView: Constructor");
    }

    public CustomTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        Log.d(TAG, "CustomTextView: Constructor");
    }

    public CustomTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.d(TAG, "CustomTextView: Constructor");
    }

    public CustomTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        Log.d(TAG, "CustomTextView: Constructor");
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        Log.d(TAG, "onAttachedToWindow: ");
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d(TAG, "onMeasure: ");
    }

    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l, t, r, b);
        Log.d(TAG, "layout: ");
    }


    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        Log.d(TAG, "onLayout: ");
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        Log.d(TAG, "dispatchDraw: ");
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        Log.d(TAG, "draw: ");
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw: ");
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        Log.d(TAG, "onDetachedFromWindow: ");
    }

}

Вход в систему при запуске приложения

2020-02-25 14:09:41.859 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onCreate: 
2020-02-25 14:09:41.945 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: CustomTextView: Constructor
2020-02-25 14:09:41.945 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onCreate: after setContentView()
2020-02-25 14:09:41.947 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onStart: 
2020-02-25 14:09:41.954 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onResume: 
2020-02-25 14:09:41.984 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onAttachedToWindow: 
2020-02-25 14:09:41.985 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onAttachedToWindow: 
2020-02-25 14:09:41.993 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onMeasure: 
2020-02-25 14:09:42.005 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onMeasure: 
2020-02-25 14:09:42.006 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onLayout: 
2020-02-25 14:09:42.006 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: layout: 
2020-02-25 14:09:42.032 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onDraw: 
2020-02-25 14:09:42.032 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: dispatchDraw: 
2020-02-25 14:09:42.032 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: draw: 

Войдите в кнопку меню (история приложения)

2020-02-25 13:44:44.462 32357-32357/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onPause: 
2020-02-25 13:44:44.511 32357-32357/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onStop: 

Войдите в наше приложение из кнопки меню (история приложения)

2020-02-25 14:11:23.387 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onRestart: 
2020-02-25 14:11:23.392 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onStart: 
2020-02-25 14:11:23.394 2043-2043/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onResume: 
2020-02-25 14:11:23.405 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onMeasure: 
2020-02-25 14:11:23.420 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onLayout: 
2020-02-25 14:11:23.420 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: layout: 
2020-02-25 14:11:23.424 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onDraw: 
2020-02-25 14:11:23.424 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: dispatchDraw: 
2020-02-25 14:11:23.424 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: draw: 
2020-02-25 14:11:23.455 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onMeasure: 
2020-02-25 14:11:23.460 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onMeasure: 
2020-02-25 14:11:23.460 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onLayout: 
2020-02-25 14:11:23.460 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: layout: 
2020-02-25 14:11:23.461 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: onDraw: 
2020-02-25 14:11:23.461 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: dispatchDraw: 
2020-02-25 14:11:23.462 2043-2043/com.example.android.androidxtest D/LOG_TAG_VIEW: draw: 

Вход в систему изменения конфигурации (вращение)

2020-02-25 17:05:00.481 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onPause: 
2020-02-25 17:05:00.492 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onStop: 
2020-02-25 17:05:00.493 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onDestroy: 
2020-02-25 17:05:00.512 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: onDetachedFromWindow: 
2020-02-25 17:05:00.517 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onDetachedFromWindow: 
2020-02-25 17:05:00.563 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onCreate: 
2020-02-25 17:05:00.600 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: CustomTextView: Constructor
2020-02-25 17:05:00.601 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onCreate: after setContentView()
2020-02-25 17:05:00.604 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onStart: 
2020-02-25 17:05:00.611 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onResume: 
2020-02-25 17:05:00.626 8058-8058/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onAttachedToWindow: 
2020-02-25 17:05:00.626 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: onAttachedToWindow: 
2020-02-25 17:05:00.629 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: onMeasure: 
2020-02-25 17:05:00.659 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: onMeasure: 
2020-02-25 17:05:00.659 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: onLayout: 
2020-02-25 17:05:00.660 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: layout: 
2020-02-25 17:05:00.674 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: onDraw: 
2020-02-25 17:05:00.674 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: dispatchDraw: 
2020-02-25 17:05:00.674 8058-8058/com.example.android.androidxtest D/LOG_TAG_VIEW: draw: 

На спине нажата

2020-02-25 16:10:24.743 7314-7314/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onPause: 
2020-02-25 16:10:25.341 7314-7314/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onStop: 
2020-02-25 16:10:25.343 7314-7314/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onDestroy: 
2020-02-25 16:10:25.343 7314-7314/com.example.android.androidxtest D/LOG_TAG_VIEW: onDetachedFromWindow: 
2020-02-25 16:10:25.344 7314-7314/com.example.android.androidxtest D/LOG_TAG_ACTIVITY: onDetachedFromWindow: 
0 голосов
/ 25 февраля 2020

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

0 голосов
/ 25 февраля 2020

Каждый android компонент имеет свой жизненный цикл. Service, View, Fragment, Activity, ... Я рекомендую сначала обратиться к документу Android, чтобы получить его базовую c концепцию.

...