Application クラスの目的は何ですか。それをカスタム サブクラスに拡張する利点は何ですか? なぜそれを使用するのですか? グローバル変数を他のクラスに格納して Application と同じ目標を達成できますか?
4 に答える
いい質問ですね!
アプリケーションは、アクティビティとサービスの実行中に常に実行されるコンテキストです。
また、最初に作成され、最後に破棄されるコンテキストでもあります。したがって、アプリのライフサイクルを取り囲んでいます。
データまたはコンポーネントを共有する方法としてアプリケーション クラスを使用できます (依存性注入など)。たとえば、アクティビティ間でシングルトンを共有する場合は、アプリケーション クラスでインスタンスを作成してゲッターを提供すると、他のすべてのコンテキストでシングルトンを取得できます。
((cast to your class)getApplicationContext()).getFoo();
最初のアクティビティが起動される前に何かを実行する必要があるユースケースがいくつかあるかもしれません。その後、アプリケーション クラスの onCreate メソッドで実行します。
一方、クラスのonDestroy
メソッドはApplication
常に呼び出されるとは限らないため、絶対に依存しないでください。Android ではそのための契約はありません。
ただし、これはまれであり、通常はアプリケーション クラスをオーバーライドする必要はありません。依存性注入は、RoboGuice や Dagger などの他の方法で実現できます。
このクラスが非常に便利な理由は 2 つあります。
- Application クラスは、他のアクティビティの前にインスタンス化されます。
- アプリケーションコンテキストを保持します
コンテキストは、多くのリソースをもたらします。デバイスのプロパティを把握したり、リソースをロードしたり、SQLite データベースを開始したりできます。
これはすべて、アクティビティが読み込まれる前に発生し、アクティビティでグローバルに利用できます。
私が意味することの簡単な例:
public class App extends Application{
private static Resources sResources;
//--I want to load strings resources from anywhere--
public static String loadStringResource(int resID) {
return sResources.getString(resID);
}
@Override
public void onCreate() {
super.onCreate();
sResources = getResources();
//---I want to load all preferences when my app starts---
PreferenceManager.setDefaultValues(this,R.xml.prefs,false);
}
}
クラスを拡張するApplication
と、アプリケーションのライフサイクルに統合できます。
これは、グローバルなアプリケーション レベルの情報を保存するのにも役立ちます (ただし、通常は、アクティビティを「独立」したままにしておくことをお勧めします)。
Application クラスは Application Context を認識しており、アプリが読み込まれると読み込まれるため、アクティビティが開始される前に、アプリケーションのライフサイクルの適切なコールバックを保持します。ほとんどの場合、このクラスを拡張したくないでしょう。
API ドキュメントから:
通常、Application をサブクラス化する必要はありません。ほとんどの場合、静的シングルトンは、よりモジュール化された方法で同じ機能を提供できます。シングルトンにグローバル コンテキストが必要な場合 (ブロードキャスト レシーバーを登録する場合など)、それを取得する関数に、シングルトンを最初に構築するときに Context.getApplicationContext() を内部的に使用する Context を指定できます。
http://developer.android.com/reference/android/app/Application.html