huazi

huazi

「Android開発の芸術探求」ノート-第1章

1. Activity ライフサイクルの包括的な分析#

通常のライフサイクル

  • onCreate: Activity が作成されていることを示す
  • onReStart: Activity が再起動されていることを示す。通常、現在の Activity が非表示から表示可能な状態になると、onReStart が呼び出されます。現在の Activity が一時停止して停止した後、この Activity に戻ると、このメソッドが呼び出されます。
  • onStart: Activity が開始されていることを示す。これは Activity が表示されているが、まだ前面に表示されておらず、相互作用はできない状態です。Activity が表示されているが、まだ見えないと考えることができます。
  • onResume: Activity が表示され、前面でアクティブになっていることを示す。onStart と onResume はどちらも表示可能を示しますが、onStart の場合は Activity がバックグラウンドにあるのに対して、onResume の場合は Activity が前面に表示されています。
  • onPause: Activity が停止していることを示す。この時点でデータの保存やアニメーションの停止などの操作を行うことができますが、時間のかかる操作は避ける必要があります。なぜなら、これは Activity の表示に影響を与えるためです。oPause は完了するまでに実行され、新しい Activity の onResume が実行されます。
  • onStop: Activity が停止することを示す。重いリソースの回収などの操作を行うことができますが、時間のかかる操作は避ける必要があります。
  • onDestory: Activity が破棄されることを示す。これは Activity ライフサイクルの最後のコールバックであり、リソースの解放や回収作業を行うことができます。

現在の Activity が透明なテーマで新しい Activity を開く場合、現在の Activity は onStop を呼び出しません。

onStart と onStop は表示可能な観点からコールバックされますが、onResume と onPause は前面に表示されているかどうかの観点からコールバックされます。それ以外の場合、実際の使用中にはほとんど違いはありません。

新しい Activity を起動する前に、スタックのトップにある Activity は一時停止する必要があり、新しい Activity が起動できるようになります。

onPause と onStop では時間のかかる操作を行うことはできません、特に onPause では避ける必要があります。したがって、できるだけ onStop で操作を行うようにしてください。

通常、システムの設定が変更されると、Activity は破棄されます。Activity が異常な状態で終了する場合、システムは onSaveInstanceState を呼び出して現在の Activity の状態を保存します。コールバックのタイミングは onStop の前です。Activity が再作成されると、システムは onRestoreInstanceState を呼び出します。タイミング的には onStart の後です。

各 View には onSaveInstanceState と onRestoreInstanceState メソッドがあり、どのデータを View に復元できるかはその実装からわかります。

システムは異常終了時にのみ onSaveInstanceState と onRestoreInstanceState を呼び出してデータを保存および復元します。他の場合は呼び出されません。

2. Activity の起動モード#

  • standard: 標準モード、Activity を起動するたびに新しいインスタンスを作成し、スタックに入れ、デフォルトで起動元の Activity が所属するタスクスタックに入ります。
  • singleTop: スタックトップ再利用モード、新しい Activity がスタックトップにある場合、Activity は再作成されず、onNewIntent メソッドが呼び出されます。
  • singleTask: スタック内再利用モード、Activity がスタック内に存在する限り、この Activity を複数回起動しても新しいインスタンスは作成されず、onNewIntent メソッドが呼び出されます。存在しない場合、システムは必要なタスクスタックを検索し、タスクスタックが存在しない場合はタスクスタックを作成してからスタックに入れます。タスクスタックが存在する場合は、スタック内にインスタンスがあるかどうかを確認し、インスタンスがあればスタックトップに移動し、なければ新しいインスタンスを作成してスタックに入れます。
  • singleInstance: シングルインスタンスモード、singleTask と似ていますが、このモードの Activity は単独のタスクスタックに存在する必要があります。スタック内再利用の特性により、後続の Activity は新しいインスタンスを作成しません。

TaskAffinity を使用してタスクスタックの名前を設定できます。デフォルトでは、タスクスタックの名前はパッケージ名です。

タスクスタック A がフォアグラウンドタスクスタックであり、タスクスタック B がバックグラウンドである場合、バックキーを押すと、タスクスタック A が最初にポップされ、次にタスクスタック B がポップされ、最後にホーム画面に戻ります。

質問:第三者アプリに共有する場合、どの起動モードを使用しますか?

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS フラグは、この Activity が履歴の Activity リストに表示されないことを示します。android="true" と同等です。

3. IntentFilter のマッチングルール#

Activity の起動は明示的な呼び出しと暗黙的な呼び出しに分けられます。明示的な呼び出しでは、起動するオブジェクトの情報、クラス名、パッケージ名を明確に指定する必要があります。暗黙的な呼び出しでは、それらを指定する必要はありません。

IntentFilter のフィルタリング情報には、action、category、data があります。

  • action: Intent の action はフィルタルールの action と一致する必要があります。文字列が完全に一致し、大文字と小文字が区別されます。
  • category: startActivity 時にシステムはデフォルトで android.intent.category.DEAFAULT を追加しますので、intent に category が存在しない場合は問題ありませんが、存在する場合は一致する必要があります。
  • data: フィルタルールで data が定義されている場合、Intent でも一致する data を定義する必要があります。data は mimeType と URI の 2 つの部分で構成されており、URI が指定されていない場合、URI のデフォルト値は content と file(スキーマ)です。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。