web-dev-qa-db-ja.com

アクティビティコンテキストを取得する方法は?

私はこの全体が実際にどのように機能するかについてのアイデアを本当に得ていないので、Aを拡張するクラスBのコンテキストを必要とするいくつかのクラスActivityがある場合、どうすればよいですかそのコンテキストを取得しますか?

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

61
Ofek Ron

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();

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

35
hasanghaforian

OK

public class ClassB extends Activity
{

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

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

}
46
Gan

アクティビティコンテキストを取得する最良かつ簡単な方法は、アクティビティの名前の後に.thisを置くことです。例:アクティビティの名前がSecondActivityの場合、そのコンテキストはSecondActivity.thisになります

28

コンストラクターでクラスBにコンテキストを渡し、activityContext()の代わりにgetApplicationContext()を渡すようにしてください

2
Shark

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

コンテキストc;

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

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

1
Helal Khan

コトリンでは:

activity?.applicationContext?.let {
         it//<- you context
        }
1
Serg Burlaka

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

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

この記事 コンテキストについて読むことをお勧めします。必要なコンテキストを把握するためです。

1
Thomas