安卓开发学习周四篇——Android的事件处理机制

   上一节我们学习的是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相对来说是最难处理的,同学们可以自己去找相关课程来学习。


登录或注册后发布评论