Context
アプリケーションのライフサイクル中にアプリケーションが変更されないというステートメントを信頼できますか?context
シングルトンパターンを使用してどこかに保存し、必要な場所で使用するとどうなりますか?
7 に答える
最初に2番目の質問に答えるには:状態をシングルトンに保存する必要がある場合は、AndroidApplication
クラスを使用してApplication
、シングルトンになります(これもContext
)。保存する必要はありません。
最初の質問に対して、Context
実行時に変更できるかどうかについては、他の質問に関連しているようですが、次の質問を見るとわかりますContextWrapper.attachBaseContext
。
protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
だから、はい、あなたはそれに頼ることができます。変更することはできません。試してみると、がスローされますIllegalStateException
。
AndroidApplication
クラスは、アプリケーションのライフサイクルフェーズを通じて追跡する必要のある情報を格納するためのシングルトンです。このクラスの説明は、マニュアルで確認できます-http://developer.android.com/reference/android/app/Application.html
アプリケーションはシングルトンであり、コアを変更せずにそれをバイパスする方法がわかりません。
ただし、コードが別のプロセスを開始すると、Applicationオブジェクトの2つのインスタンスが発生する可能性があります。1つの例は、リモートサービスの開始です。これにより、アプリケーションオブジェクトの独自のインスタンスを作成する別のプロセスが作成されます。
http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample
混乱を避けるために、ParcelableまたはSerializable androidオプションのいずれかを使用して、リモートサービスとアプリの残りの部分との間で通信する必要があります。
メッセージ-ハンドラーインテントバンドルインテントputExtra
または独自のいずれかを作成します
このトピックに関していくつかの論争があります。グーグルの人々の間でさえ。私は、基本的に可能な限り多くのアクティビティコンテキストを取得しようとする正しいアプローチであると信じています。理由は、コンテキストのポイントは、動作している環境でアプリのいくつかのリソース/部分を提供することです。システムに提供する情報が正確であればあるほど、予期しない動作が発生する可能性は低くなります(つまり、アクティビティコンテキストスコープ内の一部のリソースにアクセスでき、アプリコンテキストからのアクセスが可能になります。
アクティビティはコンテキストであることに注意してください。アクティビティ内にいる場合は「this」を渡すと、コードがフラグメント内から機能する場合は「getActivity()」を渡すとジョブが実行されます。
さらに、devmiles.comに同意する必要があります。アプリのライフサイクルを簡単に管理し、適切な中間点として使用できるため、独自のApplicationクラスをシングルトンとして使用すると非常に便利です。繰り返しになりますが、appContextを取得するには、getApplicationContextまたはApplicationシングルトンクラスのインスタンスを呼び出すだけで十分です。
アプリケーションクラスには、Androidアプリケーション用の単一アプリケーションレベルのクラスがあります。私の答えは、アプリケーションコンテキストオブジェクトを変更できないということです。
ここでの一番の答えは技術的には正しいですが、以下のページから引用されているグーグルの現在の推奨事項に反しています。
https://developer.android.com/reference/android/app/Application.html
「注:通常、Applicationをサブクラス化する必要はありません。ほとんどの場合、静的シングルトンはよりモジュール化された方法で同じ機能を提供できます。シングルトンにグローバルコンテキストが必要な場合(たとえば、ブロードキャストレシーバーの登録)、Context.getApplicationContext( )シングルトンのgetInstance()メソッドを呼び出すときのContext引数として。 "
簡単に言うと、保存するクラスのライフタイムと一致しないコンテキストを保存するのは危険です。アプリケーションコンテキストは、同じプロセスライフタイムを共有するため、シングルトンのコンテキストと一致する必要があります。