前言
最近任务需求,特殊模式下任务管理界面 不能打开某个APK
任务分析
任务管理界面下单个task的onClick或者onTouch
首先找到Recents 源码 位于systemui 中
这里我们直接打开RecentsActivity.java 文件
在RecentsActivity 的oncreate中发现setContentView为recents资源文件
这里我们看到代码及注释,说明是一个自定义view - RecentsView
我们可以看到RecentsView是继承 FrameLayout的一个自定义View
RecentsView 中 有三个view 一个TaskStackView 两个Textview
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 发现
TaskStackViewTouchHandler 这个应该是和Touch事件有关,因此我们进入 TaskStackViewTouchHandler中
可以看到上面的注释 说明它是 处理TaskStackView 触摸事件的类
TaskStackViewTouchHandler 中有onInterceptTouchEvent和onTouchEvent 看到它都调用到了 handleTouchEvent
下面是整个handleTouchEvent的代码
private boolean handleTouchEven