1. ホーム
  2. android

[解決済み] アクティビティコンテキストを取得する方法を教えてください。

2023-06-04 21:30:30

質問

私はこの全体の仕組みの背後にあるアイデアを本当に理解していないので、もし私がいくつかのクラスの A があり、そのクラスがコンテクストを必要とする場合 B を拡張する Activity そのコンテキストを取得する方法は?

クラスへのパラメータとしてコンテキストを与えるよりも、もっと効率的な方法を探しています。 A のコンストラクタにパラメータとして与えるよりも効率的な方法を探しています。例えば、もしクラス A が何百万ものインスタンスを持っているとしたら、結局は何百万もの冗長なポインタを持つことになります。 Context への冗長なポインタを持つことになります。

どのように解決するのですか?

この場合 Application クラス(android.applicationパッケージのpublicクラス)であること。

グローバルなアプリケーションの状態を維持する必要がある人のための基本クラスです。 のタグでその名前を指定することによって、独自の実装を提供することができます。 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() を使用します。 を使用します。