Android私が作業しているアプリは、静的な変数に軽量状態(ユーザー名、gpsの場所など)を保存するためにApplicationクラスをオーバーライドします。この状態のほとんどは、起動アクティビティ(ユーザー名設定から取得され、位置リスナーが実行されます。アプリケーションクラスを初期化するために起動アクティビティに依存しても安全ですか?起動アクティビティも作成されずにアプリケーションクラスが再作成される場合はありますか?
電話が数時間スリープ状態になった後(アプリがフォアグラウンドに置かれたまま電話がスリープ状態になる前)にアプリを再開すると、アプリケーションクラスの変数にアクセスするnullポインター例外に遭遇したため、問題が発生しました。電話がスリープしていて、電話をウェイクしているときにプロセスが強制終了され、アプリケーションクラスが再作成され、スタックの最上位のアクティビティが再開されましたが、起動アクティビティ.onCreateが実行されなかったため、アプリケーションクラス初期化されていませんか?
アプリに[設定]/[アプリケーションの管理]の使用を強制的に停止させることで、このようなシナリオをテストしようとしたことに注意してください。ただし、問題を再現することはできません。次回の実行時に、Applicationクラスが作成され、その後、launch activity.onCreateが作成されます。
アプリケーションクラスのインスタンスはプロセスが存在する限り存在し、アプリケーションクラスが作成されたときにアプリケーションを「再起動」すること、つまり新しいアクティビティスタックから開始すること(そして最初にスタック上のアクティビティは起動アクティビティです)?
いいえ。タスクスタックをそのままにして、アプリケーション全体を強制終了して再作成できます。これにより、システムはそれを必要とするデバイスのメモリを解放しながら、エンドユーザーにマルチタスクのシームレスな錯覚を提示できます。ドキュメントから:
バックグラウンドアクティビティ(ユーザーには表示されず、一時停止されたアクティビティ)は重要ではなくなったため、システムはそのプロセスを安全に終了して、他のフォアグラウンドプロセスまたは表示プロセスのメモリを解放できます。プロセスを強制終了する必要がある場合、ユーザーがアクティビティに戻って(画面に再び表示される)と、onCreate(Bundle)メソッドが呼び出されます。ユーザーが最後に離れたときと同じ状態で自分自身を再起動できます。
つまり、(アプリケーションが関連付けられている)プロセスを強制終了して再起動することができます。個々のアクティビティには、強制終了前に保存した内容から自分自身を再作成するための十分な情報が必要です。他のアクティビティによるプロセス。
SharedPreferenceまたはSQLiteデータベースにアクティビティによる初期化が必要な永続的な共有状態を保存するか、それをインテントエクストラとして必要なアクティビティに渡すことを検討してください。
シナリオは、実行中のアプリケーションの_killing the process
_でテストできます。
手順1.アプリを開き、Home
ボタンを押してバックグラウンドで非表示にします。
ステップ2. _adb Shell
_を呼び出す
ステップ3.コマンドsu
を入力します(プロセスを強制終了するには、ROOT権限を取得する必要があります)
ステップ4. ps
(実行中のすべてのプロセスIDをリストし、自分のものを見つける)
ステップ5. _kill 1234
_(アプリケーションがプロセス1234で実行されていると想定)
ステップ6.次に、デバイスに戻り、もう一度起動アイコンをクリックします。アクティビティスタックの最後のアクティビティが再開される場合があります。アクティビティに対してonRestoreInstanceState()
メソッドが呼び出されることもあります。
つまり、いくつかのLaunchActivityではなく、YourApplication.onCreate
で初期化を行います。
チェックするドキュメント:
- プロセスとスレッド
- APIガイド>アクティビティ
アプリケーションクラスを初期化するために起動アクティビティに依存しても安全ですか?
はい、アプリケーションがそのアクティビティより長く存在できることを覚えている限り、アクティビティは強制終了され、再作成される可能性があります。私はどのインテントが復活したアクティビティを取得するのかわかりません:LAUNCHまたはVIEW(アプリにバインドされている実行中のサービスが長い間、アクティビティが非常に重いために強制終了されたシナリオの場合)
Launchアクティビティも作成されずにApplicationクラスが再作成されるケースはありますか?
はい、最後に表示されたアクティビティがLaunchActivityではなかった場合
check Androidアプリケーションのライフサイクルとstaticの使用
電話がスリープしていて、電話をウェイクしているときにプロセスが強制終了され、アプリケーションクラスが再作成され、スタックの最上位のアクティビティが再開されましたが、起動アクティビティ.onCreateが実行されなかったため、アプリケーションクラス初期化されていませんか?
A、B、Cを起動するいくつかの異なるアクティビティがあり、それらのプロセス全体が強制終了された場合、Android OSはアプリケーションとCのアクティビティを作成するだけで十分ですが、AとBは再アクセス時、つまり彼らに戻る際に作成されます。
プロセスの間、アプリケーションクラスのインスタンスが存在すると想定しても安全ですか、
はい
そして、Applicationクラスが作成されると、それはアプリケーションを「再起動」することと同等です。新しいアクティビティスタックから始めますか(スタックの最初のアクティビティは起動アクティビティです)?
起動アクティビティを再開するときに最初に呼び出されるかどうかはわかりませんが、
しかし最後、つまりユーザーが見るべきもの。
「アプリの再開時に、アプリケーションクラスの変数にアクセスするnullポインター例外が発生しました」
このリンクを確認してください。 http://www.developerphil.com/dont-store-data-in-the-application-object/