【问题标题】:how to detect app is now foreground after minimizing the app?最小化应用程序后如何检测应用程序现在是前台?
【发布时间】:2015-09-11 20:33:39
【问题描述】:

通过使用onResume(),我可以检查活动是否在前台。我的问题是这个onResume() 每次都会被触发,即使我来自另一个活动到这个活动。

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

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

请给我一些提示,我该如何克服这个解决方案或可以帮助我的代码 sn-p。在此先感谢:)

【问题讨论】:

  • 我对您的理解是否正确:您希望您的应用程序检测从应用程序外部到您的一项活动的转换?所以主屏幕>你的活动会触发它,你的活动的另一个活动会触发它,但你的活动对你的活动不会触发它?
  • @skaar 不是真的。只是我只想检测按下主页按钮或检测我的应用程序通过按下主页按钮最小化而不使用onPause()和onResume()。现在做有意义。虽然我英语不好。对此感到抱歉。
  • 好的,我发布了一个答案。我认为这将实现您想要的。

标签: android broadcastreceiver onresume onpause background-foreground


【解决方案1】:

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

您必须扩展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) {
    }
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 每次应用进入前台都会触发吗?
    • 不符合此人的要求。清楚
    猜你喜欢
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多