Osheep

时光不回头,当下最重要。

Android 监听应用前/后台切换

前言

这周接到一个需求,需要在应用从后台切换到前台时,展示我们的广告。展示页面其实可以复用以前的开屏广告页,唯一的问题就是如何监听应用从后台切到了前台。

正文

在众多方法中,我采用了以下这种方式。废话不多说,咱们直接看代码:

//自定义Application类
public class MyApplication extends Application

在清单文件中声明

 <application
        android:name=".MyApplication"   
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

在MyApplication里重写onTrimMemory方法:

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == TRIM_MEMORY_UI_HIDDEN) {
            isBackGround = true;
            Log.i("bo", "APP遁入后台");
        }
    }

onTrimMemory方法为开发者提供了一个合适的时机,用来释放掉一些不用的资源,从而让我们的应用在后台存活更长时间。其中level参数就代表我们的应用当前在内存中的状态,TRIM_MEMORY_UI_HIDDEN代表应用从前台切到了后台。这个时候我们便可以标记应用切换到了后台。

接下来需要监听应用在什么时候回到了前台:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }

            @Override
            public void onActivityStarted(Activity activity) {
            }

            @Override
            public void onActivityResumed(Activity activity) {
                if (isBackGround) {
                    isBackGround = false;
                    Log.i("bo", "APP回到了前台");
                }
            }

            @Override
            public void onActivityPaused(Activity activity) {
            }

            @Override
            public void onActivityStopped(Activity activity) {
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });

我们使用registerActivityLifecycleCallbacks来监听所有Activity的生命周期回调,并在onActivityResumed方法中进行判断:调用了Activity的onResume方法,并且已经标记为后台状态,那么就可以判断APP回到了前台。

以下是log输出:

《Android 监听应用前/后台切换》

Log输出.png

以上就是我对这个问题的解决方案。

结尾

这个方案要求API大于等于14,因为registerActivityLifecycleCallbacks方法要求API在14以上。
最后,如有错误,欢迎大家指正。

点赞