2012-07-15 11 views
13

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

+0

これはおそらく参考になる可能性があります:http://stackoverflow.com/questions/708012/android-how-to-declare-グローバル変数/ 4642069#4642069 –

+1

なぜコンテキストを保存する必要がありますか? – Yury

+0

@Yury:非アクティビティまたはアプリケーションクラスではなく、getApplicationContext()を呼び出すといつでも取得できます。 –

答えて

14

最初の2番目の質問に答えるために:あなたはシングルトンで、いくつかの状態を保存する必要がある場合、あなたは、Android Applicationクラスを使用することができますし、あなたのApplicationが(それもContextである)あなたのシングルトンとなります。それを保管する必要はありません。

Contextは、実行時に変更することができるかどうかについての最初の質問に:your other questionに関係の並べ替え、私たちはContextWrapper.attachBaseContextを見て、それを把握することができると思う:

だから、
protected void attachBaseContext(Context base) { 
    if (mBase != null) { 
     throw new IllegalStateException("Base context already set"); 
    } 
    mBase = base; 
} 

、はい、あなたはそれに頼ることができます。それは変更することはできませんし、試してみるとIllegalStateExceptionが投げられます。

+0

何らかの理由でアプリケーションが強制終了されるとどうなりますか? – Eugene

+0

もしあなたが殺されてしまったので、アプリケーションが殺されたら、何もすることはできません。停止して再起動するアプリケーション全体でデータを保持する必要がありますか?そのために共有設定を使用したいと思うでしょう。 –

6

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

0

アプリケーションクラスでは、アンドロイドアプリケーションのシングルレングスアプリケーションレベルのクラスです。私の答えは、アプリケーションコンテキストオブジェクトを変更することはできません。

1

このトピックに関するいくつかの論争があります。 Googleの人々の間でさえも。 私は基本的に活動の文脈をできるだけ多く得ることを試みる正しいアプローチであると信じています。理由は、コンテキストのポイントは、環境が動作しているあなたのアプリケーションのいくつかのリソース/部分を提供しているということです。あなたがシステムに与える情報がより正確であれば、予期しない動作は起こりにくくなります(つまり、アクティビティコンテキストスコープ内のいくつかのリソースにアクセスでき、アプリコンテキストからラウンドする方法)。

アクティビティはコンテキストであるため、アクティビティ内にいる場合は "this"を渡し、フラグメント内からコードが動作する場合は "getActivity()"を指定します。

さらに、私はdevmiles .com。アプリケーションのライフサイクルを簡単に管理して適切な中間点として使用できるので、独自のApplicationクラスをシングルトンとして使用することは非常に便利です。もう一度、appContextを取得するにはgetApplicationContextを呼び出すだけで十分ですアプリケーションシングルトンクラスのインスタンス。

1

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

GoogleはApplicationクラスの概要でそう言います。

私はあなたのケースには最適だと思います。

1

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

ただし、コードによって別のプロセスが開始された場合は、2つのApplicationオブジェクトのインスタンスが発生する可能性があります。 1つの例は、リモートサービスを開始することです。これはアプリケーションオブジェクトの独自のインスタンスを作成する別のプロセスを作成します。あなたはParcelableまたはSerializableのアンドロイドのいずれかのオプションを使用してリモートサービスやアプリの残りの部分との間で通信する必要があり、混乱を避けるため

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

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

を作成するか、自分で作成してください

関連する問題