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

来源:互联网 发布:ios手机虚拟定位软件 编辑:程序博客网 时间:2024/04/27 17:54

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

 要解决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<ActivityManager.RunningAppProcessInfo> 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<ActivityManager.RunningTaskInfo> 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();    }    ....}



1 0
原创粉丝点击