第3章 Android的事件处理

    与界面编程紧密相关的就是事件处理了,因此本章知识与上一章的内容衔接的非常紧密。Android提供两种方式的事件处理,基于监听的事件处理和基于回调的事件处理,这章书还介绍了Handler和AsyncTask,实际上Handler消息传递机制是另一种形式的“事件处理”。。最后书本一直强调一个东西:尽量避免在UI线程中执行耗时操作,否则可能会导致ANR异常。
先上图!

                    事件处理示意图
        
【知识点】
·外部类形式作为事件监听器类:
    某个时间监听器确实需要被多个GUI界面所共享,主要是完成某种业务逻辑的实现才考考虑使用外部类的形式来定义事件监听器类,一般会采用内部类,使用内部类可以在当前类中复用该监听器类,还可以自由访问外部类的所有界面组件。
·不推荐将业务逻辑实现写在事件监听器中,包含业务逻辑的事件监听器将导致程序的显示逻辑和业务逻辑耦合,从而增加程序后期的维护难度,可以考虑使用业务逻辑组件来定义业务逻辑功能,再让事件监听器来调用业务逻辑组件的业务逻辑方法。
·Android直接在界面布局文件中为指定标签绑定事件处理方法如:android:onClick="clickHandler",这样就意味着开发者需要在该界面布局对应的Activity中定义一个void clickHandler(View source),该方法将会处理该按钮上的单击事件。
·基于回调的事件传播
    当组件上发生某个按键被按下的事件时,Android系统触发顺序:触发该按键上绑定的事件监听器-->触发该组件提供的事件回调方法-->传播到该组件所在的Activity。如果让任何一个事件处理方法返回了true,那么该事件就不会继续向外传播。
·Configuration类
    专门描述手机设备上的配置信息,既包括用户特定的配置项,也包括系统的动态设备配置。程序可调用Activity的如下方法来获取系统的Configuration对象:
        Configuration cfg = getResources().getConfiguration();
    如果要监听系统设置的更改,可重写Activity的onConfigurationChanged(Configuration newConfig)方法,该方法基于回调,配置该Activity指定的android:configurationChanges来确定该Activity可以具体监听哪种事件。
·Looper、MessageQueue、Handler各自的作用
    Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理。
    MessageQueue:由Looper负责管理,采用先进先出的方式来管理Message。
    Handler:把消息发送给MessageQueue,并负责处理Looper分给它的消息。
·在线程中使用Handler的步骤
    ①调用Looper的perpare()方法为当前线程创建Looper对象;
    ②创建Handler子类的实例,重写handlerMessage()方法,该方法负责处理来自于其他线程的消息;
    ③调用Looper的loop()方法启动Looper。

【问题】给书本一些地方做些批注
·问:书中有一处强调,只要在AndroidManifest.xml文件中对activity指定android:configChanges="orientation"属性,转屏的时候就会不再重新调用OnCreate()函数,而是调用onConfigurationChanged(),但是android:targetSdkVersion属性最高只能设置12,否则onConfigurationChanged()方法不会被激发,为什么?
  答:书的作者还是很细心的,查阅网上资料后才知道,自从android3.2(版本号为13)以后,再这样设置的话,会发现转屏后仍然会调用OnCreate(),而不是onConfigurationChanged();跟踪framework层代码,就会发现问题所在,是由于google在android3.2中添加了screensize改变的通知,在转屏的时候,不仅是orientation发生了改变,screensize同样也发生了改变,需要重新指定android:configChanges="orientation|screenSize

·问:ANR?
  答:ANR就是Application Not Responding的全称,当某个应用处于长期假死状态时Android系统会弹出一个窗口上面写道,XXX is not responding给出两个按钮一个为force close一个为wait。在Android里,应用程序的响应性是由Activity Manager和Window Manager系统服务监视的。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:
    在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
    BroadcastReceiver在10秒内没有执行完毕。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。