android 判断应用是否在前台显示
在一些场景下我们需要知道应用是否在前台显示,当不在前台显示的时候,一些后台进程可以暂时停止,比如一些查询任务、不必要的线程、不需要的渲染等,以减少对设备资源的占用。判断应用是否在前台通常可以使用一下方式:
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 判断应用是否在前台显示的更多相关文章
- Android判断App是否在前台运行(转)
原文地址: http://blog.csdn.net/zuolongsnail/article/details/8168689 Android开发中,有时候需要判断App是否在前台运行. 代码实现如下 ...
- Android 判断app是否在前台运行
<!-- 前台还是后台 --> <uses-permission android:name="android.permission.GET_TASKS" /> ...
- Android判断App是否在前台运行
版权声明:本文为博主原创文章,未经博主允许不得转载. //当前应用是否处于前台 private boolean isForeground(Context context) { if (context ...
- Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)
Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- RomUtil【Android判断手机ROM,用于判断手机机型】
参考资料 Android判断手机ROM 正文 有时候需要判断手机系统的ROM,检测ROM是MIUI.EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件查找是否有对应属性 ...
- Android判断用户的网络类型(2/3/4G、wifi)
很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑.但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下. 一加手机一代,移动4G 网络,得到的subtype类型值为17 ...
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)
在2.1.栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟. 其实只要在NuGet中安装两个包(Microsoft. ...
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示
上次创建了栏目模型,这次主要做栏目的前台显示.涉及到数据存储层.业务逻辑层和Web层.用到了迁移,更新数据库和注入的一些内容. 一.添加数据存储层 1.添加Ninesky.DataLibrary(与上 ...
随机推荐
- September 24th 2017 Week 39th Sunday
To live is the rarest thing in the world. Most people exist. That is all. 生活是世间最罕见的事情:生存,却是世间最常见的事情: ...
- 结合领域驱动设计的SOA分布式软件架构
引言 本文主要是参考Martion Fowler所著的<企业应用架构模式>与Eric Evans所著的<领域驱动设计>这两本泰山之作,加上本人在近年实际的工作过程中开发SOA系 ...
- thinkphp导出csv文件,用表格输出excel
1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this ...
- print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, 返回None 则不是闭包
print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, None 则不是闭包
- 【0】如何在电脑中使用多个python版本【python虚拟环境配置】
问题: 该篇解决如何在同一个操作系统中可以便捷诶的使用多个python版本.有时候我们在开发的时候会同时需要python2 和python3环境,或者是需要不同的版本,都可以尽心如下配置. (1)在c ...
- 从0开始搭建Element项目
第一步:安装 Node.js/NPM 下载Node.js:https://nodejs.org/zh-cn/download/ 下载安装即可. 第二步:安装 vue-cli 打开 cmd 创建,在命令 ...
- exits, in, left join性能比较
exits in left join性能比较 ,笔者使用的是MYSQL数据库,这三个关键字方法在其他的关系数据库里也是大同小异,如果各种有兴趣,自行比较. 我这里有一个249_account 表,总 ...
- 【bzoj4543】[POI2014]Hotel加强版
题目 抄题解.jpg 发现原来的\(O(n^2)\)的换根\(dp\)好像行不通了呀 我们考虑非常牛逼的长链剖分 我们设\(f[x][j]\)表示在\(x\)的子树中距离\(x\)为\(j\)的点有多 ...
- [SDOI2014]LIS
这道题还是非常好的 首先第一问可以让我们联想到某网络流二十四题里的一道题,发现建图方式应该和这道题差不多啊 所以首先跑一遍\(dp\),求出\(dp[i]\)表示\(i\)位置结束的\(LIS\)长度 ...
- Hadoop学习之路(一)理论基础和逻辑思维
三个题目 第一题 问题描述 统计出当前这个一行一个IP的文件中,到底哪个IP出现的次数最多 解决思路 //必须要能读取这个内容 BufferedReader br = new BuffedReader ...