为了更好地理解Handler的工作原理,先介绍一下与Handler一起工作的几个组件。Message:Handler接收和处理的消息对象。Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读取到消息之后就把消息交给发送该消息的Handler进行处理。MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper对象时会在它的构造器中创建MessageQueue对象。Looper提供的构造器源代码如下: private Looper(boolean quitAllowed) { ... Read More
Handler类的主要作用有两个:在新启动的线程中发送消息。在主线程中获取、处理消息。 上面的说法很简单,只要分成两步即可:在新启动的线程中发送消息;然后在主线程上获取、并处理消息。但这个过程涉及一个问题:新启动的线程何时发送消息呢?主线程何时去获取并处理消息呢?这个时机显然不好控制。 为了让主程序能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现——开发者只要重写Handler类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断地从MessageQueue中获取并处理消息——这将导致Handler类... Read More
如果程序需要监听系统设置的更改,则可以考虑重写Activity的onConfigurationChanged(Configuration newConfig)方法,该方法是一个基于回调的事件处理方法;当系统设置发生改变时,该方法会被自动触发。 为了在程序中动态地更改系统设置,我们可调用Activity的setRequestedOrientation(int)方法来修改屏幕方向。 实例:监听屏幕方向改变 该实例的界面布局很简单,该界面中仅包含一个普通按钮。其界面布局文件如下:该程序的Java代码主要会调用Activity的setRequestedOrientation(int)... Read More
Configuration类专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括系统的动态设置配置。程序可调用Activity的如下方法来获取系统的Configuration对象:Configuration cfg=getResources().getConfiguration(); 一旦获得了系统的Configuration对象,该对象提供了如下常用属性来获取系统的配置信息。public float fontScale:获取当前用户设置的字体的缩放因子。public int keyboard:获取当前设备所关联的键盘类型。该属性可能返回如下值:KEYBOARD_NO. Read More
对于Android提供的事件处理模型,不难发现基于监听的事件处理模型具有更大的优势:基于监听的事件模型分工更加明确,事件源、事件监听有两个类分开实现,因此具有更好的维护性。Android的事件处理机制保证基于基于监听的事件监听器会被优先触发。实例:通过回调实现跟随手指的小球 在某些特定情况下,基于回调的事件处理机制会更好地提高程序的内聚性,例如上一章的实例;跟随手指的小球,如果改为基于回调的实现,可以更好的提高程序的内聚性。 例如将该实例中的DrawView类改为如下形式。package com.example.studyevent;import java.text.AttributedCha Read More
几乎所有基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件:如果处理事件的回调方法返回true,表明该处理方法以完全处理该事件,该事件不会传播出去。如果处理事件的回调方法返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。 对于基于回调的事件传播而言,某组件上所发生的事件不仅激发该组件上的回调方法,也会触发该组件所在Activity的回调用法——只要事件能传播到该Activiy。 下面的一个程序示范了Android系统中的事件传播,该程序重写了Button类的onKeyDown(int keyCode,KeyEvent e. Read More
如果说事件监听机制是一种委托式的事件处理,那么回调机制则恰好与之相反;对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。 为了使用回调机制类处理GUI组件上所发生的事件,我们需要为该组件提供对应的事件处理方法——而Java又是一种静态语言,我们无法为某个对象动态的添加方法,因此只能继承GUI组件类,并重写该类的事件处理方法来实现。 为了实现回调机制的事件处理,Android为所有GUI组件都提供了一些事件处理的回调方法,以View为例,该类包含如下方法。boolean onKeyD. Read More