在最小化应用后,如何检测应用程序现在是前景?

时间:2015-09-11 20:33:40

标签: android broadcastreceiver onresume onpause background-foreground

使用onResume()我可以检查活动是否是前景。我的问题是,即使我来自此活动的另一项活动,onResume()每次都会点火。

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

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

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

2 个答案:

答案 0 :(得分:2)

要做的事情就是计算应用程序中调用onStart / onStop的次数。这将帮助您确定是否从应用程序内部或外部转换到您的活动。

您必须扩展Application,然后在该课程中创建/注册ActivityLifecycleCallbacks。此外,请确保指定您在AndroidManifest中创建的新Application类。

现在,诀窍是在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。

答案 1 :(得分:-1)

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

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