如何判断Android app退后台、进前台

       安卓应用进后台要释放资源、进前台执行一些逻辑(比如执行接口刷数据、打开手势密码、启动服务等等)。

 要解决2个问题:

1、 如何判断应用当前是否在前台?

2、如何得到用户按Home键、再次打开应用的事件?

       

     Android5.0之前可以用ActivityManager的getRunningTasks方法, 但5.0及后续版本该方法被注释为@Deprecated。 下面函数可以用来判断app是否在前台, 从Android5.0开始通过判断进程优先级得出是否在前台。PS:进程分为5大优先级:前台进程、可视进城、服务进程、后台进程、空进程等。

    /**
     * 判断程序是否在前台运行
     * @param context
     * @return true在前台,false在后台
     */
    private boolean isAppForeground(Context context) {
        boolean isForground = false;
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            List runningProcesses = am.getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
                //前台程序
                if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    for (String pkgName : processInfo.pkgList) {
                        if (pkgName.equals(context.getPackageName())) {
                            isForground = true;
                        }
                    }
                }
            }
        } else {
            //@deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, 从Android5.0开始不能使用getRunningTask函数
            List taskInfo = am.getRunningTasks(1);
            ComponentName componentInfo = taskInfo.get(0).topActivity;
            if (componentInfo.getPackageName().equals(context.getPackageName())) {
                isForground = true;
            }
        }

        return isForground;
    }


应用退后台、进前台都是通过判断当前进程的Activity是否处于活跃状态。 可通过2个具体方法实现:

1、 自定义一个Activity/FragmentActivity的派生类,  项目中所有的Activity都继承于自定义类。 覆盖onStart、onStop方法, 并设置单例整型变量自增1或者自减1。 具体逻辑参考第2种方式。


2、 Android还支持在Application类中注册Activity的回调, 我们可以在Application类里实现对应的逻辑。 count为1时表示应用切换到前台, 为0时表示切换到后台。

配置AndroidManifest.xml:

<application
    android:name=".TheApplication"
    ...
     />


public class TheApplication extends Application {
    private int mCount;
    ....

    @Override
    public void onCreate() {
        super.onCreate();

        ...
        mCount = 0;
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {
                mCount++;
                //如果mCount==1,说明是从后台到前台
                if (mCount == 1){
                   //执行app跳转到前台的逻辑
                   ...
                }
            }

            @Override
            public void onActivityResumed(Activity activity) {
            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {
                mCount--;
                //如果mCount==0,说明是前台到后台
                if (mCount == 0){
                    //执行应用切换到后台的逻辑
                }
            }

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

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }
    ....
}



你可能感兴趣的:(Android)