android recents 启动app,Android5.1-Recents分析

Android5.1-Recents分析

(2018-09-28 23:48:45)

? ?

Android使用RecentsActivity来展示最近使用过的app。至于此界面,不同品牌的Android智能手机,可能界面都会有所不一样。以Android

5.1的RecentsActivity界面为例,原始风格也跟以往的版本有一些不一样(如图),似乎比以往的界面都要炫酷一些。不过从Android

5.0开始,Recents就有了诸多变化,比如:Android4.4 在SystemUI中并没有Recents文件结构。 ? ? ?

? ? ? ? ? ? ? 要触发Recents界面,从目前的手机使用来看,大致可以分为两种: ? ?

1)长按HOME键触发Recents界面; ? ?

2)通过点击NavigationBar上的图标(也相当于一个键)来触发Recents界面。 ? ? ? ? ? ? ? ? ?

以长按HOME键触发Recents界面为例,来学习和分析Android5.1源码中Recents显示流程,同时也作为记录,方面以后参考。

? ?

Recents界面是个Activity,并且属于SystemUI,既然是属于SystemUI,那就是说Recents界面正常情况下都是在手机开机进入系统时就开始初始化。事实上也确实如此,在手机开机进入锁屏或者Launcher界面以后,触发Recents界面并不会执行onCreate()方法,只是执行onStart()方法。可见通常情况下RecentsActivity被隐藏起来了,这点,我刚开始时候也有点颠覆了我对activity的认知,不过经过后面看代码也就释然了,RecentsActivity是一个比较特殊的activity,framework层会对它做特殊处理:RecentsActivity在Manifest文件中是这么声明的:

?真是不同于常用的activity。 ?excludeFromRecents 属性表示: ? Indicates that an

Activity should be excluded from the list of recently launched

activities。(大致含义:表示此activity不会被列在Recents列表内) ?resumeWhilePausing

属性表示: ? Indicate that it is okay for this activity be resumed while

the previous activity is in the process of pausing, without waiting

for the previous pause to complete. Use this with caution: your

activity can not acquire any exclusive resources (such as opening

the camera or recording audio) when it launches, or it may conflict

with the previous activity and

fail.(大致含义:表示此activity能被Resume,尽管前一个activity仍在pause的过程中,不用等它pause完成,使用了此属性,在此activity启动的时候,不能得到任何独立资源(如照相机和录音等)...)。

?

RecentsActivity是如何被隐藏的?隐藏的时候会调用PhoneStatusBar.方法:?

? ?

通过View中的一个FLAG来控制它的visibility。不光如此,ActivityManagerService也会对它做特殊处理,管理Recents,大部分工作都是ActivityManagerService管理activity的TASK。ActivityRecord会对它做判断,与excludeFromRecents?属性相对应。

? ?

关于RecentsActivity先就了解这些,下面跟一下触发Recents的流程,流程用一张简约的流程图来描述可能更加直观一些。既然是长按HOME键来触发Recents,那么肯定是从framework层按键消息分发开始-PhoneWindowManager.;?

? ? ?

上面的流程图可能显得比较粗糙,但是大致可以看出触发Recents时先PreLoadRecents,完成以还要执行toggleRecentApps(),这个的流程跟上面图中基本一样。

都是通过AIDL远程通信,在SystemUI这边通过接口,实现对应的回调来完成。toggleRecentApps()最终会走到AlternateRecentsComponent.方法。

? ? 启动RecentsActivity,执行的是RecentsActivity的onStart()方法,其中比较重点是update

Recents task: ? ? 那么Recent应用展示界面存放在什么视图当中呢,这个要回到SystemUI

在开机初始化显示的时候执行RecentsActivity的onCreate方法,其布局文件为recents.xml,用来存放Recent?应用展示界面的View是RecentsView:?

? ? RecentsView里面又包含哪些东西:? ? ?

RecentsView包含TaskStackView,TaskStackView里面又包含什么: ?

TaskStackView里面包含TaskView,也就是说,在Recents界面有几个Recent

应用,就会有几个TaskView: ? ? ? ?

每一个TaskView包含的View(recents_task_view.xml):? ? ?

在这其中比较重要的是TaskViewThumbnail,因为它就是用来承载每个Recents

app缩略图的View,而对于recents_lock_to_app_pin这个新东西是从Android

L开始加进来的一个新功能--屏幕固定,在设置-安全中可以看到。视图有了,剩下就是把数据填充进去,而这部分逻辑要关注RecentsActivity被Resume之前的PreLoad和RecentsActivity

Resume时候的updateRecentsTasks()。这个就不赘述,只要晓得了整个流程的主要走向,就可以通过查看代码和debug查看数据来分析。

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值