19

Contextアプリケーションのライフサイクル中にアプリケーションが変更されないというステートメントを信頼できますか?contextシングルトンパターンを使用してどこかに保存し、必要な場所で使用するとどうなりますか?

4

7 に答える 7

19

最初に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

于 2012-08-22T20:04:13.930 に答える
6

AndroidApplicationクラスは、アプリケーションのライフサイクルフェーズを通じて追跡する必要のある情報を格納するためのシングルトンです。このクラスの説明は、マニュアルで確認できます-http://developer.android.com/reference/android/app/Application.html

于 2012-07-29T16:39:33.533 に答える
2

アプリケーションはシングルトンであり、コアを変更せずにそれをバイパスする方法がわかりません。

ただし、コードが別のプロセスを開始すると、Applicationオブジェクトの2つのインスタンスが発生する可能性があります。1つの例は、リモートサービスの開始です。これにより、アプリケーションオブジェクトの独自のインスタンスを作成する別のプロセスが作成されます。

http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample

混乱を避けるために、ParcelableまたはSerializable androidオプションのいずれかを使用して、リモートサービスとアプリの残りの部分との間で通信する必要があります。

メッセージ-ハンドラーインテントバンドルインテントputExtra

または独自のいずれかを作成します

于 2012-10-05T08:57:40.447 に答える
1

このトピックに関していくつかの論争があります。グーグルの人々の間でさえ。私は、基本的に可能な限り多くのアクティビティコンテキストを取得しようとする正しいアプローチであると信じています。理由は、コンテキストのポイントは、動作している環境でアプリのいくつかのリソース/部分を提供することです。システムに提供する情報が正確であればあるほど、予期しない動作が発生する可能性は低くなります(つまり、アクティビティコンテキストスコープ内の一部のリソースにアクセスでき、アプリコンテキストからのアクセスが可能になります。

アクティビティはコンテキストであることに注意してください。アクティビティ内にいる場合は「this」を渡すと、コードがフラグメント内から機能する場合は「getActivity()」を渡すとジョブが実行されます。

さらに、devmiles.comに同意する必要があります。アプリのライフサイクルを簡単に管理し、適切な中間点として使用できるため、独自のApplicationクラスをシングルトンとして使用すると非常に便利です。繰り返しになりますが、appContextを取得するには、getApplicationContextまたはApplicationシングルトンクラスのインスタンスを呼び出すだけで十分です。

于 2012-08-24T20:58:19.937 に答える
1

はい、アプリケーションのライフサイクル中にコンテキストが変更されないことを信頼できます。

Googleは、アプリケーションクラスの概要でそう言っています。

あなたの場合にぴったりだと思います。

于 2012-08-28T06:54:51.990 に答える
0

アプリケーションクラスには、Androidアプリケーション用の単一アプリケーションレベルのクラスがあります。私の答えは、アプリケーションコンテキストオブジェクトを変更できないということです。

于 2012-07-29T16:53:13.173 に答える
0

ここでの一番の答えは技術的には正しいですが、以下のページから引用されているグーグルの現在の推奨事項に反しています。

https://developer.android.com/reference/android/app/Application.html

「注:通常、Applicationをサブクラス化する必要はありません。ほとんどの場合、静的シングルトンはよりモジュール化された方法で同じ機能を提供できます。シングルトンにグローバルコンテキストが必要な場合(たとえば、ブロードキャストレシーバーの登録)、Context.getApplicationContext( )シングルトンのgetInstance()メソッドを呼び出すときのContext引数として。 "

簡単に言うと、保存するクラスのライフタイムと一致しないコンテキストを保存するのは危険です。アプリケーションコンテキストは、同じプロセスライフタイムを共有するため、シングルトンのコンテキストと一致する必要があります。

于 2019-08-01T16:45:18.460 に答える