Android開発におけるActivityのライフサイクルと読み込みモードについて詳しく解説
この記事では、Activity のライフ サイクルについて紹介します。iOS を学習したことがある方なら、Activity のライフ サイクルは iOS の ViewController のライフ サイクルと非常に似ています。ライフサイクルを理解するのは難しくありません。人の一生は生老病死に他なりませんが、花の一生は咲いて散るのです。 Android における Activity のライフ サイクルは、Activity の作成から消滅までのプロセスにほかなりません。このブログでは、アクティビティのライフ サイクルのさまざまな段階を紹介し、例を通してアクティビティのライフ サイクルを覗いていきます。各ライフサイクルの各段階を理解することによってのみ、異なる段階で異なることを実行できるため、アクティビティのライフサイクルを理解することが重要です。
次に、例を通してアクティビティのライフサイクルを紹介します。このデモでは、MainActivity がアプリの起動後に表示される最初のアクティビティになります。 MainActivity にボタンがあります。このボタンをクリックすると SecondActivity にジャンプします。リターンキーをクリックすると、SecondActivity から MainActivity に戻ります。この一連のアクティビティの切り替えを通じて、ログを出力することでアクティビティのライフサイクルを観察します。
1. コードの作成
実際、このブログのコードは非常に単純です。アクティビティのライフ サイクルのさまざまな段階のメソッドを書き換えて、このライフ サイクルの段階をマークするメソッドを出力します。 。デモの UI も非常にシンプルなので、アクティビティ レイアウト ファイルについてはあまり詳しく説明しません。次に、2 つのアクティビティのキー コードを見てみましょう。
1. 以下のコードは、MainActivity の主要なコードであり、アクティビティのライフサイクルのさまざまな段階を書き換えて、どのアクティビティのどのメソッドをマークするかをログに出力します。 onCreate() メソッドの ID でボタンを取得し、クリック イベントをボタンにバインドし、ボタンがクリックされたときに SecondActivity にジャンプします。具体的なコードは以下の通りです。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("lifeCycle", "MainActivity: 我是onCreate方法,我会在Activity第一次被创建是调用"); Button jumpButton = (Button) findViewById(R.id.jump_second_button); jumpButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //跳转到SecondActivity Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } //Ctrl + O 选择父类中的方法进行重写 @Override protected void onStart() { super.onStart(); Log.d("lifeCycle", "MainActivity: 我是onStart方法,我会在Activity由不可见变为可见时调用"); } @Override protected void onResume() { super.onResume(); Log.d("lifeCycle", "MainActivity: 我是onResume方法,我在Activity处于运行状态时调用"); } @Override protected void onPause() { super.onPause(); Log.d("lifeCycle", "MainActivity: 我是onPause方法,我会在Activity暂停时调用"); } @Override protected void onStop() { super.onStop(); Log.d("lifeCycle", "MainActivity: 我是onStop方法,我会在Activity停止时调用"); } @Override protected void onRestart() { super.onRestart(); Log.d("lifeCycle", "MainActivity: 我是onRestart方法,我会在Activty从停止状态变为运行状态时调用"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("lifeCycle", "MainActivity: 我是onDestroy方法,我会在Activty销毁之前调用"); }
2. 上記のメソッドも SecondActivity に書き換えられます。唯一の違いは、上記のログの MainActivity を SecondActivity に変更することです。コードは同様なので、上には貼り付けません。
2. 印刷されたログを実行して観察します
アプリを実行し、印刷されたログを観察し、例を通じてアクティビティのライフ サイクルを分析します。具体的な手順は次のとおりです。
1. アクティビティを作成してアクティブ化します
アプリを初めて開いたときに出力されるログは次のとおりです。 MainActivity は、アプリを開いたときに最初に表示されるもので、MainActivity が初めて表示されるときに次の 3 つのメソッドを呼び出す必要があることが簡単にわかります。以下の 3 つのメソッドの後、MainActivity が作成されて表示されます。 、ようやく実行状態になります。
(1).onCreate() メソッド: このメソッドは、アクティビティが初めて作成されるときに呼び出されます。前のデモでは、アクティビティのレイアウトやコントロール、および関連するイベントをこのメソッドに読み込みました。
(2).onStar()t メソッド: 次に、アクティビティが非表示から表示に変更されると、このメソッドが呼び出されます。
(3).onResume メソッド: Activity が表示された後、onResume メソッドを呼び出して実行状態に変更する必要があります。
2. アクティビティ間の切り替え
より明確にするために、SecondActivity にジャンプするボタンをクリックする前に、以前のログをクリアするために使用されるゴミ箱のサインが下にあります。印刷されたログ。以下に出力されるログは、ジャンプボタンをクリックしたときに出力されるログです。この切り替えプロセス中に、MianActivty は実行を停止して非表示になり、SecondActivy が作成されて実行状態になります。具体的な手順は以下の通りです。
(1).onPause() メソッド: ジャンプ ボタンをクリックすると、実行中の MainActivity が onPause() を呼び出して停止しますが、まだ表示されています。
(2). 次に、SecondActivity は、作成する onCreate() メソッド、表示する onStart() メソッド、および実行する onResume() メソッドを呼び出します。
(3).onStop() メソッド: SecondActivity の実行中、MainActivity は完全に非表示になるため、onStop() メソッドが呼び出され、完全に非表示の停止状態に入ります。
3. 別のアクティビティから戻る
SecondActivity からリターンキーをクリックすると、SecondActivity から MainActivity に戻ります。以下のログは、戻るボタンをクリックしたときに出力されるログです。
(1) onPause() メソッド: 戻るボタンをクリックした後、SecondActivity は onPause() メソッドを呼び出し、一時停止された実行状態に入ります。
(2)onRestart() メソッド: MainActivity は onRestart() メソッドを呼び出して、停止状態から実行状態に変更します。次に、MainActivity は onStart メソッドを非表示から表示に呼び出し、次に onResume() メソッドを呼び出して最終的に実行状態に入ります。
(3)当返回到MainActivity中并且MainActivity处于运行状态后,SecondActivity会调用onStop方法,停止运行并不可见。因为SecondActivty做的事出栈操作,停止运行后,就会调用onDestory方法进行销毁。下此在进入SecondActivity中时,还是从onCreate方法进行执行。
4.Activity退出并销毁
接着在MainActivity中点击返回按钮就会退出App了,下方是退出App时打印的Log信息。MainActivty先调用onPause()方法变为暂停运行状态,然后再调用onStop()方法停止运行,最后调用onDestroy()方法进行销毁。
三.生命周期流程图
1.上面是用语言通过实例打印出的Log来描述两个Activity切换的生命周期,接下来将用一个流程图来描述这一过程,具体流程图如下。
2.通过上面的实例不难分析出一个Activity的生命周期分为哪些阶段,并且很容易的看出哪些阶段在什么时候执行,所以我们很容易的画出一个Activity的生命周期,下方的流程图是一个Activity的生命周期。
四.Activity的加载模式
Activity的启用模式也较为简单,它会在活动切换时用到。Activity的启动模式分为四种,standard、singleTop、singleTask、singleInstance模式。接下来将为大家详细的介绍一下这几种加载模式。
Activity的加载模式可以在配置文件AndroidManifest.xml中进行配置,配置项为android:launchMode具体如下图所示:
1.standard模式
在Activity的栈中无论该活动有没有加入栈,活动就会被创建。测试方式是把MainActivity的launchMode设置成standard, 在MainActivity中添加一个按钮,点击按钮使用Intent跳转到当前Activity,看onCreate方法中打印的Log。点击按钮的方法如下:
Button launchModelButton = (Button) findViewById(R.id.launch_model_button); launchModelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); } });
standard加载模式的栈如下所示,无论栈中有没有该对象的实例,都会被创建。
2.singleTop模式
只要被创建的活动不位于栈的顶部,该活动就会被创建入栈。如果将要被创建的活动位于栈的顶部,该活动的实例就不会被创建。测试方法,把上面的模式直接改成singleTop模式,MainActivty往自己身上跳转就不会从新创建一个新的实例,会重用之前在栈顶中的实例。如果是MainActivty跳转到SecondActivty, 然后SecondActivity再次跳转到MainActivty, 那么此时的MainActivity将会被创建,因为栈顶是SecondActivity。如下所示:
3.singleTask模式
单任务模式,这个也不难理解,如果从MainActivty跳转到SecondActivity, 如果再从SecondActivty跳转到MainActivity, 在单任务模式下MainActivity已经在栈中,就会把它之前的Activity出栈,使其处于在栈顶活跃的位置。原理如下图所示:
4.singleInstance
可以看成单例模式,这个比较特殊,被设置成singleInstance的Activity将会放入另一个栈中,因为这样为了便于共用。上面3中模式位于同一个栈中。下方ThirdActivity跳转到一个加载模式为singleInstance的Activity中。
今日のアクティビティのライフサイクルはここまでです。関連するコンテンツは次のブログで更新されます。
Android 開発におけるアクティビティのライフサイクルと読み込みモードの詳細な説明については、PHP 中国語 Web サイトに注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

intellijideaultimatiateバージョンを使用してスプリングを開始します...

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

データベースクエリにTKMYBATISを使用する場合、クエリ条件を構築するためにエンティティクラスの変数名を優雅に取得する方法は一般的な問題です。この記事はピン留めします...

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。
