Application
クラスを拡張する理由
私にとっては何ですか?
どうしてそうするか?
グローバル変数を宣言するために使用できることを読みましたが、他のすべてのアプリケーションがありますか?
率直に言って、アプリケーションを拡張することが別のアプローチよりも望ましいか、何かを達成するために必要な実際のシナリオを考えることはできません。頻繁に使用される高価なオブジェクトがある場合は、そのオブジェクトが現在存在しないことを検出したときにIntentServiceで初期化できます。アプリケーション自体はUIスレッドで実行され、IntentServiceは独自のスレッドで実行されます。
明示的なインテントを使用して、アクティビティからアクティビティにデータを渡すか、SharedPreferencesを使用します。インターフェイスを使用して、フラグメントからその親アクティビティにデータを渡す方法もあります。
apk
ファイルを考慮すると、Activity
s、Service
sなどの複数の便利なブロックで構成されます。Application
に関係なく、Activity
全体で変数とその状態にアクセスする必要があるシナリオが必要になる場合があります。Application
を介してアクセスする必要がある個人情報(名前など)を保持する変数にアクセスする必要がある場合があります。Cursor
を作成して何度も閉じると、パフォーマンスが低下します。Intent
sを使用してデータを渡すこともできますが、データが不格好であり、メモリの可用性に応じて特定のシナリオではアクティビティ自体が存在しない場合があります。Application
を介した変数へのアクセス、Application
sまたはActivity
sが実行される前にアプリケーションクラスが開始されるため、Services
を使用して分析などの特定のことを開始できます。アプリケーションクラスは、アプリケーションのライフサイクル全体を保持するオブジェクトです。これは、アプリケーションとしての最高層です。可能な使用例:
アクティビティからアクティビティにジャンプするグローバル変数を保存します。 Asynctaskと同様。
等
複数のアクティビティからアクセスする必要があるグローバル変数のようなデータを保存したい場合があります-時にはアプリケーション内のどこにでも。この場合、Applicationオブジェクトが役立ちます。
たとえば、各http要求の基本認証データを取得する場合、アプリケーションオブジェクトに認証データのメソッドを実装できます。
この後、次のようなアクティビティでユーザー名とパスワードを取得できます。
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
最後に、アプリケーションオブジェクトをシングルトンオブジェクトとして使用することを忘れないでください。
public class MyApplication extends Application {
private static MyApplication xxx;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
詳しい情報。これをクリックしてください LINK
Applicationクラスは、任意のアクティビティまたはContextオブジェクトを持っている他のどこからでもアクセスできるシングルトンです。
ライフサイクルも少し得られます。
アプリケーションのonCreateメソッドを使用して、分析ヘルパーなどの頻繁に使用される高価なオブジェクトをインスタンス化できます。その後、どこからでもこれらのオブジェクトにアクセスして使用できます。
アプリケーションクラスの最適な使用。例:起動完了時にアラームマネージャを再起動する必要があるとします。
public class BaseJuiceApplication extends Application implements BootListener {
public static BaseJuiceApplication instance = null;
public static Context getInstance() {
if (null == instance) {
instance = new BaseJuiceApplication();
}
return instance;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onBootCompleted(Context context, Intent intent) {
new PushService().scheduleService(getInstance());
//startToNotify(context);
}
答えではなく、観測:2つのインスタンスがある可能性があるため、拡張アプリケーションオブジェクトのデータをアクティビティのインスタンスに結び付けてはならないことに注意してください同時に実行されている同じアクティビティ(1つはフォアグラウンドで、もう1つは非表示)。
たとえば、通常はランチャーからアクティビティを開始し、「最小化」します。次に、アプリがAndroid.intent.action.CREATE_SHORTCUTをサポートしているため、たとえばショートカットを作成するために、アクティビティの別のインスタンスを起動する別のアプリ(Tasker)を起動します。ショートカットが作成され、アクティビティのこのショートカット作成呼び出しがアプリケーションオブジェクトのデータを変更した場合、バックグラウンドで実行されているアクティビティは、フォアグラウンドに戻されると、この変更されたアプリケーションオブジェクトの使用を開始します。
この質問には答えがありません。ビル・ピューを使用しているためApplication
を拡張しています Singleton 実装( 参照を参照 )およびシングルトンのいくつかはコンテキストを必要とします。 Application
クラスは次のようになります。
public class MyApplication extends Application {
private static final String TAG = MyApplication.class.getSimpleName();
private static MyApplication sInstance;
@Contract(pure = true)
@Nullable
public static Context getAppContext() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() called");
sInstance = this;
}
}
そして、シングルトンは次のようになります。
public class DataManager {
private static final String TAG = DataManager.class.getSimpleName();
@Contract(pure = true)
public static DataManager getInstance() {
return InstanceHolder.INSTANCE;
}
private DataManager() {
doStuffRequiringContext(MyApplication.getAppContext());
}
private static final class InstanceHolder {
@SuppressLint("StaticFieldLeak")
private static final DataManager INSTANCE = new DataManager();
}
}
この方法で、シングルトンを使用するたびにコンテキストを取得する必要がなくなり、最小限のコードで遅延同期初期化を取得できます。
ヒント:Android Studioシングルトンテンプレートを更新すると、時間を大幅に節約できます。
ソース: https://github.com/codepath/Android_guides/wiki/Understanding-the-Android-Application-Class
多くのアプリでは、アプリケーションクラスを直接操作する必要はありません。ただし、カスタムアプリケーションクラスにはいくつかの許容される用途があります。
- 最初のアクティビティを作成する前に実行する必要がある特別なタスク
- すべてのコンポーネントで共有する必要があるグローバル初期化(クラッシュレポート、永続性)
- 共有ネットワーククライアントオブジェクトなどの静的な不変データに簡単にアクセスするための静的メソッド
変更可能なインスタンスデータをApplicationオブジェクト内に保存しないでください。データがそこにとどまると仮定した場合、アプリケーションはNullPointerExceptionである時点で必然的にクラッシュするためです。アプリケーションオブジェクトは永久にメモリ内にとどまるとは限りません。強制終了されます。一般的な考えに反して、アプリは最初から再起動されません。 Androidは新しいアプリケーションオブジェクトを作成し、ユーザーが以前にいた場所でアクティビティを開始して、そもそもアプリケーションが強制終了されなかったという錯覚を与えます。
拡張アプリケーションを使用すると、アプリケーションの実行期間全体を通して、必要なあらゆる種類の操作に対してアプリケーションが確実になります。これはあらゆる種類の変数であり、サーバーからデータを取得する場合は、非同期タスクをアプリケーションに配置して、毎回継続的に取得するようにすると、更新されたデータが自動的に取得されます。このリンクを使用します。より多くの知識のために....
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-Android
アプリケーションによって拡張されている場合、オブジェクトを作成せずに、任意のクラスの変数にアクセスできます。これらはグローバルに呼び出すことができ、その状態はアプリケーションが終了しない限り維持されます。
Applicationクラスはさまざまな用途に使用できると思いますが、アクティビティやサービスを開始する前に何かを行う必要性にすべて関係しています。たとえば、私のアプリケーションでは、カスタムフォントを使用しています。呼び出す代わりに
Typeface.createFromAsset()
assetsフォルダからフォントの参照を取得するすべてのアクティビティから(そのメソッドを呼び出すたびにアセットへの参照を保持しているため、メモリリークが発生するため、これは悪いです)、私はアプリケーションのonCreate()
メソッドからこれを行いますクラス:
private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
super.onCreate();
appInstance = this;
quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
"fonts/Quicksand-Regular.otf");
...
}
また、次のように定義されたメソッドもあります。
public static App getAppInstance() {
return appInstance;
}
この:
public Typeface getQuickSandRegular() {
return quicksandRegular;
}
したがって、アプリケーションのどこからでも、私がしなければならないことは次のとおりです。
App.getAppInstance().getQuickSandRegular()
Applicationクラスのもう1つの用途は、接続が必要なアクティビティやサービスが実際に開始され、必要なアクションを実行する前に、デバイスがインターネットに接続されているかどうかを確認することです。
アクティビティを使用していない(アプリケーションはアクティビティではない)アプリケーションへのバインドが必要な長期実行スレッドまたはその他のオブジェクトについて、アプリケーションスコープに変数を保存することを示す他の回答に追加します。バインドされたサービスを要求できないなど。アプリケーションインスタンスへのバインドが推奨されます。このアプローチの唯一の明らかな警告は、アプリケーションが動作している限りオブジェクトが存続することです。したがって、メモリのより暗黙的な制御が必要です。そうしないと、リークなどのメモリ関連の問題が発生します。
他に役立つと思うのは、操作の順に、アプリケーションがアクティビティの前に最初に起動することです。この時間枠では、必要に応じて、最初のアクティビティの前に必要なハウスキーピングを準備できます。
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created