在一些场景下我们需要知道应用是否在前台显示,当不在前台显示的时候,一些后台进程可以暂时停止,比如一些查询任务、不必要的线程、不需要的渲染等,以减少对设备资源的占用。判断应用是否在前台通常可以使用一下方式:

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<RunningTaskInfo> runnings = am.getRunningTasks(Integer.MAX_VALUE);
for(RunningTaskInfo info : runnings){
if(info.topActivity.equals(activityName)){
Log.i("my","前台显示");
}
}

因为系统api的变迁,也可以使用下面的方式:

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runnings = am.getRunningAppProcesses();
for(RunningAppProcessInfo running : runnings){
if(running.processName.equals(getPackageName())){
if(running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
|| running.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE){
//前台显示...
}else{
//后台显示...
}
break;
}
}

这里后者判断加上了可见。比如,当用户点击了home键,这时候方法1和方法2都可以判断出来处于后台显示,然后再点击应用 再快速的打开其他的应用,这时候我们的应用就被其他应用盖在上面了,而方法1和方法2判断的结果都是在前台显示,这种情况下,就无法做出正确的判断,

通过研究和测试,发现使用下面的方式可以正确判断出来,方法如下:

public boolean isAppOnForeground(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
boolean isOnForground = false;
List<ActivityManager.RunningAppProcessInfo> runnings = am.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo running : runnings) {
if (running.processName.equals(getPackageName())) {
if (running.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
|| running.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
//前台显示...
Log.e("my", "前台显示");
isOnForground = true;
} else {
//后台显示...
Log.e("my", "后台显示");
isOnForground = false;
}
break;
}
}
String currentPackageName = "";
if (am.getRunningTasks(1).size() > 0) {
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
currentPackageName = cn.getPackageName();
}
// Log.e("my", "isAppOnForeground :" + currentPackageName + " getPackageName:" + getPackageName());
// return !TextUtils.isEmpty(currentPackageName) && currentPackageName.equals(getPackageName());
return isOnForground;
}

下面的部分代码虽然没用到,但是不可省略,删去则不能正确判断。产生这个问题的原因,可能是因为线程管理进入list中时,必须需要同步安全的操作,找到对应的源代码如下:

public int addAppTask(@NonNull Activity activity, @NonNull Intent intent,
@Nullable TaskDescription description, @NonNull Bitmap thumbnail) {
Point size;
synchronized (this) {
ensureAppTaskThumbnailSizeLocked();
size = mAppTaskThumbnailSize;
}
final int tw = thumbnail.getWidth();
final int th = thumbnail.getHeight();
if (tw != size.x || th != size.y) {
Bitmap bm = Bitmap.createBitmap(size.x, size.y, thumbnail.getConfig()); // Use ScaleType.CENTER_CROP, except we leave the top edge at the top.
float scale;
float dx = 0, dy = 0;
if (tw * size.x > size.y * th) {
scale = (float) size.x / (float) th;
dx = (size.y - tw * scale) * 0.5f;
} else {
scale = (float) size.y / (float) tw;
dy = (size.x - th * scale) * 0.5f;
}
Matrix matrix = new Matrix();
matrix.setScale(scale, scale);
matrix.postTranslate((int) (dx + 0.5f), 0); Canvas canvas = new Canvas(bm);
canvas.drawBitmap(thumbnail, matrix, null);
canvas.setBitmap(null); thumbnail = bm;
}
if (description == null) {
description = new TaskDescription();
}
try {
return ActivityManagerNative.getDefault().addAppTask(activity.getActivityToken(),
intent, description, thumbnail);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}

 

android 判断应用是否在前台显示的更多相关文章

  1. Android判断App是否在前台运行(转)

    原文地址: http://blog.csdn.net/zuolongsnail/article/details/8168689 Android开发中,有时候需要判断App是否在前台运行. 代码实现如下 ...

  2. Android 判断app是否在前台运行

    <!-- 前台还是后台 --> <uses-permission android:name="android.permission.GET_TASKS" /> ...

  3. Android判断App是否在前台运行

    版权声明:本文为博主原创文章,未经博主允许不得转载. //当前应用是否处于前台 private boolean isForeground(Context context) { if (context ...

  4. Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)

    Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...

  5. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  6. RomUtil【Android判断手机ROM,用于判断手机机型】

    参考资料 Android判断手机ROM 正文 有时候需要判断手机系统的ROM,检测ROM是MIUI.EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件查找是否有对应属性 ...

  7. Android判断用户的网络类型(2/3/4G、wifi)

    很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑.但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下. 一加手机一代,移动4G 网络,得到的subtype类型值为17 ...

  8. MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)

    在2.1.栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟. 其实只要在NuGet中安装两个包(Microsoft. ...

  9. MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示

    上次创建了栏目模型,这次主要做栏目的前台显示.涉及到数据存储层.业务逻辑层和Web层.用到了迁移,更新数据库和注入的一些内容. 一.添加数据存储层 1.添加Ninesky.DataLibrary(与上 ...

随机推荐

  1. 对象在hibernate中的状态

    首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load() ...

  2. CORS跨域模型浅析及常见理解误区分析

    CORS跨域资源共享是前后端跨域十分常用的一种方案,主要依赖Access-Control-Allow(ACA)系列header来实现一种协商性的跨域交互. 基本模型 其中的具体流程大致可以分为以下几步 ...

  3. Linux系统 开通防火墙端口

    Redhat 7内核 Linux系统  开通防火墙端口 使用systemctl 1.查看防火墙状态,root用户登录,执行命令systemctl status firewalld 2.开启防火墙:sy ...

  4. P3565 [POI2014]HOT-Hotels

    题目描述 There are nn towns in Byteotia, connected with only n-1n−1 roads. Each road directly links two ...

  5. virtualbox+vagrant学习-2(command cli)-21-vagrant up命令

    Up 格式: vagrant up [options] [name|id] 这个命令根据你的Vagrantfile文件创建和配置客户机. 这是“vagrant”中最重要的一个命令,因为它是创建任何va ...

  6. Python django 404页面配置和debug=false 静态文件配置 django版本1.10.5

    django设置404页面 1.设置settings文件 DEBUG = False ALLOWED_HOSTS = ['127.0.0.1', 'localhost']或者 ALLOWED_HOST ...

  7. PAT乙级1008

    1008 数组元素循环右移问题 (20 分)   一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A ...

  8. iptables传输数据包的过程

    IPTABLES传输数据包的过程 大概过程如图所示: 1. 数据包进入网卡时,首先进入PREROUTING链,linux内核会判断数据包的目的IP是否为本地主机 2. 如果数据包的目的IP是本地主机, ...

  9. 一些适合初学者的C/C++语言开发环境(IDE)

    对于很多初学C语言的人来说,第一个开发环境应该都是VC6.0(没办法的事,很多高校都用VC6),在以前VC6确实是比较适合用来进行C/C++的学习. 但现在VC6已经不适合当前的环境了,更不适合新手. ...

  10. WPF 事件触发命令

    方法一使用mvvmlight: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Int ...