专栏首页Android开发与分享【Android】如何知道某个Activity是否在前台?

【Android】如何知道某个Activity是否在前台?

转载自zrong's blog

有一个Android应用包含包含一个后台程序,该程序会定期连接服务器来实现自定义信息的推送。但是,当这个应用处于前台的时候,后台程序就没有必要连接服务器了。这样可以节省网络资源,也更省电。

用什么方法知道该应用是否处于前台呢?

网上搜到的方法大多数都是使用下面的代码:

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
//获得task列表
List<ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1); 
Log.d("topActivity", "CURRENT Activity ::"+ taskInfo.get(0).topActivity.getClassName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
componentInfo.getPackageName();

但是查阅 Android文档 后发现,google并不推荐使用这个方法:

This should never be used for core logic in an application, such as deciding between different behaviors based on the information found here. Such uses are not supported, and will likely break in the future. For example, if multiple applications can be actively running at the same time, assumptions made about the meaning of the data here for purposes of control flow will be incorrect.

而且,这个方法还要求设置android.permission.GET_TASKS权限。 因此,我必须寻找更加合适的方法来做这件事。最终,我找到这个方法getRunningAppProcesses() ,它并不需要增加特殊的权限。

下面是范例代码:

/**
 * 返回当前的应用是否处于前台显示状态
 * @param $packageName
 * @return
 */
private boolean isTopActivity(String $packageName) 
{
    //_context是一个保存的上下文
    ActivityManager __am = (ActivityManager) _context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> __list = __am.getRunningAppProcesses();
    if(__list.size() == 0) return false;
    for(ActivityManager.RunningAppProcessInfo __process:__list)
    {
        Log.d(getTAG(),Integer.toString(__process.importance));
        Log.d(getTAG(),__process.processName);
        if(__process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
                __process.processName.equals($packageName))
        {
            return true;
        }
    }
    return false;
}

有错误之处感谢指出

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Android】Retrofit2.0源码解析

    Gavin-ZYX
  • 【Android】DecimalFormat简单使用

    Gavin-ZYX
  • 【Android】Walle多渠道打包&Tinker热修复

    Gavin-ZYX
  • 关于 Java finally 执行顺序 -- 修改版

    一份执着✘
  • 你真的了解try{ return }finally{}中的return?

    The finally block always executes when the try block exits. This ensures that th...

    一觉睡到小时候
  • Java关键字 Finally执行与break, continue, return等关键字的关系

    长文短总结: 在程序没有在执行到finally之前异常退出的情况下,finally是一定执行的,即在finally之前的return语句将在finally执行...

    老白
  • 从Rust到远方:ASM.js星系

    来源: https://mnt.io/2018/08/28/from-rust-to-beyond-the-asm-js-galaxy/

    MikeLoveRust
  • 参考简书的notify提示消息,自定义实现一个

    index.html为开发时的测试文件,notify.js是未压缩的,notify.min.js是压缩后,可直接调用的。

    无道
  • C++读写文件

    [1]C++读取txt文件 [2]C++修改/覆盖指定位置的文件内容或者从某个位置开始截断文件 [3]C++文件读写详解(ofstream,ifstream...

    Dabelv
  • Google Protocol Buffers 序列化算法分析

    分析一下 Google Protocol Buffers 的序列化原理。介绍参考 Google Protocol Buffers 数据交换协议

    Yano_nankai

扫码关注云+社区

领取腾讯云代金券