应用的人机交互方式式有哪些

在教学活动中使用交互式电子白板进行创新的关键点是什么?_幼儿园计算机与多媒体教学_闪亮儿童网
当前位置:>>>内容
在教学活动中使用交互式电子白板进行创新的关键点是什么?
在教学活动中使用交互式电子白板进行创新的关键点是什么?,作为太仓市第一批电子白板培训班的学元,对白板的接触比其他同事多的多,当然感慨更是良多。很多觉得白板太为高端,太为复杂,特别是年纪稍大的老师有不少抵触情绪。这在很大程度上影响了电子白板在中的创新运用。
我想只有的观念更新,跟上技术革命的步伐,甚至是赶超技术的,我们才可以把信息技术革命进行到底。否则,技术无论更新到多好,多高层次,教师的思想观念仍旧是保守的,落后的,那么任何技术都将无法推进下去。送smart到普罗米修斯、鸿合再到东方中原,教培研开展各种各样的白板培训活动,这些培训涵盖了观念的更新,技术应用的熟练以及更多广义上的教学需求。
在 这个交互的时代,光光掌握交互式电子白板的使用还远远不够,更关键的是如何让技术与人结合,发挥最大化的效益,效益!我认为在教学活动中,借助电子白 板的创新使用,使老师和学生同时受益,这才是我们所期望的。所以在创新策略中,我们需要审视自己的设计,是否有有必要运用交互式电子白板?我们需要审核在 交互活动中是否以学生为主,老师的教学是否起到了引导作用?这些都是需要我们在教学活动开展前好好思考的。
最后,对于我们一线教师来说,最实在的一句话就是,白板已经进教室了,多研究,多使用,一定能更好的发挥电子白板在教学活动中的作用。
上一篇: 下一篇:
CopyRight ? , All Rights Reserved. 冀ICP备号资讯中心 NEWS CENTER
当前位置:&&&&&&
网站用户与界面的交互方式分析
(1)直接操作20世纪80年代以前,与计算机有关的操作方式都是间接操作。间接操作是用户使用命令、菜单、空间手势或语言命令等非数字对象的方式来改变对象,例如:在菜单里选择“全选”命令和在键盘上按“删除”键。而直接操作交互式概念由美国马里兰大学(University of Maryland)的计算机科学家本?施奈德曼(BenShneiderman) ?教授于1983年提出,指在操作过程中用户通过手指、鼠标或其他扩展意义的“手”选择并操作数字对象,如移动、旋转、拖拽等。该过程中,用户能模仿现实世界中的类似场景直接完成动作。例如:通过拖拽对象的一角来调节其尺寸大小,就像在拉伸它一样。软件界面设计师一般在设计前需要确定用户操作的交互方式是直接还是间接的,或是两者兼而有之。如今,几乎所有的智能手机移动互联网应用均采用直接操作的交互方式。这是由于直接操纵更符合用户直觉和习惯、更容易学习和使用,它将用户的经验直接映射到操作实践中。此外,智能手机、触屏技术的不断发展也为移动互联网应用的直接操作交互方式提供了有利的技术基础。虚拟现实②与增强现实?是直接操作交互方式的最新技术成果,促进了娱乐、游戏甚至工具类应用交互方式的发展。因此,设计师需要在对交互技术的充分理解基础上结合目标用户的需求和产品特点将直接操作的交互方式合理运用在移动互联网应用界面的交互设计中。在智能手机移动互联网应用界面交互设计中,采用直接操作的交互方式需要注意以下三点原则:①用一种令用户熟悉且可识别的方式来表示对象或操作;②使用户能直观觉察到自己的动作是否有效;③使用户在操作过程充满信任感和掌控感。(2)手势触觉是人类的第五感官,手指尖的可触知末梢器官能带给人们更加丰富的感知能力。用户通过触控的方式与屏幕进行互动已成为主流的交互方式,当下手势交互主要以多点触控技术为基础,它是体现用户意图的一种自然的交互方式。手势是人手或者手和臂结合所产生的各种姿势和动作。?在日常生活中,人与人之间会通过手势进行有效地沟通并传达信息,因此将手势运用到移动互联网应用界面的交互设计中,能提高人与应用交互的效率。智能手机移动互联网应用的手势操作是基于智能手机触摸屏展开的。它分为基本操作、导航操作、对象操作和绘制操作四种类型。基本操作一般用来选择或激活对象,如选择某个项目;导航操作用来切换或移动,如跳转页面;对象操作是基于某一项功能而进行的具体操作,如编辑图片;绘制操作则更加灵活,在游戏与浏览器应用中运用得最为广泛,如海豚浏览器支持用户自定义手势符号;切水果游戏中通过手指的横向滑动完成切水果的一个动作。手势交互方式的自然性和多样性提高了用户与应用本身的交互程度,让操作过程显得更有趣。因此智能手机移动互联网应用手势操作设计的关键点如下:①手势设计要符合用户的心理模型,其表达的含义易被用户接受;②手势作为一种符号要注意其能指与所指的表意方式是否与用户的认知、文化、习惯相符合,通用的、形象的以及有意义的手势符号才更容易被学习和记忆;③手势操作定义要尽量简洁和自然,如画一个勾表示确认,画一个圈表示选定等;④需要针对新手用户进行手势操作的提示与引导,如待用户打开应用后,将手势的表意与操作以视觉形式表现在新手引导页面,以便用户快速学习和操作;⑤将复杂的手势作为备选的快捷方式,支持用户自定义使用或隐藏手势操作。(3)语音通过语音实现用户与移动应用的交流是一种最符合人类直觉的交互方式。它由人与人的对话交谈的方式延展而来,为移动互联网应用更高层次的智能化提供了良好的途径。语音交互系统有两个直接的优点:①语言比键盘输入更快且更有效;②在多任务的情景中,提供了更多的反应通道,使手可以腾出来做其他事。①早在20世纪60年代,人们就开始研究计算机语音识别技术。美国IBM公司于20世纪90年代推出了声控打字及语音导航的语音识别输入软件(IBM ViaVoice),并在全球成功销售了 100多万套。随后微软公司在其Windows XP的操作系统中加入了语音控制的功能,方便用户在不使用键盘和鼠标的情境下通过语音对计算机进行简单的控制。2009年,谷歌公司推出了智能语音搜索功能(VoiceSearch),系统在识别用户声音后提炼关键词并进行搜索,这项功能已经在移动浏览器应用中广泛应用。2011年10月,苹果公司在其发布的手机iPhone4S中增加了语音控制功能Siri,用户不仅能对它提问,还能与它交谈。Siri比语音搜索更加人性化,它能结合上下文语境去理解用户话语中的引申义,并执行命令。在智能手机移动互联网应用中,语音的交互方式分为语音输入和输出两种类型。语音输入:用户通过语音的方式向移动互联网应用输入信息,主要分为语音搜索和语音控制两种形式。语音输出:移动互联网应用对用户的操作发出语音的反馈,这种反馈一般是由系统发出的短促的提示音。如:用户成功完成某项操作后系统反馈出“操作成功”的提示音;在用户操作失败或操作错误的情况下,系统也会给出相应的提示音。近几年,语音交互已经成为移动互联网应用常见的交互方式。其中,系统对语音识别的准确性是语音交互成功的关键;另外无论用户操作的情况如何,系统都应给出友好的语音反馈。语音交互的发展是智能手机移动互联网应用人工智能化的发展方向,应用界面也会随之变得更加自然简洁。应用界面设计团队需要了解新型的交互方式,力图将最好的交互界面带给用户。(4)多通道心理学中的通道(Modality)指人类的感觉方式,它用来传达和获取各种类型的信息。常见的通道有视觉通道、听觉通道、触觉通道、语音通道、眼动通道和感觉通道等。而人机交互中的通道包括人类和计算机之间信息交流的所有方式,即多通道交互方式。多通道的交互方式是使智能手机移动互联网应用充分感知用户表达的信息并以多种载体表现反馈,它分为输入和输出两种通道类型。一个输入(动作)通道,是指通过某一事实上的人的动作器官表现出来,为特定的输入设备所获取,并经由适当的处理转换成相应的应用可接受的一条信息传输通路。反之,一个输出(知觉)通道则是指信息通过应用表现出来,为人的感官器官所获取,并经由适当的处理转换成相应的人可以接受的信息的一条信息传输通路。?输入通道关联人的运动通道,如手、眼、嘴、头等;而输出通道则关联人的感觉通道,如:视觉、听觉、触觉、嗅觉等。多个通道的整合能提高信息交互的效率,使操作更加方便。
&&上一篇:下一篇:&&> UI界面设计的交互模式有哪几种
分享到: 0
【文章摘要】
我国在2014年进入移动互联网的全民时代,手机和掌上电脑等移动设备成为现代人的必备品,各种移动应用也相继出现。移动应用的交互设计也越来越受到重视,isunn(爱上设计)将会在...
& & 我国在2014年进入移动互联网的全民时代,手机和掌上电脑等移动设备成为现代人的必备品,各种移动应用也相继出现。移动应用的也越来越受到重视,isunn(爱上设计)将会在本文针对移动应用界面介绍几种流行的交互设计模式。
1、下拉刷新
& & 下拉刷新是移动应用常用的一种交互设计模式,它是通过使用使用下拉手势进行内容更新,首先使用这一设计模式的是Apple公司。用户在进行下拉刷新时,屏幕会滚动到顶部,刷新内容完成后新的内容将从顶部开始显示,这种设计模式不仅简单易懂,而且可以节约空间。
2、用户交互
& & 除了下拉刷新之外,滑动也是智能手机最常用的手势。许多应用都允许用户使用滑动来了解详细信息或执行其他操作。在移动应用中,很多界面都使用了滑动和点击这样的交互方式进行设计,这样的交互设计模式与依赖点击鼠标的传统网页应用相比较,具有很大的创新意义。
& & 弹窗是常用于因特网广告的一种方法。弹窗会在不创建信窗口的情况下遮盖主要内容,无法使用阻拦软件进行拦截,所以用户非看不看,一般这种模式都比较容易令用户产生厌恶情绪,不过有的弹窗打断用户使用却能为用户带来帮助。比如说用户可能希望在不丢失当前用户界面的情况下查看某些信息,这时候弹窗就有对用户提供帮助。
& & 在现如今的快节奏生活时代,我们每天都要接触大量信息,但是却没有太多的时间花费在手机上。所以我们都喜欢在尽量短的时间内完成要做的事情,需要马上知道是否有新的活动或情况可以引起自己的注意,于是的通知功能显得非常重要。通知功能是提示近期活动的操作,因此设计师对于通知设计模式的透彻理解和妥当实施十分重要。
5、社交登陆
& & 社交登陆这一设计模式取代了注册、填写表单之类的麻烦工作,简化注册流程进而可以让用户轻松快捷登陆移动应用进行使用,无需再重新创建一个新的账户,极大的提高了注册效率。这样的交互设计模式优势在于:用户使用现有的社交帐号就可以登陆,免去多记一个账户和密码的麻烦;可以让你在用户的社交帐号中获取用户的相关基本资料,可以更为有效的根据用户的需求调整你的移动应用;无需强迫用户在不熟悉的新应用中填写自己的信息,简化注册流程。
& & 以上介绍的5种交互设计模式就是现在用于移动界面设计较为流行的模式,希望可以为交互设计师带来灵感。
最新UI界面设计资讯
UI设计推荐阅读8203人阅读
Android开发常识(90)
上一篇文章:&简述了Service的一些基础知识以及Service和Thread的简单区别,本文将着重讲解与Service交互的五种基本方式:广播交互、共享文件交互、Mssenger(信使)交互、自定义接口交互、AIDL交互。
&&&&&& 1. 广播交互
&&&&&& 提到Activity与Service的交互,可能狠多人首先想到的就是BroadCast——广播。在Android中,广播是系统提供的一种很好的交互方式。比如:在电池电量过低,开机完成等情况下,系统都会发出相应的系统广播,我们的应用程序只需要注册相应的广播接收器,就可以接收到这些系统的广播。同时,我们也可以定义自己的广播,这样在不同的Activity、Service以及应用程序之间,就可以通过广播来实现交互。我们通过模拟应用程序后台下载的情况来分析Service与Activity的交互方式。实现效果如图1.1:
&&&&&&& 当我们点击StartService按钮之后,界面上的进度条将会每隔一秒加1。因为是模拟下载,因此下载动作我们在Service中通过一个Timer定时器来实现,在Timer中对一个整型数据i进行自加(i++),然后Client端获取Server端的i值并显示在界面上,从而达到模拟的目的。
&&&&&&& 1.1. 实现原理
&&&&&&& Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上。
&&&&&&& 1.2. 实现步骤
&&&&&&& 1.2.1 在Client端中通过startService()啟动Service。
&&&&&&&&&&这里的mIntent = new Intent();Process.myPid()方法可以获取当前进程的ID号。
&&&&&& 1.2.2 DownLoadService接到启动的命令之后,执行onCreate()方法,并在其中开启timer计数模拟下载。
&&&&&&&&&&这里的intent是Server端向Client端传送数据用的,使用的action是”com.seven.broadcast”,Client端只有註册了相应action才能够接收到Server端的广播,并解析其中的内容。Process.myPid()是获取当前进程的ID。
&&&&&&& 1.2.3 在Server端的timer计数其中发送广播,告知Client端目前下载进度。
&&&&&&&&&&通过intent.putExtra(key,value);设置intent的值,然后通过sendBroadcast(intent)2方法,将广播发送出去。
&&&&&& 1.2.4 在Client端通过匿名内部类的方式实例化BroadcastReceiver并覆写其中的onReceive()方法。
&&&&&&&&& 在onReceive()方法中,判断是否为Server端发送的广播,如果是则对广播中携带的intent数据进行解包处理。这裡也可以单独写一个类继承自BroadcastReceiver,在其中覆写onReceive()方法,在Client端中实例化其对象,同样可以达到相应的效果,这样做可以为后面实现静态注册广播。
&&&&&&& 1.2.5 更新主介面下载进度。
&&&&&&&&&&&&&这里对获取到的进度进行了一次判断,如果获取到的值没有异常,那么将会显示到界面,并更新进度条的进度,如果异常则返回。
&&&&&& & 1.2.6 一定要对Broadcast进行注册和取消注册。只有注册之后相应的broadcast之后才能接收到广播注册方法有两种。
&&&&&& & 动态注册/取消注册:
&&&&&&&&&&&动态註册可以随时註册随时取消。
&&&& && 静态註册:
&&&&&&&&&&&注:这里的MyBroadcastReceiver是一个继承自BroadcastReceiver的类。静态注册只要注册了一次那么只要该程序没有被卸载那么该广播将一直有效。
&&&&&&& 最后贴出整个AndroidManifest.xml文件
&&&& &&&&&这里的android:process =”:remote”可以使该Service运行在单独进程中,从而可以模拟跨进程通信。
&&&&&& 1.3 小结
&&&&&& 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用。但缺点也十分明显,发送广播受到系统制约。系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟。同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应。
&&&&&&& 2. 共享文件交互
&&&&&&& 这里提到的共享文件指的是Activity和Service使用同一个文件来达到传递数据的目的。我们使用SharedPreferences来实现共享,当然也可以使用其它IO方法实现,通过这种方式实现交互时需要注意,对于文件的读写的时候,同一时间只能一方读一方写,不能两方同时写。实现效果如图2.1:
&&&&&&&& 2.1 实现原理
&&&&&&&& Server端将当前下载进度写入共享文件中,Client端通过读取共享文件中的下载进度,并更新到主界面上。
&&&&&&&& 2.2 实现步骤
&&&&&&&& 2.2.1 在Client端通过startService()啟动Service。
&&&&&&&&& 这里的intent = new Intent()2只是为了启动Server端。
&&&&&&& 2.2.2 Server端收到启动intent之后执行onCreate()方法,并开启timer,模拟下载,以及初始化SharedPreferences对象preferences。
&&&&&&&&&&通过preferences=getSharedPreferences(String,MODE)2可以在/data/data/com.seven.servicetestdemo/shared_prefs文件夹下建立相应的xml文件。
&&&&&& 2.2.3 开始计数并将下载进度写入shared_prefs文件夹下的xml文件中,内容以键值对的方式保存。
&& & &&&&&&对於SharedPreferences的使用需要注意一下几点:
& & &&& 首先,使用sharedPreferences前需要获取文件引用。
&& & && preferences = getSharedPreferences(&CurrentLoading_SharedPs&, 0);
&& & && 其次,使用sharedpreferences写数据方式。
&& && & preferences.edit().putInt(&CurrentLoading&, i).commit();
&& & && 最后,读取数据的方式。
&& && & int couLoad = preferences.getInt(&CurrentLoading&, 0);
&&&&&&& 2.2.4 Client端通过读取/data/data/com.seven.servicetestdemo/shared_prefs文件夹下的xml文件,并取得里面的键值对,从而获取到当前的下载进度,并更新到主界面上。
&&&&&&&&& 2.3 小结
&&&&&&& 因為方法简单,因此就不贴出AndroidManifest.xml文件了。对於这种方式实现Activity与Service的交互,可以说很方便,就像使用管道,一个往裡写,一个往外读。但这种方式也有缺陷,写入数据较为复杂以及数据量较大时,就有可能导致写入与读数据出不一致的错误。同时因为经过了一个中转站,这种操作将更耗时。
&&&&&&& 3. Messenger交互(信使交互)
&&&&& & Messenger翻译过来指的是信使,它引用了一个Handler对象,别人能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message通信,在服务端使用Handler创建一个 Messenger,客户端只要获得这个服务端的Messenger对象就可以与服务端通信了。也就是说我们可以把Messenger当做Client端与Server端的传话筒,这样就可以沟通交流了。实现效果如图3.1:
&&&&&&& 3.1 实现原理
&&&&&&& 在Server端与Client端之间通过一个Messenger对象来传递消息,该对象类似于信息中转站,所有信息通过该对象携带。
&&&&&&& 3.2 Messenger的一般用法
&&&&&&& (1). 在Server端创建信使对象。
&&&&&&&&&&&&&& mMessenger = new Messenger(mHandler)
&&&&&&& (2). Client端使用bindService()绑定Server端。
&&&&&&& (3). Server端的onBind()方法返回一个binder对象。
&&&&&&&&&&&&&& return mMessenger.getBinder();
&&&&& & (4). Client端使用返回的binder对象得到Server端信使。
&&&&&&&&&&这里虽然是new了一个Messenger,但我们查看它的实现
&&&&&&&&&&&发现它的mTarget是通过AIDL得到的,实际上就是远程创建的那个。
&&&&&&& (5). Client端可以使用这个Server端的信使对象向Server端发送消息。
&&&&&&&&&&&&&& rMessenger.send(msg);
&&&&&&& 这样Server端的Handler对象就能收到消息了,然后可以在其handlerMessage(Message msg)方法中进行处理。经过这5个步骤之后只有Client端向Server端发送消息,这样的消息传递是单向的,那么如何实现消息的双向传递呢?
&&&&&&& 首先需要在第5步做修改,在send(msg)前通过msm.replyTo = mMessenger将Client端自己的信使设置到消息中,这样Server端接收到消息时同时也得到了Client端的信使对象,然后Server端也可以通过使用得到的Client端的信使对象来项Client端发送消息 cMessenger = msg.replyTo2& cMessenger.send(message);
&&&&&& 这样即完成了从Server端向Client端发送消息的功能,这样Client端可以在自己的Handler对象的handlerMessage()方法中接收服务端发送来的message进行处理。
&&&&&&& 3.3 实现步骤
&&&&&&& 3.3.1 创建并初始化Server端的信使对象。
&&&&&&&&&&3.3.2 在Client端使用bindService()方法绑定Server端。
&&&&&&&&&&3.3.3 在Server端的onBind()方法中返回一个binder对象。
&&&&&&&&& 这裡的mMessenger就是Server端的信使对象。
&&&&&&& 3.3.4 Client端使用ServiceConnected()方法来获取Server端的信使对象。
&&&&&&&&&&&获取Server端的信使对象的同时,也初始化Client端的自己的信使对象,并且通过sendMessage()方法发送消息给Server端,表示可以开始下载了。
&&&&&&& 3.3.5 Client端使用获取到的rMessenger来发送消息给Server端,同时将Client端的信使封装到消息中,一并发送给Server端。
&&&&&&&&&&&这里的MessengerService.TEST為Server端里的一个静态常量。Msg.replyTo=mMessenger;表示发送给Server端的信息里携带Client端的信使。
&&&&&&& 3.3.6 Server端获取Client端发送的消息并得到Client端的信使对象。
&&&&&&&&&&&在接收到Client端的信息之后,Server端开啟timer模拟下载,并接收Client端的信使对象。
&&&&&&& 3.3.7 Server端向Client端发送数据。
&&&&&&&&& 直接使用接收到的Client端的信使对象来发送当前下载进度给Client端。
&&&&&&& 3.3.8 Client端接收来自Server端的数据。
&&&&&&&&&&&Client端的接收和Server端的接收狠类似。接收到Server端传过来的数据之后进行介面更新,以及下载进度更新。
&&&&&&& 以下是AndroidManifest.xml文件:
&&&&&&&&&&&这里在Service的註册中加入了过滤动作,只有相匹配的action才能启动相应的Service。
&&&&&&& 3.4 小结
&&&&&&& 通过Messenger来实现Activity和Service的交互,稍微深入一点我们就可以知道,其实Messenger也是通过AIDL来实现的。对於前两种实现方式,Messenger方式总体上来讲也是比较容易理解的,这就和平时使用Handler和Thread通信一个道理。
&&&&&&& 4. 自定义接口交互
&&&&&&& 何谓自定义接口呢,其实就是我们自己通过接口的实现来达到Activity与Service交互的目的,我们通过在Activity和Service之间架设一座桥樑,从而达到数据交互的目的,而这种实现方式和AIDL非常类似(后文会说到)。实现效果如图4.1:
&&&&&&& 4.1 实现原理
&&&&&&& 自定义一个接口,该接口中有一个获取当前下载进度的空方法。Server端用一个类继承自Binder并实现该接口,覆写了其中获取当前下载进度的方法。Client端通过ServiceConnection获取到该类的对象,从而能够使用该获取当前下载进度的方法,最终实现实时交互。
&&&&&&& 4.2 实现步骤
& & & & 4.2.1 新建一个Interface,并在其中创建一个用于获取当前下载进度的的空方法getCurrentLoad()。
&&&&&&& 4.2.2 新建Server端DownService实现ICountService并在其中通过一个内部类ServiceBinder继承自Binder并实现ICoutService接口。
&&&&&&&&& 在Server端中,实现获取下载进度的空方法getCurrentLoad();这是Eclipse自动生成的,重点不在这裡。我们需要在ServiceBinder类中覆写getCurrentLoad()方法,这裡我们返回当前的下载进度i。
&&&&&& 4.2.3 Client端使用bindService()绑定Server端。
&&&&&&&&&&&在Client端绑定Server端的同时,延迟1s开始获取下载进度。其中的intent = new Intent(“com.seven.test”)2com.seven.test该字符串要与在AndroidManifest.xml中申明的一致。
&&&&&& 4.2.4 Server端返回binder对象。
&&&&&& & &&这里的serviceBinder因为继承了Binder因此也是Binder对象。
&&&&&&& 4.2.5 Client端通过ServiceConnection来获取Server端的binder对象。
&&&&&&&&& 获取的过程是在bindService()过程中完成的,这里的iCountService是接口ICountService的对象,在这里得到实例化。
&&&&&&& 4.2.6 在绑定完成之后,Server端会开启下载,在实际情况中Server端会开启独立线程用于下载,这里用i++来代替。
&&&& && & bindService()方法执行之后会调用DownLoadService中的onCreate()方法,在其onCreate()方法中开启timer使得i++。
&&&&&&& 4.2.7 Server端已经开启了下载,那么Client端需要及时获取下载进度并在主界面上更新。
&&&&&&&&&&&Client端的Timer在bindService()完成之后1秒再开始获取下载进度,获取方法是直接通过int curLoad =
iCountService.getCurrentLoad();这里的getCurrentLoad()方法是DownLoadService内部类ServiceBinder中的方法。Client端将获取到的下载进度更新到介面上并更新进度条。
&&&&&&& 4.3 小结
&&&&&&& 通过上面的例子可以知道,这种方法简单实用,扩展性强,但其也有一些缺点,比如需要延迟一些再开始获取Server端的数据,从而无法完全实现从零开始同步更新。综其所述,通过自定义接口实现Activity与Service交互的方法还是比较实用的。适用於同进程中通信,不能进行跨进程通信。
&&&&&&& 5. AIDL交互
&&&&&&& 什么是AIDL?
&&&&&&& AIDL是Android Interface Definition Language的首字母缩写, 也就是Android接口定义语言。提及AIDL就不得不说下Android的服务,Android 支持两种服务类型的服务即本地服务和远程服务。
&&&&&&& 本地服务无法供在设备上运行的其他应用程序访问,也就是说只能该应用程序内部调用,比如某些应用程序中的下载类服务,这些服务只能由内部调用。而对于远程服务,除了可以由本应用程序调用,还可以允许其他应用程序访问。远程服务一般通过AIDL来实现,可以进行进程间通信,这种服务也就是远程服务。
&&&&&&& 本地服务与远程服务还是有一些重要的区别。具体来讲,如果服务完全只供同一进程中的组件使用(运行后台任务),客户端一边通过调用 Context.startService()来启动该服务。这种类型的服务为本地服务,它的一般用途是后台执行长耗时操作。而远程服务一般通过bindService()方法启动,主要为不同进程间通信。我们也将远程服务称为AIDL支持服务,因为客户端使用 AIDL 与服务通信。Android中对于远程服务有多种叫法:远程服务、AIDL服务、外部服务和RPC服务。
&&&&&&& 5.1 AIDL实现流程图
&&&&&&& 这属于代理/存根结构,通过这张AIDL的流程图,很容易发现Android实现IPC其实是在原来的C/S框架上加入了代理/存根结构。
&&&&&&& 比如,你到自动取款机上去取款。那么你就是客户(Client),取款机就是你的代理(Proxy);你不会在乎钱具体放在那里,你只想将你的钱从取款机中取出来。你同银行之间的操作完全是取款机代理实现。你的取款请求通过取款机传到另一边,即银行的服务器(Server)。它也没有必要知道你在哪儿取钱,它所关心的是你的身份和你取款多少。当它确认你的权限,就进行相应的操作,返回操作结果给取款机,取款机根据服务器返回结果,从保险柜里取出相应数量的钱给你。你取出卡后,操作完成。取款机不是直接同服务器连接的,他们之间还有一个“存根(Stub)”,取款机与存根通信,服务器与存根通信,从某种意义上说存根就是服务器的代理。实现效果如图5.2:
&&&&&&& 5.3 实现原理
&&&&&&& AIDL属于Android的IPC机制,常用于跨进程通信,主要实现原理基于底层Binder机制。
&&&&&&& 5.4 实现步骤
&&&&&&& 5.4.1 建立工程。按照图5.3和图5.4建立AIDLServer端以及AIDLClient端。在AIDLServer端中只有一个服务程序,没有主界面,其主要功能就是负责下载。AIDLClient端从AIDLServer端获取当前下载进度(注:AIDLServer端和AIDLClient端是不同的两个APK,在模拟本例的时候,需要先在模拟器上安装AIDLServer编译出来的APK,安装方法可以直接在模拟器上运行一次,可以通过adb
install your.apk 来安装)。
&&&&&&& AIDLServer端中新建了一个ICountService.aidl的文件,该文件内容如下:
&&&&&&&&& aidl文件的书写规范如下:
&&&&&&& (1). Android支持String和CharSequence(以及Java的基本数据类型);
&&&&&&& (2). 如果需要在aidl中使用其它aidl接口类型,需要import,即使是在相同包结构下;
&&&&&&& (3). Android允许传递实现Parcelable接口的类,需要import;
&&&&&&& (4). Android支持集合接口类型List和Map,但是有一些限制,元素必须是基本型或者前面三种情况,不需要import集合接口类,但是需要对元素涉及到的类型import;
&&&&& & (5). 非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
&&&&&& & AIDLClient端需要将AIDLServer端的ICountService.aidl文件复製过去,这裡为了方便,新建了一个和Server端同名的包,并将ICountService.aidl放与其中。
&&&&&&&& 5.4.2 我们在Server端建立好ICoutService.aidl文件之后,Eclipse会在/gen/com.seven.aidlserver/目录下自动生成ICountService.java文件。该文件由Eclipse自动生成,请勿随便修改,后文我们需引用到的内容如下:
&&&&&&&&& 5.4.3 在Server端新建一个内部类继承自ICountService.Stub并覆写其中的getCount()方法,以及实例化该类的一个对象serviceBinder。
&&&&&&&& 这里与前面提到的“通过接口实现交互”非常类似。
&&&&& & 5.4.4 在Server端的onBind()方法中,返回前面的serviceBinder对象。
&&&&&&&& 5.4.5 在Server端的onCreate()方法中,开启timer,模拟下载。在Client端通过bindService()绑定Server端的时候,会首先执行Server端的onCreate()方法。
&&&&&&&&& 5.4.6 Client端通过bindService()绑定Server端。
&&&&&&&&&&这里的intent = new Intent(“com.seven.aidlserver”);这里跟Server端注册Service时过滤的要一致,也就是说只有发出相同的action才会启动该Service。同时开启了一个timer用于获取下载进度。
&&&&&&& 5.4.7 Client端通过ServiceConnection来获取Server端的binder对象。
&&&&& & &&这里的iCountService对象实际上就是ICountService的对象在此实例化。
&&&&&&& 5.4.8 获取当前下载进度并更新到界面上。
&&&&&&&&& 通过更新介面上的进度条,可以狠容易的后去当前下载进度。因為AIDLServer端只是一个继承自Service的服务,因此就不贴出其AndroidManifest.xml文件了。
&&&&&&& 5.5 小结
&&&&&&& AIDL在Android中是进程间通信常用的方式,可能使用较為复杂,但效率高,扩展性好。同时很多系统服务就是以这种方式完成与应用程序通信的。
&&&&&&& 本文通过五个例子,分别介绍了五种与Service交互的方法,这些方法有的简单,有的可能要复杂一些。在这里只是做为对Servie的一些总结。后文附上源码下载链接,不需要积分的哦。:D
&&&&&&& 所有源码均在Ubuntu 10.04 Eclipse-Indigo下实验通过 模拟器采用的是2.3的镜像
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2069345次
积分:14420
积分:14420
排名:第602名
原创:14篇
转载:530篇
评论:678条
(1)(3)(7)(16)(43)(1)(5)(2)(2)(1)(18)(6)(3)(27)(10)(7)(6)(2)(7)(8)(1)(6)(27)(22)(9)(29)(30)(42)(19)(34)(10)(27)(83)(17)(17)

我要回帖

更多关于 人机交互的方式有哪些 的文章

 

随机推荐