美文网首页程序员
Activity管理和应用前后台判断

Activity管理和应用前后台判断

作者: lipyhui | 来源:发表于2018-12-18 08:35 被阅读0次

    一、说明

      笔记主要是记录一些本人在开发当中的学习和使用笔记。笔记内容包含一些本人觉得重要的知识点、本人易犯的错误等。
      由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修改正。谢谢!

    二、笔记时间

      2018年12月17日

    三、简述

      本文主要讲述Activity统一管理,主要是如何判断应用是否处于前后台。

    四、详情

    1 应用前后台判断

      我们先讲讲如何判断应用是处于前台还是后台。在我们需要统计用户在线时长,或者统计用户使用时间段等业务需求的时候,应用前后台的判断就显得尤为重要。下面讲讲前后台判断的几种方式。

    1.1 通过包名判断

      我们可以通过应用包名来判断当前应用是处于前台还是处于后台。代码如下:

    public static boolean isRunningOnBackground(Context context){
            ActivityManager acm = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            if(acm != null){
                List<RunningAppProcessInfo> runApps = acm.getRunningAppProcesses();
                if(runApps != null && !runApps.isEmpty()){
                    for(RunningAppProcessInfo app : runApps){
                        if(app.processName.equals(context.getPackageName())){
                            if(app.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND){
                                return true;
                            }
                        }
                    }
                }
            }
            return false;
        }
    

    1.2 通过ActivityManager来统计

      通过ActivityManager来管理,其实是自定义一个ActivityManager类。该类的作用是对Activity的生命周期进行统一的管理,这样我们就知道每一个Activity是否处于前台,这样我们就只需要查是否有处于前台的Activity就知道应用是否处于前台。

    1.2.1 通过BaseActiviy统计实现

      我们也可以使所有Activity继承BaseActivity,进行前台Activity的统计,来判断应用是否处于前台。其实我觉得这种方式就是实现了一个简单的ActivityManager,ActivityManager只做了一个事情,就是统计前台Activity。

    1.2.2 通过一个ActivityManager管理类实现

      通过一个ActivityManager管理类来管理所有Activity使用周期。这是一个比较完善的Activity管理方式。此处举一个简单些的例子,只管理Activity的创建、销毁、和暂停。

        private static LinkedList<Activity> mActivitys=  new LinkedList<>();
        private static int mActiveActivity = 0;
       
       /**
         * 添加Activity
         */
       private static add(Activity activity) {
         mActivitys.add(activity);
         mActiveActivity ++;
       }
    
       /**
         * 删除Activity
         */
       private static remove(Activity activity) {
         mActivitys.remove(activity);
       }
    
       /**
         * 设置不活跃
         */
       private static setNoActive(Activity activity) {
         if(mActiveActivity >= 1){     
            mActiveActivity --;
          }
       }
    

    1.2.3 通过ActivityLifecycleCallbacks监听Activity生命周期

      通过在Application中实现ActivityLifecycleCallbacks接口,我们就可以监听到所有Activity的生命周期。当然,我们还是需要配合ActivityManager才能知道当前应用是否处于前台。

    public class MyApplication extends Application implements ActivityLifecycleCallbacks {
        private LinkedList<Activity> mActivitys;
        private int mActiveActivityCount = 0;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mActivitys = new LinkedList<>();
            registerActivityLifecycleCallbacks(this);
        }
    
         /**
           * 是否处于前台
           */
        public boolean isInForeground() {
            if (mActiveActivityCount > 0) {
                return true;
            } else {
                return false;
            }
        }
    
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
          if (null != mActivitys&& null != activity) {
             mActivitys.add(activity);
          }
        }
    
        @Override
        public void onActivityStarted(Activity activity) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void onActivityResumed(Activity activity) {
           if (null != mActivitys&& null != activity) {
              mActiveActivityCount ++;
            }
        }
    
        @Override
        public void onActivityPaused(Activity activity) {
            if (null != mActivitys&& null != activity) {
              mActiveActivityCount --;
            }
        }
    
        @Override
        public void onActivityStopped(Activity activity) {
           // TODO Auto-generated method stub
        }
    
        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void onActivityDestroyed(Activity activity) {
            if (null != mActivitys&& null != activity) {
                mActivitys.remove(info);
            }
        }
    }
    

      当然,我们也可以在Activity里面实现ActivityLifecycleCallbacks方法,监听该Activity的生命周期变化。
      最后一点,我们也可以通过unregisterActivityLifecycleCallbacks来注销监听。

    相关文章

      网友评论

        本文标题:Activity管理和应用前后台判断

        本文链接:https://www.haomeiwen.com/subject/kwtqkqtx.html