android 如何判断app 运行在后台

app 开发中,经常可能会涉及到判断app 是否运行在后台。比如需要在后台启动运行Service, 或者需要从后台切换回前台时,做一些update 操作的等等。这些都需要我们能够监测到app 运行到后台。

最开始的时候我们采用的是监听系统的广播来实现,主要是监听Intent.ACTION_CLOSE_SYSTEM_DIALOGS 和 Intent.ACTION_SCREEN_OFF 这两个系统广播,监听的代码放在我们app 的 RootActivity (启动方式为 singleTask )里面。
Receiver 的大概代码如下:

    final String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
    final String SYSTEM_DIALOG_REASON_LOCK_KEY = "lock";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
      
         if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null && (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)
                        || reason.equals(SYSTEM_DIALOG_REASON_LOCK_KEY))) {
                       setAppGoBackground(true);
                }
            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                setAppGoBackground(true);
            }
        }
    }

这种方式虽然能够监听到用户按HOME键以及锁屏使app切换到后台的动作。但是总觉得这种方式不够优雅。

其实 android 在从sdk14 开始为我们提供了一个新的api 用于检测app 中activity 的生命周期,正好我们app 的minSdkVersion 已经设置为 14 了。 所以现在我们可以使用ActivityLifecycleCallbacks来 监听app 是否运行在后台的行为了。

 public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

根据 Activity 的生命周期,知道onStart() 一般表示一个Activity 处于前台,onStop() 一般表示Activity在后台不可见。所以我们设置一个int refCount 变量, onActivityStarted 的时候refCount++, onActivityStopped的时候refCount--。当onActivityStopped之后如果refCount == 0 了。那么表示我们的app里面没有处于onStart的Activity 了,
也就相当于 app 已经处于后台了。

 class ActivityLifecycleListener implements ActivityLifecycleCallbacks{
        
        private int refCount = 0;

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

        @Override
        public void onActivityStarted(Activity activity) {
            refCount++;
        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {
            refCount--;
            if(refCount == 0){
                setAppGoBackGround(true);
            }
        }

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

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    }

然后在app 里面的 Application onCreate()方法注册即可:

registerActivityLifecycleCallbacks(new ActivityLifecycleListener());

是不是超级EASY.

更多关于App运行在后台的判断方法,你还可以参考AndroidProcess 这个项目。

参考:

https://github.com/wenmingvs/AndroidProcess
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,941评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,705评论 0 17
  • 最近刚从旧公司离职,为面试在做准备,因为平时开发CV大法用得比较多,很多基础知识掌握得不是很牢靠以及很多工具框架只...
    黎清海阅读 6,625评论 1 19
  • 1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activit...
    JoonyLee阅读 11,008评论 2 51
  • 感觉充满了土气。一些游乐项目非常土。 主要是去爬山,5000米上山路,走得很累,一上去没多久又下来了,下山更累。 ...
    菠00阅读 1,176评论 0 0