1. ホーム
  2. android

[解決済み] Android 静的オブジェクトのライフサイクル

2022-12-12 08:24:11

質問

イベント検索アプリケーションを作成しているのですが、ある画面で検索条件を設定すると、別の画面に反映され、3番目の画面でユーザーが検索条件を編集できるようになり、4番目の画面に移動するようになっています。

上記のタスクを達成するために、私はアプリケーションの周りの値を覚えている静的オブジェクトを使用しており、私は余分なことを行う必要はありません。

しかし、私は、Androidの静的オブジェクトのライフサイクルについて、メモリ不足が見つかった場合、Androidは静的オブジェクトを削除するかどうかを恐れている?

アンドロイドはマルチタスクをサポートしているので、ユーザーが別のアプリケーションに切り替えて、ユーザーが戻ってきたときにアプリケーションが狂ったように動作し始めた場合、マルチタスクのときに静的オブジェクトは削除されるのでしょうか。

どのように解決するのですか?

まず、背景を少し説明します。アプリケーションを起動するとどうなるのでしょうか。

OSはプロセスを開始し、一意のプロセスIDを割り当て、プロセステーブルを割り当てます。プロセスはDVM(Dalvik VM)のインスタンスを開始し、各アプリケーションはDVM内で実行されます。

DVMは、クラスのロード、アンロード、インスタンスのライフサイクル、GCなどを管理する。

スタティック変数のライフタイム。静的変数は、クラスがJVMによってロードされたときに存在するようになり、クラスがアンロードされたときに終了します。

そのため、アンドロイドアプリケーションを作成し、スタティック変数を初期化した場合、以下のいずれかが起こるまでJVMに残ります。

1. クラスがアンロードされる

2. JVMがシャットダウンされる

3. プロセスが終了する

なお、static変数の値は、他のアプリケーションの別のアクティビティに切り替えても、上記3つのいずれにも該当しない場合、保持されます。万が一、上記3つのいずれかが発生した場合、staticの値は失われます。

数行のコードでこれをテストすることができます。

  1. アクティビティーのonCreateで、初期化されていないスタティックを表示します。
  2. staticを初期化し、それを表示する -> 値はnull以外となります。
  3. バックボタンを押して、ホーム画面に移動します。注:ホーム画面は別のアクティビティです。
  4. アクティビティを再度起動する -> 静的変数が非NULLになる
  5. DDMSからアプリケーションのプロセスを終了させる。
  6. アクティビティを再スタートします。

お役に立てれば幸いです。