アクティビティのライフサイクルの詳細な調査

序文

Android の 4 つの主要コンポーネントの中で、Activity の位置も非常に重要であり、Activity のライフサイクル プロセスを理解することは間違いなく Android の開発に非常に役立ちます。バー!

Actvity のライフサイクルを学ぶ前に、まず作者の Activity に対する理解について話しましょう。筆者が Android 開発に初めて触れたとき、Activity とは何かということについて非常に混乱しており、多くの入門書では、Activity が何なのかについて詳しく紹介されておらず、単に Android の 4 つの主要コンポーネントの 1 つであるとだけ書かれているものがほとんどでした。何が問題なのか、そのライフサイクルのコールバック関数を紹介しましょう...おそらく、
今この記事を読んでいるあなたは、アクティビティはアクティビティではなく、通常画面全体に表示されるすべてのコンテンツであると思うかもしれません。 Android スマートフォンの? 例えば、下の写真の携帯電話の画面でしょうか?

これは、Activity に対する偏った理解であると筆者は考えており、携帯電話の画面に表示されているのは、Activity ではなく、FrameLayout の DecorView から継承されたサブクラス View であり、Activity は、その View を運ぶためのキャリアとして使われているだけであると考えています。筆者は、Activity は携帯電話の画面上で見られるビューではなく、キャリアとみなすことができると考えています。

アクティビティ階層


この写真は主に、携帯電話の画面に表示されるビュー (TitleView と ContentView) ではなく、Activity がキャリアとしてみなされることをよりわかりやすく説明するために取り出したものであるため、ソース コードの実装についてはより具体的です。は一時的に制限されているため、ここでは当面は詳しく説明しません:);

アクティビティのライフサイクルのフローチャート

アクティビティ_ライフサイクル

Android システムのアクティビティはアクティビティ スタック (アクティビティ スタック) によって管理されます (スタック管理要素は先入れ後出しの特徴があります)。新しいアクティビティが開始されると、新しいアクティビティはアクティビティ スタック内にプッシュされます。 、アクティビティ スタックの最上位要素となり、このアクティビティはユーザーと対話する準備を開始します。つまり、アクティブなアクティビティになります (ユーザーと対話する現在のアクティビティは常に最上位を保持することに注意してください)スタックの位置。ユーザーと対話する現在のアクティビティが終了するまで、その背後にあるアクティビティが再びスタックの先頭に戻り、アクティブなアクティビティになります。)

新しいアクティビティがタスク スタックにプッシュされるか、現在ユーザーと対話しているアクティビティがタスク スタックからポップされます。スタックのプッシュまたはポップのプロセスでは、上記のアクティビティ ライフ サイクル フローチャートの対応するコールバック関数は次のようになります。引き金になった。

1.0 アクティビティ内の各コールバック関数が表す状態

  • onCreate()このコールバック関数は、アクティビティが初めて作成されたときにコールバックされ、主に表示するレイアウト ビューの設定、レイアウト ビューへのデータのバインド、変数の初期化に使用されます。
    • onRestrart()アクティビティが完全に非表示であるが、アクティビティが破棄されていない場合、アクティビティがスタックの先頭に戻ると(完全に非表示の場合、アクティビティはスタックの先頭にありません)、呼び戻されます。その後、onStart() がコールバックされます。
    • onStart()アクティビティはすべてユーザーに表示されますが、まだフォーカスを取得していません。つまり、ユーザーが操作を実行できない場合、ユーザーはコールバックされますが、コールバック プロセスはユーザーにとって非常に短いため、ユーザーは気づくことができません。それ。
      • onResume()現在のアクティビティがフォーカスを取得する前、つまりコールバック後、ユーザーが入力ボックスをクリックして入力などの一連の操作を実行できるようにするためにコールバックされます。すべてがユーザーに表示されます。
      • onPause()この関数は、前のコンテンツが部分的にしかユーザーに表示されないときにコールバックされます (注: インターフェイス上にダイアログがポップアップしたとき、または入力ボックスをクリックした後に入力ボックスがポップアップしたときに、この関数はコールバックされませんが、コールバックされることもあります)現時点では部分的にユーザーに表示されます)、たとえばダイアログがあります。ボックス スタイルのアクティビティがポップアップすると、この関数がコールバックされます。
    • onStop()アクティビティ内のビューが完全に非表示になると、この関数がコールバックされます。
  • onDestroy()アクティビティが終了すると、finish() メソッドが実行されます。または、システム メモリが不足している場合は、アクティビティが強制終了され、この関数がコールバックされます。

