上一节我们学习的是Android的UI控件,我们可以利用这些控件构成一个精美的界面,但是仅仅是界面而已。下一步就要开始学习逻辑与业务实现了,本小节讲解的是Android的事件处理机制!
1、 基于监听的事件处理机制
1.1基于监听的时间处理机制模型:
流程模型图:
1.2五种不同的使用形式
我们以下面这个:简单的按钮点击,提示Toast信息的程序;使用五种不同的形式来实现!
1) 直接用匿名内部类
2) 使用内部类
3) 使用外部类
4) 直接使用Activity作为事件监听器
5) 直接绑定到标签
2、Android回调的事件处理机制详解:
在Android中基于回调的事件处理机制使用场景有两个:自定义view和基于回调的事件传播。
2.1 自定义view
当用户在GUI组件上激发某个事件时,组件有自己特定的方法会负责处理该事件。通常用法是①继承基本的GUI组件②重写该组件的事件处理方法,即自定义view。
常见View组件的回调方法:
①在该组件上触发屏幕事件: boolean onTouchEvent(MotionEvent event);
②在该组件上按下某个按钮时:boolean onKeyDown(int keyCode,KeyEvent event);
③松开组件上的某个按钮时: boolean onKeyUp(int keyCode,KeyEvent event);
④长按组件某个按钮时: boolean onKeyLongPress(int keyCode,KeyEvent event);
⑤键盘快捷键事件发生: boolean onKeyShortcut(int keyCode,KeyEvent event);
⑥在组件上触发轨迹球屏事件: boolean onTrackballEvent(MotionEvent event);
⑦当组件的焦点发生改变,和前面的6个不同,这个方法只能够在View中重写哦! protected void onFocusChanged(boolean gainFocus, int direction, Rect previously FocusedRect)
2.2 基于回调的事件传播
以上是对Android事件处理机制中的基于回调的事件处理机制进行了讲解。核心就是事件传播的顺序,然后到View组件自身,最后再到Activity;返回值false继续传播,true终止传播!
3、Handler消息传递机制浅析
Android为了线程安全,并不允许我们在UI线程外操作UI;很多时候我们做界面刷新都需要通过Handler来通知UI组件更新!
Handler的执行流程图:
- UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue;
- Handler:作用就是发送与处理信息,如果希望Handler正常工作,在当前线程中要有一个Looper对象
- Message:Handler接收与处理的消息对象
- MessageQueue:消息队列,先进先出管理Message,在初始化Looper对象时会创建一个与之关联的MessageQueue;
- Looper:每个线程只能够有一个Looper,管理MessageQueue,不断地从中取出Message分发给对应的Handler处理!
4.Handler的相关方法:
void handleMessage(Message msg):处理消息的方法,通常是用于被重写!
sendEmptyMessage(int what):发送空消息
sendEmptyMessageDelayed(int what,long delayMillis):指定延时多少毫秒后发送空信息
sendMessage(Message msg):立即发送信息
sendMessageDelayed(Message msg):指定延时多少毫秒后发送信息
final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息 。
5.Handler的使用示例:
5.1 Handler写在主线程中
在主线程中,因为系统已经初始化了一个Looper对象,所以我们直接创建Handler对象,就可以进行信息的发送与处理了!
5.2 Handler写在子线程中
如果是Handler写在了子线程中的话,我们就需要自己创建一个Looper对象了!创建的流程如下:
a 直接调用Looper.prepare()方法即可为当前线程创建Looper对象,而它的构造器会创建配套的MessageQueue。
b 创建Handler对象,重写handleMessage( )方法就可以处理来自于其他线程的信息了!
c 调用Looper.loop()方法启动Looper.
6、响应系统设置的事件(Configuration类)
6.1.Configuration给我们提供的方法列表
- densityDpi:屏幕密度
- fontScale:当前用户设置的字体的缩放因子
- hardKeyboardHidden:判断硬键盘是否可见,有两个可选值:HARDKEYBOARDHIDDEN_NO,
- HARDKEYBOARDHIDDEN_YES,分别是十六进制的0和1。
- keyboard:获取当前关联额键盘类型:该属性的返回值:KEYBOARD_12KEY(只有12个键的小键盘)、KEYBOARD_NOKEYS、KEYBOARD_QWERTY(普通键盘)
- keyboardHidden:该属性返回一个boolean值用于标识当前键盘是否可用。该属性不仅会判断系统的硬件键盘,也会判断系统的软键盘(位于屏幕)。
- locale:获取用户当前的语言环境
- mcc:获取移动信号的国家码
- mnc:获取移动信号的网络码
- ps:国家代码和网络代码共同确定当前手机网络运营商
- navigation:判断系统上方向导航设备的类型。该属性的返回值:NAVIGATION_NONAV(无导航)、 NAVIGATION_DPAD(DPAD导航)NAVIGATION_TRACKBALL(轨迹球导航)、NAVIGATION_WHEEL(滚轮导航)
- orientation:获取系统屏幕的方向。该属性的返回值:ORIENTATION_LANDSCAPE(横向屏幕)、ORIENTATION_PORTRAIT(竖向屏幕)
- screenHeightDp,screenWidthDp:屏幕可用高和宽,用dp表示
以上内容就是安卓事件处理机制,其实谈到android事件处理,最复杂的就是对Touch事件的处理,因为Touch事件包括:down, move, up, cancle和多点触摸等多种情况,多点触摸的情况先不讨论,因为Touch有这么多的状态,所以Touch相对来说是最难处理的,同学们可以自己去找相关课程来学习。
学习,学习!