前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[060]监听应用的前后台切换

[060]监听应用的前后台切换

作者头像
王小二
发布2020-08-25 09:41:03
7930
发布2020-08-25 09:41:03
举报

前言

最近在开发一个功能需要在应用进入前台和退出前台的时候启动和关闭一个功能,所以需要实现一个监听应用的前后台切换

一、方案1

这个方案也是网上很多人在用的方案,就是利用Application.ActivityLifecycleCallbacks,通过onActivityStarted和onActivityStopped的计数,来监听应用的前后台切换。

1.1 实现Application.ActivityLifecycleCallbacks

代码语言:javascript
复制
public class LifecycleCallback implements Application.ActivityLifecycleCallbacks {
    private static final String TAG = "LifecycleCallback";
    private int count; 
    private boolean isForeground; 

    public boolean isForeground() {
        return isForeground; 
    }

    @Override 
    public void onActivityStarted(Activity activity) { 
        count ++; 
    }
    @Override 
    public void onActivityStopped(Activity activity) { 
        count --; 
        if(count == 0) {
            isForeground = true; 
        }
    }
}

1.2 在Application初始化的时候注册

代码语言:javascript
复制
public class MyApplication extends Application {
    LifecycleCallback callbacks;
    @Override 
    public void onCreate() {
        super.onCreate(); 
        callbacks = new LifecycleCallback();
        registerActivityLifecycleCallbacks(callbacks);  // 注册Callback
    }
}

1.3 小结

标准SDK的方案,不需要修改安卓源码,纯APP方案,但是需要注意,onActivityStarted的回调运行在主线程,如果需要添加一些相对耗时的操作,最好是在子线程操作。

二、方案2

作为Android系统工程师,肯定可以修改源码来实现我的功能,我发现ActivityThread.java中有一个updateProcessState回调代码,可以用来实现我的需求。

2.1 修改ActivityThread.java的代码

代码语言:javascript
复制
    @Override
    public void updateProcessState(int processState, boolean fromIpc) {
        synchronized (mAppThread) {
            updateTopUIState(processState, fromIpc);//add by me
            .....省略大量代码
        }
    }

    private boolean isTopUI = false;

    private void updateTopUIState(int processState,  boolean fromIpc) {
        boolean topUI = processState == ActivityManager.PROCESS_STATE_TOP;
        try {
            if(isTopUI != topUI) {
                isTopUI = topUI;
            } 
        } catch (Exception e) {
        }
    }

2.2 小结

需要修改安卓源码,注意虽然updateProcessState运行在binder线程上,做耗时的操作不会影响到主线程,但是由于updateProcessState是被IApplicationThread.aidl中的oneway方法setProcessState触发的。如果看过我的文章[023]你真的懂AIDL的oneway嘛?,你应该知道,在updateProcessState中做耗时的操作也是不合适的,最好也是子线程操作。

三、总结

以上就是我监听应用前后台切换的两种方案,如果你有更好的监听应用前后台切换的方案,欢迎留言。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、方案1
    • 1.1 实现Application.ActivityLifecycleCallbacks
      • 1.2 在Application初始化的时候注册
        • 1.3 小结
        • 二、方案2
          • 2.1 修改ActivityThread.java的代码
            • 2.2 小结
            • 三、总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档