所有的android事件,都是通过底层驱动将事件整理成Message放入到相应的MessageQueue,再通过Looper来分发,最终到达控件或者Activity的监听器或者事件处理函数。
基于监听的事件处理
为组件绑定特定的事件监听器。View.setOnClickListener(OnClickListener);
Event Source\ Event\ Event Listener
1)内部类做监听器类
2)外部类做监听器类
3)Activity做事件监听器
4)匿名内部类做事件监听器
5)直接绑定到标签 android:onClick
基于回调的事件处理
重写组件特定的回调方法,或者重写Activity的回调方法。
基于回调的事件处理模型,事件源和事件监听器是统一的,事件源本身负责处理事件。
基于回调的事件处理机制可通过自定义View实现,自定义View时重写该View的事件处理方法即可。
事件处理方法返回true,表示该处理方法已经完全处理该事件,事件不会继续传播;
返回false,表示该处理方法并未完全处理该事件,事件会继续传播出去。
事件传递顺序:
先到监听器,然后是组件的事件回调(这里有ViewGroup的onInterceptTouchEvent等复杂的传递),然后是Activity的事件回调。
基于监听的事件处理模型更有优势:1)事件源和监听器分开,更明确的分工;2)优先出发监听器。
响应系统设置的事件:
Configuration类描述手机设备的配置信息,通过Activity.getResources().getConfiguration();获取。
通过访问其属性可以得到各种配置。
Activity.onConfiurationChanged(),监听系统配置变化的事件。
Handler \MessageQueue \Looper \Message
Handler的作用:1.发送消息;2.处理消息。
Handler发送消息是发送到指定的MessageQueue;Looper读取MessageQueue的消息,然后交给发送该消息的Handler处理。
每个线程只能有一个Looper以及配套的一个MessageQueue,在Looper的构造过程中会初始化MessageQueue。
UI线程种已经初始化了一个 Looper 和MessageQueue,因此我们可以直接写Handler处理消息即可。
用户新建的线程则需要初始化Looper,并启动它。
1)Looper.prepare();
2) 创建Handler,并重写handleMessage。
3) Looper.loop();
发送消息调用Handler.sendMessage(Message);等相关函数。
MessageQueue中有一个Message mMessage;的成员,应该是队列的头,
每个Message中有一个Message next;的成员,指向下一个消息。
Handler发送消息的详细过程?
Handler.sendMessage(Message msg);
Handler.sendMessageDelayed(Message msg, long delayMillis);
Handler.sendMessageAtTime(Message msg, long uptimeMillis);
private Handler.enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis);
在其中把当前Handler的this赋给msg的target.然后将消息插入队列,
private MessageQueue.enqueueMessage(Message msg, long when);
Looper分发Message的方式?
Message有个Handler target的私有成员。
Looper在loop()中,不断从MessageQueue取消息出来(调用MessageQueue.next()),
然后调用Message中Handler target的dispatchMessage()分发消息。
而Handler. dispatchMessage()判断有没有回调函数CallBack,若无则直接调用Handler的handleMessage().
其中handleMessage()是接口类CallBack的一个接口,用户必须实现。
异步任务
AsyncTask将耗时操作丢给后台线程去操作。
1)创建AsyncTask子类,并指定其参数类型。
2) 重写必要的方法,doInBackGround\onProgressUpdate\onPreExecute\onPostExecute
3) 调用AsyncTask子类实例的execute()方法。