私はこの全体が実際にどのように機能するかについてのアイデアを本当に得ていないので、A
を拡張するクラスB
のコンテキストを必要とするいくつかのクラスActivity
がある場合、どうすればよいですかそのコンテキストを取得しますか?
クラスA
コンストラクターのパラメーターとしてコンテキストを指定するよりも効率的な方法を探しています。たとえば、クラスA
に数百万のインスタンスがある場合、どこかで1つだけとゲッター関数を持つことができるはずですが、Context
への数百万の冗長ポインターを持つことになります...
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()を使用するコンテキストを指定できます。
OK
public class ClassB extends Activity
{
ClassA A1 = new ClassA(this); // for activity context
ClassA A2 = new ClassA(getApplicationContext()); // for application context.
}
アクティビティコンテキストを取得する最良かつ簡単な方法は、アクティビティの名前の後に.this
を置くことです。例:アクティビティの名前がSecondActivity
の場合、そのコンテキストはSecondActivity.this
になります
コンストラクターでクラスBにコンテキストを渡し、activityContext()の代わりにgetApplicationContext()を渡すようにしてください
クラスAのパラメーターContextを使用してコンストラクターを作成し、このコンテキストを使用できます。
コンテキストc;
A(コンテキストコンテキスト){this.c = context}
Bアクティビティから、このコンストラクターを使用してgetApplicationContext()を渡すクラスAのオブジェクトを作成します。
コトリンでは:
activity?.applicationContext?.let {
it//<- you context
}
BのAのコンテキストが必要な場合は、Bに渡す必要があります。他の人が提案したように、アクティビティAをパラメーターとして渡すことでそれを行うことができます。 Aの多くのインスタンスがBへの独自のポインターを持っているという問題はあまり見られませんが、それがそれほどオーバーヘッドになるかどうかはわかりません。
しかし、それが問題である場合、可能性は、@ hasanghaforianが示唆したように、AへのポインターをApplication
クラスの一種のグローバル変数として保持することです。実際、コンテキストの必要性に応じて、代わりにApplication
のコンテキストを使用することもできます。
この記事 コンテキストについて読むことをお勧めします。必要なコンテキストを把握するためです。