recents.java_解析Android 8.0中SystemUI Recents的task是如何启动的

本文深入解析Android 8.0中SystemUI的Recents任务启动过程,从RecentsActivity.java开始,逐步剖析RecentsView、TaskStackViewTouchHandler,揭示任务管理界面点击任务时的处理逻辑,最终定位到启动任务的关键代码ssp.startActivityFromRecents。
摘要由CSDN通过智能技术生成

前言

最近任务需求,特殊模式下任务管理界面 不能打开某个APK

任务分析

任务管理界面下单个task的onClick或者onTouch

首先找到Recents 源码 位于systemui 中

807ed8dfdf5550525302f4a61c388c43.png

这里我们直接打开RecentsActivity.java 文件

3edd0b3545bace01f74a2e0b9b4befde.png

在RecentsActivity 的oncreate中发现setContentView为recents资源文件

ad20f4baca5af54d4c37383f6783ffe0.png

这里我们看到代码及注释,说明是一个自定义view - RecentsView

我们可以看到RecentsView是继承 FrameLayout的一个自定义View

RecentsView 中 有三个view 一个TaskStackView 两个Textview

985f991ce83e9b5483b8b5899e2164e6.png

public RecentsView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {

super(context, attrs, defStyleAttr, defStyleRes);

setWillNotDraw(false);

SystemServicesProxy ssp = Recents.getSystemServices();

mTransitionHelper = new RecentsTransitionHelper(getContext());

mDividerSize = ssp.getDockedDividerSize(context);

mTouchHandler = new RecentsViewTouchHandler(this);

mFlingAnimationUtils = new FlingAnimationUtils(context, 0.3f);

mScrimAlpha = Recents.getConfiguration().isGridEnabled

? GRID_LAYOUT_SCRIM_ALPHA : DEFAULT_SCRIM_ALPHA;

mBackgroundScrim = new ColorDrawable(

Color.argb((int) (mScrimAlpha * 255), 0, 0, 0)).mutate();

LayoutInflater inflater = LayoutInflater.from(context);

if (RecentsDebugFlags.Static.EnableStackActionButton) {

mStackActionButton = (TextView) inflater.inflate(R.layout.recents_stack_action_button,

this, false);

mStackActionButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

EventBus.getDefault().send(new DismissAllTaskViewsEvent());

}

});

addView(mStackActionButton);

}

mEmptyView = (TextView) inflater.inflate(R.layout.recents_empty, this, false);

addView(mEmptyView);

}

mStackActionButton即全部清除按钮,mEmptyView 即当TaskStack(Task的集合) 数量为空时显示的TextView,因此我们平时见到的APP的任务管理应该是在TaskStackView中的

然后分析TaskStackView 发现

e23340766449d60c3711d3f1bbace675.png

TaskStackViewTouchHandler 这个应该是和Touch事件有关,因此我们进入 TaskStackViewTouchHandler中

a4f56698fd97f1d155b7257bba6307db.png

可以看到上面的注释  说明它是 处理TaskStackView 触摸事件的类

TaskStackViewTouchHandler 中有onInterceptTouchEvent和onTouchEvent 看到它都调用到了 handleTouchEvent

887509efe50ae4e0e0353e36fa40cb00.png

下面是整个handleTouchEvent的代码

private boolean handleTouchEven

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值