やりたいことの 1 つは、アプリケーションで onStart/onStop が呼び出された回数を数えることです。これは、アプリケーションの内部または外部からアクティビティに移行したかどうかを判断するのに役立ちます。
Applicationを拡張してから、そのクラス内でActivityLifecycleCallbacksを作成/登録する必要があります。また、AndroidManifest で作成した新しい Application クラスを必ず指定してください。
ここでの秘訣は、onActivityStarted/onActivityStopped にカウント変数を保持して、Activity がアプリケーションの内部または外部からナビゲートされたかどうかを判断することです。
アプリに FirstActivity と SecondActivity の 2 つのアクティビティがあるとします。
FirstActivity から SecondActivity に移動すると、ライフサイクル コールは FirstActivity.onStart() > SecondActivity.onStart() の順序で発生し、カウントは 1 になります。
アプリケーションの外部からナビゲートすると、FirstActivity.onStart() しか表示されないため、カウントは 0 です。これはすべて、super.onStart() が呼び出された後にカウントを確認することを前提としています。
そのため、カウントを 0/1 と照合することで、アクティビティがアプリケーション内から起動されたのか、アプリケーション外から起動されたのかがわかります。
/**
* Extending the application class lets you use ActivityLifecycleCallbacks to
* keep track of all lifecycle callbacks in your application.
*/
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
private int count = 0;
//Register activity lifecycle callbacks in onCreate
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
void onActivityStarted(Activity activity) {
count++;
}
void onActivityStopped(Activity activity) {
count--;
}
/**
* Use this method in your Activities to test if the activity was
* transitioned to from outside the application.
*
* If you call this method in Activity.onResume(), then count should be
* compared to 0. If you call this method in Activity.onStart() but
* *before* calling super.onStart(), then count should be compared to 0.
*
* However, if you call this method after super.onStart(), then count
* should be compared to 1.
*/
public boolean cameFromOutsideApplication() {
return count == 0;
}
//Don't need to use the rest of the activity lifecycle callbacks
void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
void onActivityDestroyed(Activity activity) {
}
void onActivityPaused(Activity activity) {
}
void onActivityResumed(Activity activity) {
}
void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
}
ここでもさらに情報が得られるかもしれませんが、使いやすい ActivityLifecycleCallbacks は使用されていません。