当前位置: 首页 > news >正文

初识 ActivityLifecycleCallbacks

看了 stay 的视频了解到判断 app 是否在后台运行除了令人蛋疼的判断当前 runningProcess 或者 runningTasks 方法, 还有一种更为简便的方法, 那就是 ActivityLifecycleCallbacks.

###官方文档 官方文档竟然连介绍都没有, 官方文档

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 从创建到销毁的回调方法.

我们使用的时候实现这个接口, 然后在我们自定义的 Application 调用初始化. 所有 Activity 的生命周期都会回调上面的方法.
初始化的时候需要注册它 application.registerActivityLifecycleCallbacks(this);

那我们判断 app 在不在前台的依据是什么呢?

首先来看一张 Activity 的生命周期图:

它每个方法的说明:

官方文档 Activity 链接

可以看到, onStart() 是即将对用户可见时调用, 也就是即将在前台的时候, 对应的就是 onStop() , 对用户不再可见时调用. 所以在这 2 个方法来对 app 是否在前台做出判断.

我们定义一个计数器 int activeCount 来记录 Activity 活动的个数, Activity 调用 onStart 就 +1, onStop 就 -1. 在 onResumed 的时候就是在前台的时候. 同时也可以定义一个 long time, 定义在 app 在前台呆了多长时间.

public class AppStatusTracker implements Application.ActivityLifecycleCallbacks {  

    private static final long MAX_INTERVAL = 5 * 60 * 1000;
    private static AppStatusTracker tracker;
    private Application application;
    private boolean isForground;
    private int activeCount;
    private long timestamp;
   

    private AppStatusTracker(Application application) {
        this.application = application;
        application.registerActivityLifecycleCallbacks(this);
    }

    public static void init(Application application) {
        tracker = new AppStatusTracker(application);
    }

    public static AppStatusTracker getInstance() {
        return tracker;
    }

   


    public boolean isForground() {
        return isForground;
    }

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

    }

    @Override
    public void onActivityStarted(Activity activity) {
        
        if (activeCount == 0){
            timestamp = System.currentTimeMillis();
        }
        activeCount++;
    }

    @Override
    public void onActivityResumed(Activity activity) {
        isForground = true;
    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

        activeCount--;
        if (activeCount == 0) {
            isForground = false;
            timestamp = System.currentTimeMillis() - timestamp;
        }
    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }
}
复制代码

然后在自己的 application 里面初始化就可以了.

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AppStatusTracker.init(this
        );
    }
}
复制代码

逻辑挺简单的呵呵. 不过这个功能只在 4.0 之上可用, 不过现在应该基本都是 4.0 以上的手机了吧. 除了这个简单的功能, 还可以加入一个广播来判断屏幕熄灭后要做的逻辑. 后面等我摸索熟了再来实现.

相关文章:

  • Zim - 普通人的Org-mode
  • 带参数存储过程的小例子
  • NSLog输出对象
  • 需要Review的题目:
  • lame的ios 静态库创建shell
  • 浅谈设计模式在iOS开发实战项目中的应用
  • string的Equels问题小记
  • JS创建函数:函数声明和函数表达式
  • 快给你的app上锁吧(android数字解锁)
  • 2012财富世界500强发布,大陆首超日本,新增12家
  • F#中的事件(下)
  • BW数据源深入研究【转自WKingChen的博客】
  • JsonModel 的使用
  • 【总结】后缀数组
  • div垂直水平剧中
  • 【css3】浏览器内核及其兼容性
  • 30天自制操作系统-2
  • Android 架构优化~MVP 架构改造
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • ESLint简单操作
  • HomeBrew常规使用教程
  • Mithril.js 入门介绍
  • Mocha测试初探
  • NSTimer学习笔记
  • overflow: hidden IE7无效
  • php ci框架整合银盛支付
  • Vim 折腾记
  • 从零开始的无人驾驶 1
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 番外篇1:在Windows环境下安装JDK
  • 前端相关框架总和
  • 如何在GitHub上创建个人博客
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • (12)Hive调优——count distinct去重优化
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)计算机毕业设计ssm电影分享网站
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (过滤器)Filter和(监听器)listener
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 提取注释生成API文档 帮助文档
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET性能优化(文摘)
  • /proc/vmstat 详解
  • @font-face 用字体画图标
  • @JsonSerialize注解的使用
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [1] 平面(Plane)图形的生成算法
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)