3

私のアプリを初めて実行するとき、ルートアクティビティで、ユーザーはデータベースからダウンロードするデータを決定する特定のオプションを選択する必要があります。

彼がそのオプションを選択すると、データがダウンロードされ、アプリケーションが実行されている限りそのデータを保持するシングルトンクラスに保持されます。(バックグラウンドでも)

私の問題は、ユーザーが(ホームボタンを使用して)しばらくアプリケーションを終了した後、Androidがアプリ内の一部のアクティビティを強制終了し、どういうわけかそれらを使用すると、重要なシングルトンクラスがリセットされることです。シングルトンに保持されているはずのデータにアクセスしようとすると、アプリがすべての種類のnull参照例外を受け取るようになります。

Android OSがアプリケーションを強制終了することを選択できる場合があることを理解していますが、ユーザーは最後にアクセスしたアクティビティからアプリケーションに戻ることができます。場合によっては、アプリケーション全体を強制終了し、ユーザーに最初からやり直すように強制することがあります。

解決策を探していたところ、ルートアクティビティに適用できる「android:alwaysRetainTaskState」属性について知りました。どうやらそれで、アンドロイドが私のアプリを殺すことを決定するときはいつでも、それはユーザーが彼に得るより高度な活動から始めることを許可するのではなく、少なくとも私がデータを再ダウンロードできる最初の活動から始めることをユーザーに強制するでしょうnull例外。

ただし、アプリケーションに適用したときは機能せず、アプリケーションに戻ったときは、空のシングルトンインスタンスを使用して高度なアクティビティから開始していました。

「android:clearTaskOnLaunch」も試してみましたが、うまくいきましたが、ユーザーがアプリに戻るたびに最初からやり直さなければならないので、やり過ぎです。Androidがアプリを強制終了することを決定した場合にのみ発生するようにします。

私が間違っていることはありますか?シングルトンを存続させるためのより良い解決策がある可能性はありますか?

ありがとう!

4

1 に答える 1

3

いいえ。より良い解決策はありません。これがその仕組みです。Androidは、(バックグラウンドにある限り)いつでもアプリケーションのプロセスを強制終了できます。データをシングルトンに保持することはできますが、Androidがとにかくプロセスを強制終了する可能性は常にあります。ユーザーがアプリケーションに戻ると、Androidは新しいプロセスを作成してから、ユーザーが再開しているアクティビティの新しいインスタンスを作成します。onCreate()シングルトンがなくなったことを認識して適切な処理を行う(アプリケーションのルートアクティビティにリダイレクトするか、シングルトンを再初期化する)すべてのアクティビティのコードを挿入する必要があります。

プロセスが強制終了されて再作成されたかどうかを判断するのは非常に簡単です。初期化時にstatic boolean設定したシングルトンに変数を追加するだけです。trueすべてのアクティビティの中onCreate()で、その変数の状態を確認し、変数がである場合はインテリジェントな処理を実行しますfalse

于 2013-05-18T19:01:18.387 に答える