上記のコールバック関数は、ユーザーがアクティビティを開いたとき、アクティビティを閉じたとき、およびアクティビティを再度開いたときに対応するコールバック関数です。

2.0 Dubug モードを通じてアクティビティのライフ サイクルを表示する

次のコードは、Dubug を実行するときに作成者が使用したソース コードです。

public class MainActivity extends AppCompatActivity {
    
    

    private static final String TAG = "测试Activity的生命周期";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e(TAG, "onCreate: ");
    }

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

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

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

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

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

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


}
2.1 アクティビティをスタックの先頭に初めて追加します。

202017-10-04

2.2 メニュー キーが押されたときのアクティビティの状態:

202017-10-04

2.3 会話型アクティビティがタスク スタックの最上位で実行されている場合:

2017-08

この Dubug モードは主にテスト用であり、アクティビティが入力ボックス、フラグメント型ダイアログ、または非フラグメント型ダイアログをポップアップ表示すると、アクティビティのライフサイクルの変化がコンソール ログから確認できます。これにより、アクティビティのライフ サイクルが変更され、作成者が 3 番目のボタン (このボタンは画像とダイアログ フォームのみを表示するアクティビティを監視します) をクリックすると、コンソールに onPause() コールバック関数が出力されます。アクティビティ内にある 部分的に表示されている場合、または次のような場合: 大きなアクティビティが別の小さなアクティビティによって覆われている場合でも、大きなアクティビティは依然としてユーザーには部分的に表示されており、この時点で onPause() 関数がコールバックされます。小さな
アクティビティのとき アクティビティが非表示になっているとき このとき、大きなアクティビティはスタックの先頭に戻ります スタックの先頭に戻る前に、onResume() 関数がコールバックされ、ユーザーとの対話の準備が行われますまた;

2.4 アクティビティを閉じます。つまり、スタックの最上位からアクティビティを削除します。

2000 ~ 39 年

3.0 水平画面と垂直画面を切り替えるときのアクティビティのライフサイクルの変更

3.1 縦向きから横向きに切り替えるときのアクティビティのライフサイクルの変更

2000-47


3.2 画面を横長から縦長に切り替えた場合のアクティビティのライフサイクルの変化

2000-48


上記の横画面と縦画面の切り替えのデバッグ ログからわかるように、横画面と縦画面を切り替えると、アクティビティは onDestroy() 関数をコールバックし、その後、再度 onCreat() 関数をコールバックします。アプリケーションが水平画面と垂直画面を切り替えることはできません。このとき、コールバック onDestroy() 関数が発生し、その後 onCreat() 関数がコールバックされます。現時点で、アクティビティが onCreat() 関数を再度呼び出さないようにするには、次の 2 つの解決策があります。

  • AndroidManifest.xml で関連プロパティを直接設定しても、水平画面と垂直画面の切り替えは許可されません。
    主に、android:screenOrientation="portrait"水平画面と垂直画面の切り替えを許可しないアクティビティでこのプロパティを設定するためportraitです。つまり、水平画面ではなく垂直画面のみが許可されます。そしてlandscapeその逆も同様です。

アプリケーション ノードの下のコードは次のとおりです: (以下の注 1 と同様)

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait"> <!--1-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
  • AndroidManifest.xml で関連する属性を構成し、アクティビティのライフサイクルが変更されないことを直接宣言し、
    主にこの属性を独自の AndroidManifest.xml で構成しますandroid:configChanges="orientation|keyboardHidden|screenSize"

アプリケーション ノードの下のコードは次のとおりです: (以下の注 2 と同様)

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"> <!--2-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

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

まとめ

今回は、Activity のライフサイクルのプロセス分析は、その API インターフェイスのレベルでのみ行われます。アクティビティのライフサイクルを分析する場合、アクティビティの変化、アクティビティ間の切り替えとアクティビティスタック内での位置の関係を把握できれば、アクティビティのライフサイクルの変化は把握できると筆者は考えている。アクティビティは十分に分析されます。


ソースコードのダウンロード

おすすめ

転載: blog.csdn.net/HongHua_bai/article/details/78159113