startActivity のライフサイクル

I.はじめに

        AMS (ActivityManagerService) は Activity 管理のコア コンポーネントであり、Activity の起動、ライフサイクル管理、スタック管理などの機能を提供します. AMS に精通していると、Activity の動作原理を理解するのに役立ちます.

        AMS にはコンテンツが多すぎて、網羅的に分析することはできません.Activity の開始、Activity メッセージの返信 (onActivityResult)、Activity スタックの管理、および AMS、WMS の共同作業から、これらの点を深く理解しましょう。 、および PMS. 、ソース コードを組み合わせるプロセスを通じて、AMS についての理解が深まりました。

        This article focus on the lifecycle of the Activity, through the execution of the life cycle method, and then continue to track the code of the Framework layer. For the source code analysis of the Fwk layer, see: Android ActivityManagerService Summary (4   ) startActivity プロセス

2. startActivity のライフサイクル

StartActivityDemo.apk という名前の appA と MyClient.apk という名前の appB の 2 つのアプリをデモ コードとして使用します。

デバイスで実行されている 2 つのアプリは、2 つの独立したプロセスです

1. appA で、MainActivity を介して内部 SecondActivity を開始します。  

2. 次に、SecondActivity で appB の BprocessActivity を開始します。

モデル図:

 2 つのデモのキー コード、各ライフ サイクル メソッドでキー ログを追加します。

1.プロセス A の MainActivity コード:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("activity", "==进程A===MainActivity onCreate=====");
        setContentView(R.layout.activity_main);

        Button startBtn = findViewById(R.id.start_activity);

        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                //跳转到SecondActivity
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e("activity", "==进程A===MainActivity onStart=====");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("activity", "==进程A===MainActivity onRestart=====");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("activity", "==进程A===MainActivity onResume=====");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.e("activity", "==进程A===MainActivity onPause=====");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e("activity", "==进程A===MainActivity onStop=====");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("activity", "==进程A===MainActivity onDestroy=====");
    }

2.プロセス A のSecondActivityコード

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("activity", "==进程A===2222222222 onCreate=====");
        setContentView(R.layout.activity_second);

        Button startBprocessBtn = findViewById(R.id.start_processB);
        startBprocessBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                ComponentName componentName = new ComponentName("com.example.myclient",
                        "com.example.myclient.BprocessActivity");
                intent.setComponent(componentName);
                try{
                    //跳转到进程B中的 BprocessActivity
                    startActivity(intent);
                } catch (Exception e) {
                    Log.e("activity", "error:  "+e.getMessage());
                }
            }
        });

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e("activity", "==进程A===2222222222 onStart=====");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("activity", "==进程A===2222222222 onRestart=====");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("activity", "==进程A===2222222222 onResume=====");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.e("activity", "==进程A===2222222222 onPause=====");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e("activity", "==进程A===2222222222 onStop=====");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("activity", "==进程A===2222222222 onDestroy=====");
    }

}

3.プロセス B の processActivityコード

public class BprocessActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("activity", "====进程B的 BprocessActivity onCreate====");
    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.e("activity", "====进程B的 BprocessActivity onStart====");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.e("activity", "====进程B的 BprocessActivity onResume====");
    }


    @Override
    protected void onStop() {
        super.onStop();
        Log.e("activity", "====进程B的 BprocessActivity onStop====");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("activity", "====进程B的 BprocessActivity onDestroy====");
    }

}

3. ログ印刷

ジャンプマップ:

3.1 appA を起動し、メイン インターフェイス MainActivity に入ります

04-03 13:12:41.118 24230 24230 E activity: ==进程A===MainActivity onCreate=====
04-03 13:12:41.156 24230 24230 E activity: ==进程A===MainActivity onStart=====
04-03 13:12:41.159 24230 24230 E activity: ==进程A===MainActivity onResume=====

 3.2 [SecondActivity にジャンプ] ボタンをクリックします

04-03 13:13:17.473 24230 24230 E activity: ==进程A===MainActivity onPause=====
04-03 13:13:17.496 24230 24230 E activity: ==进程A===2222222222 onCreate=====
04-03 13:13:17.539 24230 24230 E activity: ==进程A===2222222222 onStart=====
04-03 13:13:17.541 24230 24230 E activity: ==进程A===2222222222 onResume=====
04-03 13:13:18.045 24230 24230 E activity: ==进程A===MainActivity onStop=====

なお、MainActivity は最初に onPause で、SecondActivity が表示された後、onStop メソッドを実行します。

3.3 次に、SecondActivity インターフェイスの [プロセス B にジャンプ] ボタンをクリックします。

04-03 13:15:36.686 24230 24230 E activity: ==进程A===2222222222 onPause=====
04-03 13:15:36.750 24289 24289 E activity: ====进程B的 BprocessActivity onCreate====
04-03 13:15:36.753 24289 24289 E activity: ====进程B的 BprocessActivity onStart====
04-03 13:15:36.757 24289 24289 E activity: ====进程B的 BprocessActivity onResume====
04-03 13:15:37.242 24230 24230 E activity: ==进程A===2222222222 onStop=====

また、最初に onPause メソッドを実行し、プロセス B の BprocessActivity が表示された後に onStop メソッドを実行します。

4. 明確化すべき課題

上記のログ出力により、Android 基盤を持つ開発者は一目で何が起こっているかを知ることができます.もちろん、何が起こっているのかを知る必要があります.その理由を知りましょう.

実際に理解する必要があるのは、次の 3 つの質問と、フレームワーク層での呼び出しプロセスとは何かです。

1. 同じプロセスで startActivity メソッドを呼び出すプロセスは何ですか?

2. 別のプロセスでアクティビティを開始する場合、startActivity の呼び出しプロセスは何ですか?

3. 新しいアクティビティを開始するには、最初に onPause メソッドを実行し、新しいインターフェイスが表示された後に onStop メソッドを実行するのはなぜですか?

この 3 つの質問に対する回答は、著者のフレームワーク層の分析 Android ActivityManagerService のまとめ (4) startActivity プロセスを参照してください。

おすすめ

転載: blog.csdn.net/u012514113/article/details/129926101