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(); } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android ViewPager和PagerAdapter简单代码写法
Android ViewPager和PagerAdapter简单代码写法 总是忘记,记下来备忘: package zhangphil.test; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.util.ArrayList; public class ViewPagerActivity extends AppCompatActivity { p...
- 下一篇
Android如何创建自己的第三方库
本章将告诉你如何创建自己的第三方库 创建库 准备: 1. github账号 2. Android Studio 3. git版本控制工具 一,打开AndroidStudio,File->New->New Project 打开AndroidStudio 二,创建Library 创建Library AndroidLibrary 三,添加类,然后写一个加法的工具类 添加工具类 工具类 四,进行Git配置 进行Git配置 五,GitHub配置 GitHub配置 六,创建git仓库(这时候文件会变成红色因为文件未被提交) 创建git仓库 选择project 七,将文件加入到仓库(一般选择完会弹出这个对话框选yes),然后右键Git->add(最好在project视图下右键项目根目录) 八,上传到GitHub 上传 设置库名称 提交 九,推送到GitHub(其实在上一步完毕后它会自动推送上去的)推送过程中可能会让你登录账号 推送 十,登录GitHub查看 登录GitHub查看 十一,设置你的项目版本号 1514945644606_13.png 设置版本号 十二,打开https:/...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果