83

この全体が実際にどのように機能するかの背後にあるアイデアが本当にわからないので、を拡張Aするクラスのコンテキストを必要とするクラスがある場合、そのコンテキストを取得するにはどうすればよいですか?BActivity

Aクラスコンストラクターにパラメーターとしてコンテキストを与えるよりも効率的な方法を探しています。たとえば、クラスAに数百万のインスタンスがある場合、何百万もの冗長なポインターを持つことにContextなりますが、どこかに1つだけとゲッター関数を持つことができるはずです...

4

7 に答える 7

59

わかりました、あなたが求めることを行う方法についての小さな例を挙げます

public class ClassB extends Activity
{

 ClassA A1 = new ClassA(this); // for activity context

 ClassA A2 = new ClassA(getApplicationContext());  // for application context. 

}
于 2012-09-07T15:24:09.057 に答える
45

Applicationクラス(android.applicationパッケージのパブリッククラス) を使用できます。つまり、次のとおりです。

グローバルなアプリケーションの状態を維持する必要がある人のための基本クラス。AndroidManifest.xml のタグでその名前を指定することにより、独自の実装を提供できます。これにより、アプリケーション/パッケージのプロセスが作成されるときに、そのクラスがインスタンス化されます。

このクラスを使用するには、次のようにします。

public class App extends Application {

    private static Context mContext;

    public static Context getContext() {
        return mContext;
    }

    public static void setContext(Context mContext) {
        this.mContext = mContext;
    }

    ...

}

あなたのマニフェストで:

<application
        android:icon="..."
        android:label="..."
        android:name="com.example.yourmainpackagename.App" >
                       class that extends Application ^^^

アクティビティ B:

public class B extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sampleactivitylayout);

        App.setContext(this);
                  ...
        }
...
}

クラス A:

Context c = App.getContext();

:

通常、Application をサブクラス化する必要はありません。ほとんどの場合、静的シングルトンは、よりモジュール化された方法で同じ機能を提供できます。シングルトンにグローバル コンテキストが必要な場合 (ブロードキャスト レシーバーを登録する場合など)、それを取得する関数に、シングルトンを最初に構築するときに Context.getApplicationContext() を内部的に使用する Context を指定できます。

于 2012-09-07T15:45:24.363 に答える
3

コンストラクターでコンテキストをクラス B に渡し、ActivityContext() の代わりに getApplicationContext() を渡すようにします。

于 2012-09-07T15:13:51.293 に答える
2

クラス A のパラメータ Context を使用してコンストラクタを作成すると、このコンテキストを使用できます。

コンテキスト c;

A(コンテキスト コンテキスト){ this.c=context }

B アクティビティから、このコンストラクターを使用して getApplicationContext() を渡し、クラス A のオブジェクトを作成します。

于 2012-09-07T15:25:18.407 に答える
1

B で A のコンテキストが必要な場合は、それを B に渡す必要があります。他の人が提案したように、Activity A をパラメーターとして渡すことでそれを行うことができます。A の多くのインスタンスが B への独自のポインターを持っているという問題はあまり見られません。それがそれほどのオーバーヘッドになるかどうかはわかりません。

しかし、それが問題である場合、@hasanghaforianが提案したように、クラスの一種のグローバルな変数としてAへのポインターを保持する可能性がありますApplication。実際、何のためにコンテキストが必要かによっては、Application代わりに のコンテキストを使用することもできます。

コンテキストに関するこの記事を読んで、必要なコンテキストをよりよく理解することをお勧めします。

于 2013-10-09T11:31:43.147 に答える