最小化应用程序后,如何检测应用程序现在处于前台?

how to detect app is now foreground after minimizing the app?

通过使用 onResume() 我可以检查 activity 是否是前景。我的问题是这个 onResume() 每次都是火,即使我来自另一个 activity 到这个 activity。

所以我的主要问题是,如果我通过主页按钮最小化应用程序,我想在应用程序出现在前台但不使用 onResume() 时在每个 activity 中执行一些代码。

我找到了这样的答案 How to know in BroadcastReceiver if App is running on foreground? 但我不知道如何在 android 清单中注册此接收器以在应用程序可见时获取触发器。

请给我一些提示,我该如何克服这个可以帮助我的解决方案或代码片段。提前致谢:)

如果你想注册你的接收器,你可以使用下面的代码,

<receiver 
    android:name="com.package.name.ReceiverClassName"
    android:enabled="true" >
</receiver>

做你想做的一件事是计算在你的应用程序中调用 onStart/onStop 的次数。这将帮助您确定您是从应用程序内部还是外部过渡到 activity。

您必须在 class 内扩展 Application then create/register ActivityLifecycleCallbacks。此外,请确保指定您在 AndroidManifest 中创建的新应用程序 class。

现在,诀窍是在 onActivityStarted/onActivityStopped 中保留一个计数变量,以确定您的 Activity 是从应用程序内部还是外部导航到的。

假设您的应用中有 2 个 Activity:第一个Activity 和第二个Activity。

如果您从 FirstActivity 导航到 SecondActivity,生命周期调用将按以下顺序发生:FirstActivity.onStart() > SecondActivity.onStart(),导致计数 1.

如果您从应用程序外部导航,您将只会看到 FirstActivity.onStart(),因此计数为 0。这一切都假设您在调用 super.onStart() 后检查计数。

因此,通过对照 0/1 检查计数,您可以判断您的 activity 是从应用程序内部还是外部启动的。

/**
 * 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) {
    }
}

您可能还会获得更多信息here,但它不使用更易于使用的 ActivityLifecycleCallbacks。