Android监听APP前后台转换的两种方式

应用场景:很多时候我们需要去监听用户有没有将APPs放置在后台,比如常用的银行类APP、音视频播放类APP,那么这些APP为什么要去监听应用程序在不在前台?银行当然是为了安全,必须保证一些数据的传输一定是在前台,音视频播放APP呢,是为了更好的用户体验,用户按下home键切换到其他页面,期望是想让正在播放的电影暂停下来,而不是看不到视频页面而APP还在不停的播放,鉴于此种目的,我们需要做监听APP前后台应用。现在找到两种方法来实现:

一:BaseActivity基类+ActivityManager.RunningAppProcessInfo

首先,创建所有activity的基类,项目中所有Activity去继承BaseActivity,这样就可以统一管理,BaseActivity当然会有各种生命周期,onResume()和onStop()中去判断执行逻辑代码,也就是说进入一个Activity页面 它的onResume肯定会执行,home键退出应用程序肯定会走onStop,逻辑伪代码综上所述,下面来看代码

public class BaseActivity extends Activity {

    public static boolean isActive; //全局变量

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
    }

    @Override
    protected void onResume() {
        if (!isActive) {
            //app 从后台唤醒,进入前台
            isActive = true;
            Log.i("ACTIVITY", "程序从后台唤醒");
        }
        super.onResume();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        if (!isAppOnForeground()) {
            //app 进入后台
            isActive = false;//记录当前已经进入后台
            Log.i("ACTIVITY", "程序进入后台");
        }
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    /**
     * APP是否处于前台唤醒状态
     *
     * @return
     */
    public boolean isAppOnForeground() {
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        String packageName = getApplicationContext().getPackageName();
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        if (appProcesses == null)
            return false;

        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            // The name of the process that this object is associated with.
            if (appProcess.processName.equals(packageName)
                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return true;
            }
        }

        return false;
    }
}

二:Application中注册声明周期监听回调

首先,创建当前项目的Application去继承系统的Application,在Application中实现onCreate()方法,方法中注册reginsterActivitylifecycleCallBacks回调,来看代码实现

public class TheApplication extends Application {

    private int mFinalCount;

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {
                mFinalCount++;
                //如果mFinalCount ==1,说明是从后台到前台
                Log.e("onActivityStarted", mFinalCount +"");
                if (mFinalCount == 1){
                    //说明从后台回到了前台
                }
            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {
                mFinalCount--;
                //如果mFinalCount ==0,说明是前台到后台
                Log.i("onActivityStopped", mFinalCount +"");
                if (mFinalCount == 0){
                    //说明从前台回到了后台
                }
            }

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

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }
}
这样基本上实现了app前后台切换的动态监听

猜你喜欢

转载自blog.csdn.net/dream_caoyun/article/details/80878698