检查app的activity是否在当前

APP开发中经常会遇到这种需求,需要检查当前的APP是不是可见的,比如,如果是可见的就维持一个socket长连接,如果切到后台不可见了,就断开这个连接。Android本来并不允许APP去监听home键事件,所以我们没发像iOS那样通过监听home键事件来做对应的处理。不过还好Android的Activity的生命周期给我们提供了一种解决这个问题的方法,我们只需要在每个Activity的onStart和onStop中去维持一个计数,如果这个数值大于0,就表示我们的APP还有Activity是在前台运行的,等于0,就表示APP已经被切换到后台。

说到这里你可能要想,是不是直接修改我的APP的BaseActivity,在基类里做计数的事情就好了。当然,这是最直接的一种方法。但是,这种方法需要你去修改自己的基类代码,侵入性太强,我不是很喜欢这种方法。更好的方式是使用sdk提供的Application.ActivityLifecycleCallbacks接口。下面的代码展示了如何实现这个接口:

public class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { 
    private int foregroundActivities;
    private boolean hasSeenFirstActivity;
    private boolean isChangingConfiguration;
    @Override 
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    }
  
    @Override
 public void onActivityStarted(Activity activity) {
        mForegroundActivities++;
        if (hasSeenFirstActivity && foregroundActivities == 1 && !isChangingConfiguration) {
            applicationDidEnterForeground(activity);
        }
        hasSeenFirstActivity = true;
        isChangingConfiguration = false;
    }
    @Override 
public void onActivityResumed(Activity activity) {
    }
  
    @Override
 public void onActivityPaused(Activity activity) {
    }
  
    @Override 
public void onActivityStopped(Activity activity) {
        foregroundActivities--;
        if (foregroundActivities == 0) {
            applicationDidEnterBackground(activity);
        }
        isChangingConfiguration = activity.isChangingConfigurations();
    }
  
    @Override
 public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    }
  
    @Override
 public void onActivityDestroyed(Activity activity) {
    }
 }

实现了自己的类之后,就可以调用Application的registerActivityLifecycleCallback方法,将我们的类MyActivityLifecycleCallbacks注册进去,这样就可以实现对Activity生命周期的监听了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏非著名程序员

浅谈Andorid开发中的MVP模式

? 导语:最近公众号后台经常收到一些消息,说能不能讲一些开发模式,经过思考后,我决定讲一讲MVP模式。希望对大家能够有所帮助。并写了一个简单的小demo。 ...

24060
来自专栏一个会写诗的程序员的博客

第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)

根据Realm Report (2017-Q4,https://realm.io/realm-report/2017-q4 ) ,过去的一年在Android ...

16130
来自专栏Android干货

Android项目实战(十三):浅谈EventBus

33860
来自专栏非著名程序员

Base封装之我的最简MVP架构

绪论 最近懒癌症犯了,好久都没写博客了,当然也在做一些东西,也在整理自己一直以来使用的一些技术点,从Retrofit到OkGO,从ListView到Recycl...

34090
来自专栏Android相关

AAC---DataBinding使用

DataBinding类似于ButterKnife,可以将数据结构与XML绑定,节省了很多Activity中UI的代码,比如说findViewById等。也可以...

19830
来自专栏移动端开发

Android学习--ListView

这篇文章用于总结自己这两天学到的安卓的ListView和RecyclerView 的笔记,以及从我这个iOS开发者的角度去理解和学习这两个控件,会比较一下他们个...

23690
来自专栏指尖下的Android

菜鸡的MVP架构漫谈

相信大家在网上看过关于MVP架构的博客数不胜数,至于MVP到底是什么,也不需要我再从百度百科复制一遍了,通俗的说MVP就是解决Model和View的耦合,没有使...

10020
来自专栏懒人开发

BottomNavigationView简单使用

之前见过类似这个库, 是带ripple效果的 不记得具体地址了,和这个类似 https://github.com/Ashok-Varma/BottomNav...

10530
来自专栏Java学习网

Android实现图片异步加载操作

Android实现图片异步加载操作 在Android开发过程中,为了防止阻塞UI,图片加载时经常采用异步的方法来加载,异步加载图片的主要流程是进行判断缓存中是...

25690
来自专栏编码前线

在Android Studio中自定义代码模板

实例:EmptyActivity\root\src\app_package\SimpleActivity.java.ftl

25720

扫码关注云+社区

领取腾讯云代金券