ActivityLifecycleCallbacks如何判断APP是否在前台

 更新时间:2018年07月20日 17:01:27   作者:xiaozhang1993  
这篇文章主要为大家详细介绍了ActivityLifecycleCallbacks判断APP是否在前台的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了ActivityLifecycleCallbacks如何判断APP是否在前台,供大家参考,具体内容如下

ActivityManager

通常情况下,我们判断app是否在前台都是通过 ActivityManager。

/**
   * Activity是否在前台
   * @param context
   * @return
   */
  private boolean isOnForground(Context context){
    ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> appProcessInfoList = activityManager.getRunningAppProcesses();
    if(appProcessInfoList == null){
      return false;
    }

    String packageName = context.getPackageName();
    for(ActivityManager.RunningAppProcessInfo processInfo : appProcessInfoList){
      if(processInfo.processName.equals(packageName) && processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND ){
        return true;
      }
    }
    return false;
  }

但是这个并不是最好的:

  • 性能差,相当于遍历所有的进程来找前台的且包名符合的。
  • 在有些手机上 不适用。

ActivityLifecycleCallbacks

Application可以通过 registerActivityLifecycleCallbacks 来注册 ActivityLifecycleCallbacks 接口,以实现对所有Activity生命周期的回调。

this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

      }

      @Override
      public void onActivityStarted(Activity activity) {

      }

      @Override
      public void onActivityResumed(Activity activity) {

      }

      @Override
      public void onActivityPaused(Activity activity) {

      }

      @Override
      public void onActivityStopped(Activity activity) {

      }

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

      }

      @Override
      public void onActivityDestroyed(Activity activity) {

      }
    });

每一个Activity的生命周期都会回调相应的方法。意思是Application能监听所有Activity的生命周期咯,是不是很牛x。
这个功能可以用来做某种统计,或者弄成一个Activity链表可以知道前后Activity什么的,虽然目前还没遇到这种需求,当然了”判断APP是否在前台“这个功能算半个不过分吧。

生命周期

然后,为了达到 ”判断APP是否在前台“这个功能,我们需要先知道activity的生命周期。是不是很简单?
但是很多人不知道 如果ActivityA intent跳转到 ActivityB,这两个的生命周期是怎么切换的。
公布答案:
ActivityA.OnPause() —> AcitivityB.OnCreate() —> AcitivityB.OnStart() —> ActivityB.OnResume() —> ActivityA.OnStop()
其实,也确实应该是这样嘛,你要切换新界面,总得等新界面显示出来了,才能去处理旧界面。总不能先把旧的处理掉,然后黑屏加载新界面吧。

判断APP是否在前台

this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

      }

      @Override
      public void onActivityStarted(Activity activity) {
        count++;
        if(count == 1){
          Log.e("ZXK","foreground");
        }
      }

      @Override
      public void onActivityResumed(Activity activity) {

      }

      @Override
      public void onActivityPaused(Activity activity) {

      }

      @Override
      public void onActivityStopped(Activity activity) {
        count--;
        if(count == 0){
          Log.e("ZXK","background");
        }
      }

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

      }

      @Override
      public void onActivityDestroyed(Activity activity) {

      }
    });
  1. 新建个int变量 count
  2. 然后在Application.onCreate()中注册回调
  3. onActivityStarted()中 count+1,如果count为1,则进入前台;onActivityStopped()中 count-1,如果count为0,则进入后台。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解Android获得系统GPU参数 gl.glGetString

    详解Android获得系统GPU参数 gl.glGetString

    这篇文章主要介绍了详解Android获得系统GPU参数 gl.glGetString的相关资料,需要的朋友可以参考下
    2017-07-07
  • Flutter使用RepositoryProvider解决跨组件传值问题

    Flutter使用RepositoryProvider解决跨组件传值问题

    在实际开发过程中,经常会遇到父子组件传值的情况。本文将利用RepositoryProvider解决跨组件传值的问题,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Android时间对话框使用方法详解

    Android时间对话框使用方法详解

    这篇文章主要为大家详细介绍了Android时间对话框的使用方法,包括analogclock和digitalclock显示时钟的控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android自定义TextView实现文字倾斜效果

    Android自定义TextView实现文字倾斜效果

    有时候Android自带的控件无法满足我们的某些要求,这时就需要我们自定义控件来实现这些功能。比如在实际开发应用中,我们有时需要将TextView的文字倾斜一定的角度,就需要自定义TextView。下面这篇文章就给大家介绍了利用Android TextView如何实现文字倾斜效果。
    2016-11-11
  • Android学习笔记-保存文件(Saving Files)

    Android学习笔记-保存文件(Saving Files)

    这篇文章主要介绍了Android中保存文件(Saving Files)的方法,需要的朋友可以参考下
    2014-10-10
  • Android游戏开发之黑白棋

    Android游戏开发之黑白棋

    本文主要介绍Android黑白棋游戏实现过程及代码解析,将着重介绍黑白棋实现过程中用到的算法。对于Android游戏开发很有帮助。
    2016-08-08
  • Android隐私弹框功能的实现

    Android隐私弹框功能的实现

    最近做app类的项目,现在发布app都需要在发布前生成一个用户隐私弹框让用户点击,这个功能看似简单,到底怎么实现的呢?下面小编给大家带来了Android隐私弹框功能的实现代码,一起看看吧
    2021-10-10
  • Android 性能优化系列之bitmap图片优化

    Android 性能优化系列之bitmap图片优化

    在日常开发的APP,大部分时候需要想用户展示图片信息,图片最终对应Android中的Bitmap对象。而对于APP端来说Bitmap又是一个比较麻烦的问题,主要表现在Bitmap是非常占用内存的对象,处理不当将导致APP运行卡顿甚至出现OOM
    2021-11-11
  • Flutter音乐播放插件audioplayers使用步骤详解

    Flutter音乐播放插件audioplayers使用步骤详解

    audioplayers是一个可以支持同时播放多个音频文件的Flutter的插件,可以播放多个同时的音频文件,这篇文章主要介绍了audioplayers的使用步骤,感兴趣想要详细了解可以参考下文
    2023-05-05
  • Android开机自启动服务的实现方法

    Android开机自启动服务的实现方法

    Android开机自启动服务的实现方法,需要的朋友可以参考一下
    2013-05-05

最新评论