2017-03-29 15 views
1

私が遭遇した問題の背景:私のアプリでは、IDやトークンなどのネットワークコールに定期的にアクセスするシングルトンオブジェクトがあります。アプリがバックグラウンドで強制終了されると、このシングルトンはその状態を失います。しかし、アプリが再度開かれ、ランチャーActivityを過ぎてActivityで起動すると、シングルトンはnullになります。アプリケーションがバックグラウンドで強制終了されたときのアプリケーションライフサイクル

私はこれをリファクタリングの過程でですが、シングルトンがあっても、常にアプリの再起動で存在するであろうことを保証する方法の上に苦渋しているが、私はあることから時にアプリの再起動アンドロイドが何をするかわからないんだけどバックグラウンド。

私は、彼らが彼らのシングルトンの管理方法を確認するために、我々はアプリで使うライブラリ(Facebookのインターホン)の一部にソースコードを経て、なぜその静的変数だけで常に存在するように見えた、と出くわしました理論。

だから、通常のアプリコールドスタート時に、アプリがこのように振る舞う:

Application.onCreate() -> Launcher.onCreate() -> Activity A -> Activity B 

は、ユーザーがActivity Bや背景のアプリでだったと言います。いくつかの他のアプリを使用した後、彼らは私のアプリに戻ってくるが、間にある時点で殺された。ライフサイクルは、このようになります。

Application.onCreate() -> Activity B 

私はこの問題は、私がランチャーActivityでシングルトンを初期化することで、Bは、シングルトンから値を取得しようとすると、結果として、それがヌルまで来ると思います。 Application.onCreate()でシングルトンを初期化すると、アプリが再びプルアップされるときに常に初期化されます。これは正しいです?

TL; DR再び殺されてフォアグランドに戻されたアプリケーションは、常にApplication.onCreate()を呼び出して、それがオンになっていたActivityに直接転送します。したがって、アプリの機能にとって重要なアプリの初期化は、ApplicationonCreate()に存在する必要があります。

答えて

2

再び殺されてフォアグラウンドに戻されたアプリケーションは、常にそのApplication.onCreate()を呼び出して、それがあったアクティビティに直接転送します。したがって、アプリケーションの機能にとって重要なアプリケーションの初期化は、アプリケーションonCreate()に存在する必要があります。

正しい。

私はLauncherActivityでシングルトンを初期化して、結果としてBがシングルトンから値を取得しようとすると、それがnullになることが問題だと思います。 Application.onCreate()でSingletonを初期化すると、アプリケーションが再びプルアップされるときに常に初期化されます。これは正しいです?

あなたの場合、問題は本当にそれです。しかし、によって "それはnullになる"あなたはシングルトンのインスタンスがnullであることを意味する場合、それはどのようにシングルトンが動作するはずではありません。シングルトンのメソッドをどこから呼び出すかにかかわらず、そのインスタンスはnullであってはなりません。

+1

申し訳ありませんが、私はシングルトンフィールドがnullであると言っていました。このリファクタの目的の1つは、シングルトンフィールドをキャッシュすることです(現在は、ランチャアクティビティでネットワークコールバックによって設定されています)ので、その状態は一度書き込まれますが、ディスクにアクセスして遅延ロードすることができます。 – lolsheeplol

2

はい、Application.onCreate()は、アプリケーションがフォアグラウンドになると常に呼び出されるため、初期化が必要なすべてのシングルトンが存在する必要があります。

関連する問題