我们在android手机长按HOME键,会弹出一个近期任务栏。近期任务栏会显示你访问过的app的截图。

实现过程分为如下几步:

Activiyty开始pause时截图

    final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, boolean resuming,boolean dontWait) {if (mPausingActivity != null) {Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity);completePauseLocked(false);}ActivityRecord prev = mResumedActivity;if (prev == null) {if (!resuming) {Slog.wtf(TAG, "Trying to pause when nothing is resumed");mStackSupervisor.resumeTopActivitiesLocked();}return false;}if (mActivityContainer.mParentActivity == null) {// Top level stack, not a child. Look for child stacks.mStackSupervisor.pauseChildStacks(prev, userLeaving, uiSleeping, resuming, dontWait);}if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev);else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev);mResumedActivity = null;mPausingActivity = prev;mLastPausedActivity = prev;mLastNoHistoryActivity = (prev.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_HISTORY) != 0|| (prev.info.flags & ActivityInfo.FLAG_NO_HISTORY) != 0 ? prev : null;prev.state = ActivityState.PAUSING;prev.task.touchActiveTime();clearLaunchTime(prev);final ActivityRecord next = mStackSupervisor.topRunningActivityLocked();if (mService.mHasRecents && (next == null || next.noDisplay || next.task != prev.task || uiSleeping)) {prev.updateThumbnailLocked(screenshotActivities(prev), null);}

代码路径:frameworks\base\services\core\java\com\android\server\am\ActivityStack.java

上述代码中有两个主要的函数:

1)prev.updateThumbnailLocked  用于更新Activity的缩略图,即在近期任务栏看到的缩略图

2)screenshotActivities  用于截图

先分析screenshotActivities

   public final Bitmap screenshotActivities(ActivityRecord who) {if (DEBUG_SCREENSHOTS) Slog.d(TAG, "screenshotActivities: " + who);if (who.noDisplay) {if (DEBUG_SCREENSHOTS) Slog.d(TAG, "\tNo display");return null;}if (isHomeStack()) {// This is an optimization -- since we never show Home or Recents within Recents itself,// we can just go ahead and skip taking the screenshot if this is the home stack.if (DEBUG_SCREENSHOTS) Slog.d(TAG, "\tHome stack");return null;}int w = mService.mThumbnailWidth;int h = mService.mThumbnailHeight;if (w > 0) {if (DEBUG_SCREENSHOTS) Slog.d(TAG, "\tTaking screenshot");return mWindowManager.screenshotApplications(who.appToken, Display.DEFAULT_DISPLAY,w, h, SCREENSHOT_FORCE_565);}Slog.e(TAG, "Invalid thumbnail dimensions: " + w + "x" + h);return null;}

代码路径:frameworks\base\services\core\java\com\android\server\am\ActivityStack.java

截图调用的是WindowManagerService的screenShotApplications。

 public Bitmap screenshotApplications(IBinder appToken, int displayId, int width,int height, boolean force565) {if (!checkCallingPermission(Manifest.permission.READ_FRAME_BUFFER,"screenshotApplications()")) {throw new SecurityException("Requires READ_FRAME_BUFFER permission");}final DisplayContent displayContent = getDisplayContentLocked(displayId);
....
  bm = SurfaceControl.screenshot(crop, width, height, minLayer, maxLayer,
inRotation, rot);

截图最终call到SurfaceControl.screenshot函数。

另外一个函数:

   void updateThumbnailLocked(Bitmap newThumbnail, CharSequence description) {if (newThumbnail != null) {if (ActivityManagerService.DEBUG_THUMBNAILS) Slog.i(ActivityManagerService.TAG,"Setting thumbnail of " + this + " to " + newThumbnail);boolean thumbnailUpdated = task.setLastThumbnail(newThumbnail);if (thumbnailUpdated && isPersistable()) {mStackSupervisor.mService.notifyTaskPersisterLocked(task, false);}}task.lastDescription = description;}

代码路径:frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java

逻辑比较简单,不在描述。

android近期任务栏图片生成过程相关推荐

  1. android自适应拉伸图片,Android 启动页-解决图片被拉伸和压缩问题,适配虚拟导航栏...

    Android 启动页设置非常简单 //styles.xml 设置主题 @drawable/bg_splash true //activity使用主题,这时点击app图标,就会显示@drawable/ ...

  2. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  3. Android底部导航栏切换页面填坑

    ** Android底部导航栏切换页面填坑 ** 这个效果的实现关键点就是给选项赋予两种状态,focused和normal,在主程序中用监听判断是否被选中,就给被选中的选项设focused为true, ...

  4. Android中导航栏之搜索框SearchView

    Toolbar系列文章导航 Android中导航栏之Toolbar的使用 Android中导航栏之溢出菜单OverflowMenu Android中导航栏之搜索框SearchView Android中 ...

  5. Android底部导航栏+消息提醒

    Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...

  6. android 标题导航栏,NavigationBar

    标题导航栏,两三句代码即可实现 XML 布局: android:id="@+id/bar" android:layout_width="match_parent" ...

  7. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  8. 关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片

    2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap  bm = BitmapFacto ...

  9. android 代码获取图片信息吗,Android 通过网络获取图片的代码

    Android 通过网络获取图片的代码 主activity package com.netimg; import android.app.Activity; import android.graphi ...

最新文章

  1. Vue.js项目构建
  2. Flash与组件:国外收费组件网站
  3. 【Python】 dict 以key名 去重运算
  4. 【Flink】Flink Not all required tasks are currently running
  5. microsoft mysql下载_MySQL下载与安装+Jmeter
  6. 计算机学科技术前沿:云计算主要平台及特性
  7. 线索二叉树是一种什么结构_技术面试之常用的数据结构
  8. 【转帖】MATLAB中用FDATool设计滤波器及使用
  9. 【HANA系列】SAP HANA SQL获取字符串长度
  10. Nginx的安装、启动、停止命令
  11. MySQL数据库基础教程(视频)
  12. java 合并两个有序数组
  13. mysql套接字连接_无法通过Remote上的套接字连接到本地MySQL服务器
  14. 循环小题题库存档(期末复习)
  15. JS实现一个打点计时器
  16. 【寻找最佳小程序】03期:摩拜单车小程序——联合微信团队打造,实现不换码一扫即用...
  17. ad17编辑界面怎么检查未连线_EZCast投屏软件提示未发现装置,请检查网路连线状态怎么办?...
  18. 腾讯地图中轻松定义多边形
  19. 【贪心】加勒比海盗船-最优装载问题
  20. 【计算机网络】实验2:常见网络命令操作

热门文章

  1. python tkinter Entry的使用
  2. java 抽象类和接口——抽象类
  3. Protractor版本大事记
  4. MATLAB实现分支定界法求解整数规划
  5. 最常见的20道jQuery经典面试题
  6. 【分享】光模块PPT
  7. 职业照--蓝底照片转换为白底
  8. Hi3516芯片简介,Hi3516EV300处理器参数介绍
  9. Mybatis-Plus多表关联查询的使用
  10. tabindex标签的用法