做您想做的一件事是计算在您的应用程序中调用 onStart/onStop 的次数。这将帮助您确定您是从应用程序内部还是外部转换到您的活动。
您必须扩展Application然后在该类中创建/注册ActivityLifecycleCallbacks 。此外,请确保指定您在 AndroidManifest 中创建的新应用程序类。
现在,诀窍是在 onActivityStarted/onActivityStopped 中保留一个计数变量,以确定您的 Activity 是从应用程序内部还是外部导航到的。
假设您的应用中有 2 个活动:FirstActivity 和 SecondActivity。
如果您从 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。