欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

第3章 Android的事件处理

来源: 开发者 投稿于  被查看 41696 次 评论:33

第3章 Android的事件处理


与界面编程紧密相关的就是事件处理了,因此本章知识与上一章的内容衔接的非常紧密。Android提供两种方式的事件处理,基于监听的事件处理和基于回调的事件处理,这章书还介绍了Handler和AsyncTask,实际上Handler消息传递机制是另一种形式的“事件处理”。。最后书本一直强调一个东西:尽量避免在UI线程中执行耗时操作,否则可能会导致ANR异常。 先上图! \ \
事件处理示意图 \vcC0tqjS5crCvP684Mz9xvfA4KOs0ruw47vhssnTw8Tasr/A4KOsyrnTw8Tasr/A4L/J0tTU2rWxx7DA4NbQuLTTw7jDvODM/cb3wOCjrLu5v8nS1NfU08m3w87KzeKyv8DgtcTL+dPQvefD5tfpvP6howqhpLK7zca89r2r0rXO8cLfvK3Ktc/W0LTU2srCvP684Mz9xvfW0KOssPy6rNK1zvHC37yttcTKwrz+vODM/cb3vau1vNbCs8zQ8rXEz9TKvsLfvK26zdK1zvHC37yt8e66z6OstNO2+NT2vNOzzNDyuvPG2rXEzqy7pMTRtsijrL/J0tS/vMLHyrnTw9K1zvHC37yt1+m8/sC0tqjS5dK1zvHC37ytuabE3KOs1NnIw8rCvP684Mz9xvfAtLX308PStc7xwt+8rdfpvP61xNK1zvHC37ytt723qKGjCqGkQW5kcm9pZNaxvdPU2r3nw+ayvL7WzsS8/tbQzqrWuLaoserHqbDztqjKwrz+tKbA7be9t6ijrMjno7phbmRyb2lkOm9uQ2xpY2s9"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秒内没有执行完毕。

用户评论