3

通过使用onResume()我可以检查活动是否是前台。我的问题是onResume(),即使我从另一个活动到此活动,每次都会着火。

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

我找到了这样的答案如何在 BroadcastReceiver 中知道 App 是否在前台运行? 但我不知道如何在 android 清单中注册此接收器以在应用程序可见时获取触发器。

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

4

2 回答 2

2

做您想做的一件事是计算在您的应用程序中调用 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。

于 2015-09-12T06:56:52.543 回答
-2

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

<receiver 
    android:name="com.package.name.ReceiverClassName"
    android:enabled="true" >
</receiver>
于 2015-09-11T20:42:52.310 回答