美文网首页Android androidAndroid知识
android 如何判断app 运行在后台

android 如何判断app 运行在后台

作者: yunnywu | 来源:发表于2016-08-29 21:57 被阅读3020次

    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

    相关文章

      网友评论

      • 没风的地方:setAppGoBackGround()这个方法在哪里呀
        没风的地方:@yunnywu 好的,谢谢
        yunnywu:@没风的地方 这只是我的实现。你可以自己写一个方法来代替 appgobackground 需要做什么工作
      • w31d:感覺這個callback 用onActivityStart() 與 Activity 本身的 onStart() 很相似,如果以 onApplicationStart() 作為 interface method, 會更易明白。

      本文标题:android 如何判断app 运行在后台

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