回答:
オフハンドでは、アプリケーションの拡張が別のアプローチよりも望ましい、または何かを達成するために必要であるという実際のシナリオは考えられません。高価で頻繁に使用されるオブジェクトがある場合は、オブジェクトが現在存在しないことを検出したときに、IntentServiceで初期化できます。アプリケーション自体はUIスレッドで実行されますが、IntentServiceは独自のスレッドで実行されます。
明示的なインテントを使用してアクティビティからアクティビティにデータを渡すか、SharedPreferencesを使用することを好みます。インターフェースを使用して、フラグメントから親アクティビティにデータを渡す方法もあります。
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
。我々は常に我々はできる限りグローバル状態を解消し、静的/シングルトンとなどをvarsの代わりにグローバルな状態管理のための標準的なAndroidのツールを使用する必要があります
apk
モバイルでファイルを検討する場合、ファイルは、Activity
s、Service
sいます。Application
関係なく、変数全体とその状態全体にアクセスする必要があるシナリオが必要になる場合があります。Activity
ユーザーが使用しいるかApplication
、。Cursor
し、何度も何度もそれを閉じると、パフォーマンスによくありません、Intent
データを渡すためにsを使用することもできますが、それは不格好であり、メモリの可用性によっては、特定のシナリオでアクティビティ自体が存在しない場合があります。Application
、Application
アプリケーションクラスはActivity
sまたは
Services
sが実行される前に開始されるため、を使用して分析などの特定のことを開始できます。アプリケーションクラスは、アプリケーションの完全なライフサイクルを持つオブジェクトです。これは、アプリケーションとしての最上位層です。可能な使用例:
ApplicationクラスのonCreateをオーバーライドすることにより、アプリケーションの起動時に必要なものを追加できます。
アクティビティからアクティビティにジャンプするグローバル変数を保存します。Asynctaskのように。
等
複数のアクティビティからアクセスする必要があるグローバル変数などのデータを保存したい場合があります。アプリケーション内のどこにでもある場合があります。この場合、Applicationオブジェクトが役立ちます。
たとえば、各httpの基本認証データを取得する場合リクエストは、アプリケーションオブジェクトに認証データのメソッドを実装できます。
この後、次のようなアクティビティでユーザー名とパスワードを取得できます。
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
最後に、Applicationオブジェクトをシングルトンオブジェクトとして使用することを忘れないでください。
public class MyApplication extends Application {
private static MyApplication singleton;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
詳細については、アプリケーションクラスをクリックしてください。
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つは前景と見えないもの)。
たとえば、ランチャーを介して通常どおりアクティビティを開始し、それを「最小化」します。アプリはandroid.intent.action.CREATE_SHORTCUTをサポートしているため、たとえばショートカットを作成するために、アクティビティの別のインスタンスを開始する別のアプリ(つまりTasker)を起動します。次にショートカットが作成され、このショートカットを作成するアクティビティの呼び出しによってアプリケーションオブジェクトのデータが変更された場合、バックグラウンドで実行されているアクティビティは、変更されたアプリケーションオブジェクトをフォアグラウンドに戻すと使用を開始します。
この質問には答えがないようです。私Application
はBill Pughのシングルトン実装(リファレンスを参照)を使用していて、一部のシングルトンにはコンテキストが必要なので、拡張します。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シングルトンテンプレートを更新すると、時間を大幅に節約できます。
Applicationクラスはさまざまな用途に使用できると思いますが、アクティビティやサービスを開始する前に、これらはすべて何かを行う必要性に関連付けられています。たとえば、私のアプリケーションではカスタムフォントを使用しています。呼び出す代わりに
Typeface.createFromAsset()
Assetsフォルダーからフォントの参照を取得するためにすべてのアクティビティから(そのメソッドを呼び出すたびに資産への参照を保持しているとメモリリークが発生するため、これは悪いことです)、これをonCreate()
Applicationクラスのメソッドから実行します:
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つの用途は、デバイスがインターネットに接続されているかどうかを確認してから、実際に接続を必要とするアクティビティとサービスが開始され、必要なアクションが実行されることです。
ソース:https : //github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
多くのアプリでは、アプリケーションクラスを直接操作する必要はありません。ただし、カスタムアプリケーションクラスのいくつかの許容される使用法があります。
- 最初のアクティビティを作成する前に実行する必要がある特殊なタスク
- すべてのコンポーネントで共有する必要があるグローバル初期化(クラッシュレポート、永続性)
- 共有ネットワーククライアントオブジェクトなどの静的な不変データに簡単にアクセスするための静的メソッド
変更可能なインスタンスデータをApplicationオブジェクト内に格納しないでください。データがそこにとどまると想定した場合、アプリケーションはある時点で必然的にNullPointerExceptionでクラッシュします。アプリケーションオブジェクトは、メモリに永久に留まることが保証されているわけではなく、強制終了されます。一般的な考えに反して、アプリを最初から再起動することはありません。Androidは新しいApplicationオブジェクトを作成し、ユーザーが以前にいた場所でアクティビティを開始して、最初はアプリケーションが強制終了されなかったように見せかけます。
拡張アプリケーションを使用すると、アプリケーションの実行期間全体を通して、必要なあらゆる種類の操作を確実に実行できます。これは任意の種類の変数になる可能性があり、サーバーからデータをフェッチする場合は、asynctaskをアプリケーションに配置して、毎回継続的にフェッチされるようにして、更新されたデータを自動的に取得できるようにします。このリンクを使用してください。詳細については...
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
アクティビティを使用していない(アプリケーションはアクティビティではない)アプリケーションにバインドする必要がある長期実行スレッドまたはその他のオブジェクトについて、アプリケーションスコープに変数を格納する可能性があることを示す他の回答に追加します。バインドされたサービスを要求できないなど。アプリケーションインスタンスへのバインドが推奨されます。このアプローチの唯一の明らかな警告は、アプリケーションが生きている限りオブジェクトが生き続けるということです。そのため、メモリをより暗黙的に制御する必要があります。そうしないと、リークなどのメモリ関連の問題が発生します。
他に役立つと思われるのは、操作の順序で、アプリケーションがアクティビティの前に最初に起動することです。この時間枠では、必要に応じて、最初のアクティビティの前に発生する必要なハウスキーピングを準備できます。
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created