Android重难点解析
  • 前言
  • Handler机制
    • Handler、Looper、MessageQueue的关系是什么?
    • Looper、Thread、ThreadLoacal的关系是什么?
    • Message如何被分发到Handler.handlerMessage()?
    • Message是如何实现复用的?
    • FrameWork中哪些模块用到了Handler机制?
    • 使用Handler的正确姿势是什么?
    • 总结
  • Activity机制
    • Launcher是如何实现开启一个App的?
    • Activity在各种状态下的生命周期
    • Activity与Window是什么关系?
    • setContentView()之后是如何实现界面显示的?
  • View机制
    • ViewGroup和子View在测量、布局、绘制的先后顺序是什么?
    • 从startActivity()到UI对用户可见的过程中发生了什么事情?
    • Touch事件分发机制
  • 异步机制
    • AsyncTask的版本变更之谜
    • AsyncTask的实现原理
    • Picasso是如何实现异步加载图片的?
    • HandlerThread和IntentService
  • 内存管理机制
    • 如何防止发生内存泄露?
    • 如何发现内存泄露?
    • Java内存回收机制
    • 如何防止OOM?
  • Java基础
    • 线程同步
  • Android系统机制
    • zygote是什么
    • SystemServer是什么?
    • ActivityManagerService是什么?有什么作用?
    • App的主线程消息队列是何时建立的?
    • 为什么选择Binder作为Android的进程间通讯方式?
  • WebView机制
    • 如何避免WebView造成的内存泄露?
  • 数据持久化机制
    • ContentProvider的权限控制
    • ContentProvider的CRUL操作为什么需要线程同步?
    • 文件缓存应该放在哪里?
    • SharedPreferences在使用时有哪些注意事项?
    • 如何优化Sqlite数据库的操作?
  • Fragment机制
    • 如何解决Fragment重叠的问题?
    • Fragment的完整生命周期
  • Framework重难点
    • 如何理解Zygote和ServerManager这两个进程?
  • 单元测试
    • 为什么写单元测试?
Powered by GitBook
On this page
  • Touch事件的整体传递轨迹
  • 参与Touch事件传递的角色及对应方法
  • Activity
  • Window(PhoneWindow)
  • View
  • ViewGroup

Was this helpful?

  1. View机制

Touch事件分发机制

Touch事件的整体传递轨迹

硬件传感器->System Server->Activity->Window->DecorView->内部ViewGroup和View

参与Touch事件传递的角色及对应方法

Activity

Activity中与Touch事件传递相关的事件如下:

  • public boolean dispatchTouchEvent(MotionEvent ev)

  • public boolean onTouchEvent(MotionEvent event)

  • public void onUserInteraction()

dispatchTouchEvent()可以认为是Touch事件在App中传递的第一站,从这里开始,Touch事件就开始进入到传递的轨道上了。该方法的返回值取决于Activity布局内部所有的View及ViewGroup是否处理Touch事件以及自身的onTouchEvent()的返回值,这一点可以在源码中得到解答.

public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

当Activity布局处理Touch事件时,返回true,否则返回值就依赖于Activity.onTouchEvent()。

另外还有一个不太常见的方法,就是onUserInteraction,当Touch事件是ACTION_DOWN时,便会触发一次。其实onUserInteraction不只是在Touch事件中被调用,Back按钮点击,轨迹球滚动和Touch事件都会触发这个回调方法。

当我们不想Touch事件在当前Activity中传递时应该怎么做呢?很简单,我们只需要重写dispatchTouchEvent(),不去调用super.dispatchTouchEvent()即可阻止Touch事件在当前Activity的传递,如下,这样这个Activity就再也处理不了Touch事件啦!他被我给废了!

public class NoTouchActivity extends Activity {

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return false;
    }

当然,一般情况下我们不需要对Activity的这些方法做任何处理,这样伤害太大啦~

Window(PhoneWindow)

  • public boolean superDispatchTouchEvent(MotionEvent ev)

View

  • dispatchTouchEvent()

  • onTouchEvent()

ViewGroup

  • dispatchTouchEvent()

  • onInterceptTouchEvent()

  • onTouchEvent()

Previous从startActivity()到UI对用户可见的过程中发生了什么事情?Next异步机制

Last updated 6 years ago

Was this helpful?