浅谈Android(安卓)
浅谈Android--嵌入式操作系统
Android(读音:[??ndr?id],中文俗称安卓)是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google成立的Open Handset Alliance (OHA,开放手持设备联盟)持续领导与开发中。
--题记.维基百科说起嵌入式系统,曾经在保罗大叔的著作《黑客与画家》里看到多次,然后不明所以,就去查了嵌入式系统。如果说嵌入式系统给我的第一印象是硬件,那么是我还不知道嵌入式在我生活里已经出现了很多年了。
大到冰箱,自动存款机(ATM),小到电子手表,遥控器。在维基百科解答后,我对嵌入式直观的理解,是一种特定的植入硬件并极具针对性的计算机系统。
后来慢慢了解嵌入式的软件方面,就知道了嵌入式操作系统,而其中的佼佼者,就是如今已经超越ios,占据半壁江山的Android。
之所以会说Android,原因有二:一,因为Android如今炙手可热,在新一季度的日本手机软件营销额上,以Java等语言为Android系统开发的Apps,疯狂揽金,李开复断言在两年内,中国内地手机游戏软件市场,将会百花齐放;二,我虽并非研究Java也非致力于Android系统,但是Android系统的内核,却是我所熟悉的Linux内核。而我将自己的开发平台转移到Linux系统,并以Python,Perl以及Lisp语言作为未来的生存工具,所以,就让我们谈一谈Android。
题记中套用维基百科对于Android的介绍,主要的目的,就是为了澄清一件事实“认知”——Android并没有真正的中文名。
Google并没有为Android命名,只有为其版本取名,且翻译成中文:4.2.x Jelly Bean 果冻豆,4.0.x Ice Cream Sandwich 冰激凌三明治,3.x.x Honey
Comb 蜂巢,2.3.x Ginger Bread 姜饼。而“安卓”一词,也是我们自己对其中文简称,就像Facebook并没有为其在中国大陆市场取名一样。
介绍完人家的名字,现在介绍安卓的身世。
2003年10月,有“Android之父”之称的安迪·鲁宾(Andy Rubin)在美国加利福尼亚州帕洛阿尔托创建了Android科技公司(Android Inc.),并与利奇·米纳尔(Rich Miner)、尼克·席尔斯(Nick Sears)、克里斯·怀特(Chris White)共同发展这家公司。谈到创建Android科技公司的原因,鲁宾说:“聪明的移动设备能更好的意识到用户的爱好和要求。”尽管Android科技公司的创始人和员工过去都具有各自的科技成就,但是Android科技公司的经营只显露出它在智能手机软件的方面。
同年,鲁宾为Android科技公司花光了所有的钱。就在这时,史蒂夫·帕尔曼(Steve Perlman)递给了鲁宾一个信封,在里面装有1万美金的现金;帕尔曼并不是以投资的方式给鲁宾这笔钱,因为他拒绝了鲁宾给他的股份。
2005年8月17日,Google收购了Android科技公司,Android科技公司成为Google旗下的一部分。包括米奇·米纳尔、克里斯·怀特等所拥有的全资子公司,所有Android科技公司的员工都被并入Google。当时没有人知道Google
为什么作出这项收购,有许多的猜测,后来证明Google正是借助此次收购正式进入移动领域。
在Google,鲁宾领导着一个负责开发基于Linux内核移动操作系统的团队,这个开发项目便是Android操作系统。Google的合作平台为Android提供了广阔的市场,Google给予各大硬件制造商、软件开发商一个灵活可靠的系统升级承诺,并保证将给予它们最新版本的操作系统。
2006年12月,《华尔街日报》和英国广播公司(BBC)报道了Google有可能进入移动领域的传闻,Google有可能推广移动领域下的各种Google服务,并且将推出一款名为Google电话的自有品牌智能手机。另有传闻指出,按照Google的作风,将有可能呈现出新的智能手机制造商和运营商模式。
2007年9月,Google提交了多项移动领域的专利申请。但并没有人知道,Google将会推出的是一款名为Android的智能手机操作系统。更多的猜测是,Google会推出一款像iPhone一样的自有品牌智能手机系列。
市场上第一款采用Google的Android操作系统的智能手机HTC T-Mobile G1,于2008年10月22日在美国上市,当时定价为179美元。
2007年11月5日,在Google的领导下,成立开放手持设备联盟(Open Handset Alliance),最早的一批成员包括Broadcom公司、HTC、Intel、LG、Marvell等公司。开放手持设备联盟的创建目的是为了创建一个更加开放自由的移动电话环境。而在开放手持设备联盟创建的同一日,联盟对外展示了他们的第一个产品:一部搭载了以Linux 2.6为内核基础的Android操作系统的智能手机。2008年12月9日,新一批成员加入开放手持设备联盟,包括ARM、华为、索尼等公司.
同时,一个负责持续发展Android操作系统的开源代码项目成立了
AOSP(Android Open Source Project) 。除了开放手持设备联盟之外,Android 还拥有全球各地开发者组成的开源社区来专门负责开发Android应用程序和第三方Android操作系统来延长和扩展Android的功能和性能。
Android操作系统使用开放免费代码许可证,一切代码都是公开免费的。Google对Android所使用的Linux内核依据Apache开源条款2.0中所规定的内
容进行了修改,包括添加智能手机网络和电话协议栈等智能手机所必需的功能,使它们能更好的在移动设备上运行,并且根据第二版GNU条款中所规定的内容对修改的Linux内核信息公布。Google也不断发布问卷和开放修改清单、更新情况和代码来让任何人看到并且提出他们的意见和评论,以便按照用户的要求改进Android操作系统。
Android操作系统是完全免费开源的,任何厂商都可以不经过Google和开放手持设备联盟的授权随意使用Android操作系统;但是制造商不能随意地在自己的产品上使用Google的标志和Google的应用程序,例如Google Play等。除非Google证明其生产的产品设备符合Google兼容性定义文件(CDD),这样才能在智能手机上预装Google Play Store、Gmail等应用程序,并且获得CDD 的智能手机厂商也可以在其生产的智能手机上印上“With Google”的标志。
对于Android系统,我最关心的则是——Linux内核
Android操作系统的内核属于Linux内核的一个分支,具有典型的Linux调度和功能,除此之外,Google为了能让Linux在移动设备上良好的运行,对其进行了修改和扩充。Android去除了Linux中的本地X Window System,也不支持标准的GNU库,这使得Linux平台上的应用程序移植到Android平台上变得困难。2008年,Patrick Brady于Google I/O演讲“Anatomy & Physiology of an Android”,并提出的Android HAL架构图。HAL以*.so档的形式存在,可以把Android framework与Linux kernel隔开,这种中介层的方式使得Android能在移动设备上获得更高的运行效率。这种独特的系统结构被Linux内核开发者Greg Kroah-Hartman和其他内核维护者称赞。Google还在Android的内核中加入了自己开发制作的一个名为“wakelocks”的移动设备电源管理功能,该功能用于管
理移动设备的电池性能,但是该功能并没有被加入到Linux内核的主线开放和维护中,因为Linux内核维护者认为Google没有向他们展示这个功能的意图和代码。
2010年2月3日,由于Google在Android内核开发方面和Linux社区方面开发的不同步,Linux内核开发者Greg Kroah-Hartman将Android的驱动程序从Linux内核“状态树”(“staging tree”)上除去。2010年4月,Google宣布将派遣2名开发人员加入Linux内核社区,以便重返Linux内核。2010年9月,Linux 内核开发者Rafael J. Wysocki添加了一个修复程序,使得Android的“wakelocks”可以轻松地与主线Linux内核合并。2011年,Linus Torvalds说:“Android的内核和Linux的内核将最终回归到一起,但可能不会是4-5年。”
而Android作为能与ios系统PK的嵌入式操作系统,其拥有强大的特点则是它吸引人的关键。
当前的Android操作系统具有如下特点:显示布局,数据储存,网络,信息,语言,浏览器,支持Java,流媒体支持,硬件支持,多点触控,蓝牙,多任务处理,语音功能,无线共享功能,截图功能。
Android 系统架构
Android 是Google 开发的基于Linux 平台的开源手机操作系统,它是一个移动终端平台,包括了移动电话工作所需的全部软件,由操作系统、中间件、UI (User
Interface)及应用程序组成。开发人员使用Java 语言,开发运行于Dalvik 虚拟机上的应用程序,其运行效率比一般嵌入式Linux 操作系统上的J2ME 程序高。
Android系统架构自底向上由以下4个层次组成:基于Linux 的内核模块、运行时库与其他库、应用程序框架、应用程序。
(1)基于Linux 的内核模块Android 内核基于Linux 2.6, 提供安全、内存管理、进程管理、网络组、驱动模型等核心服务。同所有Linux 内核一样,Android 内核是介于硬件层和软件组之间的一个抽象层次。
(2)运行时库与各种程序库
运行时库实质是一款Java重新设计的虚拟机Dalvik, 它包含J2SE 所提供的绝大部分功能。每个Android 应用都运行在自己的进程上, Dalvik 虚拟机为它分配自有的实例。Dalvik 使一台设备能运行多个虚拟机程序但消耗较少的资源。在Android 中,编译器将Java 源文件转为class 文件,内置的dx 工具又将class 文件转化为Dex 文件,Dex 文件是在Dalvik 虚拟机上运行程序的标准格式。
各种程序库:包含一套C/C++库,Android的各式组件都可使用。这些功能通过组件间接提供给开发者。这些库包括图形框架、媒体功能库、Webkit 、及SQLite 数据库,等等。
(3 )应用程序框架:提供应用程序开发所需要的各种API。在开发过程中,开发人员通过充分使用应用框架提供的API ,对各种组件、服务进行重用,从而开发出精简、高效的应用程序。主要包括以下几种核心组件:UI 组件:包
括List 、Layout、Textbox、Utton、Check-box 等,用以构建应用程序与用户的交互界面。
内容提供器(Content Provider):实现标准的方法接口,让其他应用保存或读取其提供的数据,例如外部程序通过Content Provider 访问联系人数据。
资源管理器(Resource Manager):管理对非代码的访问,例如本地图像、布局文件、本地化字符串等。
消息管理器(Notification Manager) :让程序将警示信息显示在状态栏上,例如平台接收到短信息、电子邮件、未接电话时在状态栏上的提示。
Activity 管理器(Activity Manager):用来管理应用程序生命周期并提供常用的导航回退功能。
(4)应用程序:Android 预装了一系列由Java 语言
编写成的核心应用程序,包括短信服务、电话、Email客户端、浏览器、Google 地图等。
Android 内核分析
2.1 内核在操作系统中的地位Android 基于Linux 操作系统, 由硬件、系统内核、系统服务和应用程序等四大部分组成。其中,内核(Kernel) 是最核心的部分,其主要作用在于与计算机硬件进行交互, 实现对硬件的编程控制和接口操作,调度访问硬件资源,同时向应用程序提供一个高级的执行环境和对硬件的虚拟接口。主要功能包括:
中断服务程序、进程调度程序、进程地址空间的内存管理、进程间通信。
内核与普通应用程序不同, 其拥有所有硬件设备的访问权限以及启动时即划分的受保护的内存空间。
2.2 Android 内核和标准的Linux 内核一样,Android 内核主要实现内存管理、进程调度、进程间通信等功能。Android 内核是在标准Linux 内核的基础上修改而成。为了适应嵌入式硬件环境和移动应用程序的开
发,Android 对标准Linux 内核进行了一定的修改。为了对比分析Android 内
核,在Ubuntu 操作系统上搭建
了Android 内核的编译开发平台,通过repo ,下载最新的Android 内核代码版本cupcake(其中Linux 内核版本为2.6.27)。从获得的内核源码树的根目录结构看,Android 内核源码与标准Linux 内核并无不同。Android 内核源码树根目录结构如表1 所示。经过与标准Linux 内核源代码进行详细对比,可以发现,Android 内核与标准Linux 内核在文件系统、进程间通信机制、内存管理等方面存在不同。
1.文件系统
不同于桌面系统与服务器, 移动设备大多采用的不是硬盘而是采用Flash 作为存储介质,因此,Android内核中增加了标准Linux 内核中没有采纳的YAFFS2文件系统。YAFFS2 (Yet Another Flash File Sy-stem,2nd edition) 是专用于Flash 的文件系统, 对NAND-Flash 芯片有着良好的支持。YAFFS2 是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外断电对文件系统一致性和完整性的影响。YAFFS2按层次结构设计, 分为文件管理接口、内部实现层和NAND,简化了其本身与系统的接口设计,能更方便地集成到系统当中。经过测试证明, YAFFS2 性能比支持NOR 型闪存的JFFS2 文件系统优秀。
2.进程间通信机制
Android 增加了一种进程间的通信机制IPC Bin-der, 在内核源代码中, 驱动程序文件为coredroid/include/linux/binder.h和
coredroid/drivers/android/binder.c 。Binder 通过守护进程Service Manager 管理系统中的服务,负责进程间的数据交换。各进程通过Binder 访问同一块共
享内存,以达到数据通信的机制。从应用层的角度看, 进程通过访问数据守护进程获取用于数据交换的程序框架接口,调用并通过接口共享数据,而其他进程要访问数据,也只需与程序框架接口进行交互,方便了程序员开发需要交互数据的应用程序。
3.内存管理
在内存管理模块,Android内核采用了一种不用于标准Linux 内核的低内存管理策略。在标准Linux内核当中,使用一种叫做OOM (Out of Memory)的低内存管理策略;当内存不足时,系统检查所有的进程,并对进程进行限制评分, 获得最高分的进程将被关闭(内核进程除外)。Android 系统采用的则是一种叫作LMK(Low Memory Killer )的机制,这种机制将进程按照重要性进行分级、分组。内存不足时,将处于最低级别组的进程关闭。例如,在移动设备当中,UI 界面处于最高级别,所以该进程永远不会被中止,这样,在终端用户看来,系统是稳定运行的。在Andorid内核源码中,LMK的位置是coredroid/drivers/misc/lowme
-morykiller.c。
与此同时,Android 新增加了一种内存共享的处理方式Ashmem (Anonymous Shared Memory,匿名共享内存)。通过Ashmem,进程间可以匿名自由共享具名的内存块,这种共享方式在标准Linux 当中不被支持。
Ashmem 分配和使用情况如下:
fd = ashmem_create_region("my_shm_region", size);
if(fd < 0)
return -1;
data = mmap(NULL, size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if(data == MAP_FAILED)
goto out;
但出于安全原因,其他进程无法访问此名称(my_shm_region)区域。文件描述符指向该共享内存区域,实际上是通过IPC 绑定接口。
在Andorid内核源码中,Ashmem的位置是coredroid/mm/ashmem.c。
4.电源管理
由于Android 主要用于移动设备,电源管理就显得尤为重要,因此,在Android 内核当中,增加了一种新的电源管理策略。目前,Android 采用的是一种较为简单的电源管理策略,通过开关屏幕、开关屏幕背光、开关键盘背光、开关按钮背光和调整屏幕亮度来实现电源管理,并没有实现休眠和待机功能。有三种途径判断调整电源管理策略:RPC 调用、电池状态改变和电源设置。它通过广播Intent 或直接调用API 的方式来与其他模块进行联系。电源管理策略同时还有自动关机机制,当电力低于最低可接受程度时,系统将自动关机。Android 的电源管理模块还会根据用户行为,自动调整屏幕亮度。
5.驱动及其他
相对于标准内核,Android内核还添加了字符输出设备、图像显示设备、键盘输入设备、RTC 设备、USBDevice设备等相关设备驱动,增加了日志(Logger) 系统,使应用程序可以访问日志消息。
经过分析,Android内核由标准Linux内核修改而来,因此继承了Linux内核的各种优点,保留了标准Linux 内核的主体架构。同时,Android 按照移动设备的需求,在文件系统、内存管理、进程间通信机制、电源管理等方面进行了修改,添
加相关的驱动程序和一些必要的新功能,但是与大多数精简的嵌入式Linux操作系统(例如uCLinux) 相比,Android很大程度上保留了标准Linux 的基本架构,因此,Android 系统
应用范围更加广泛,拓展性更强。
参考文献:
《Android内核分析》——陈璟,陈平华,李文亮(广东工业大学计算机学院, 广州510006 )
参考网站:
维基百科——Wikipedia
Android https://www.360docs.net/doc/091647537.html,/wiki/Android
嵌入式系统https://www.360docs.net/doc/091647537.html,/wiki/Embedded_system
嵌入式操作系统https://www.360docs.net/doc/091647537.html,/wiki/Embedded_operating_system
安卓按钮单击事件
第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监听器的!!! 对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器。 第二种:内部类作为监听器 将事件监听器类定义成当前类的内部类。1、使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类,2、所以可以自由访问外部类的所有界面组件。这也是内部类的两个优势。上面代码就是内部类的形式!! 第三种:Activity本身作为事件监听器
这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。Activity 的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。 上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处理器方法:onClick(view v),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。 第四种:外部类作为监听器 ButtonTest类 当用户单击button按钮时,程序将会触发MyButtonListener监听器 外部MyButtonListener类
多线程技术在Android手机开发中的运用
龙源期刊网 https://www.360docs.net/doc/091647537.html, 多线程技术在Android手机开发中的运用 作者:谢光刘志惠 来源:《电子技术与软件工程》2017年第24期 摘要 在Android手机开发过程中,一般情况下程序是通过一个线程进行工作的,因此当一个任务耗费过长时间,就会造成主程序无响应并对程序运行的顺畅程度造成影响的问题。基于此,本文通过对多线程组成进行介绍,在Android中多线程技术模块与具体实现方式两方面对多线程技术在安卓手机开发中的运用进行探讨,以为关注此问题的人们提供参考。 【关键词】多线程技术 Android手机进程线程 安卓系统自2007年由谷歌公司开发后,得到了巨大的发展。截至2017年3月,其市场占有率已经达到86.4%,如三星、索尼爱立信、小米、OPPO等手机生产厂商都在使用安卓系统。该系统开源免费、执行效率高,其多线程技术开发应用的研究,对提高手机硬件的利用效率,给用户带来良好试用体验,提高手机厂商的企业竞争力有重要作用。 1 多线程介绍 1.1 进程和线程介绍 一般来说,在一定时间内实现多个程序任务执行的程序都会用到“进程”这一概念。进程,即:一个拥有自身独立的内存空间、系统资源的执行程序,其特征为实现内部状态和内部数据的相互独立。线程与进程相似,线程也是一段有一定功能代码组成的流控制。线程的特征为:同类的多个线程可以对内存空间与系统资源进行共享。因此在对资源的占用方面,可以相互切换的线程比进程小很多。一个进程中可以包含诸多线程,此外,主线程对子线程有控制作用,可对子线程启动、停止等动作进行管理。而本文要重点介绍的多线程,指的是单个程序中一起运行的不同线程,不同线程可以执行不一样的任务。其特征是一个程序的多行语句可在某时间同时执行。 1.2 多线程程序消息处理原理 当人们启动一个程序时,系统将建立main线程,主要管理如:activity等应用组件,并对UI相关的事件进行处理,比如用户想要按键或使用屏幕进行绘图,线程会对以上事件进行处理,这是UI线程。安卓的线程模型,所有组件均在main线程中,因此用户在程序中下达下载文件、使用数据库等具有高耗时特征的操作时,就会造成UI线程的运行不畅,并出现程序无法响应的问题。这就要求程序员使用多线程技术,在进行安卓多线程编写时,技术人员应注意以下两点:
AndroidUI基本控件与事件处理
《Android基础应用》 AndroidUI基本控件与事件处理 ?本章任务 ?使用Android开发本息计算器程序 ?使用Android开发华氏-摄氏温度转换器 ?本章目标 ?熟悉掌握本章基本控件的使用 ?熟练掌握Android常用事件 1.Android基本控件 Android应用开发的一项内容就是用户界面的开发,Android提供了大量功能丰富的UI组件,大部分放在android.widget包及其子包android.view包及其子包 在Android当中View类是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的。如Button(按钮),list(列表),EditText(编辑框),RadioButton(多选按钮),Checkbox(选择框)等都是View类 在Android中,我们可以在Xml文件中使用UI组件也可以在java文件中创建UI组件官方建议采用xml方式,这样的话能够实现界面和代码分离 1.1TextView和EditText TextView是一种用于显示字符串的控件 EditText则是用来输入和编辑字符串的控件,EditText是一个具有编辑功能的TextView
TextView和EditText基本属性 ●android:id设置ID,通过编码可以找到这个组件 ●android:layout_width设置在屏幕上的宽度 ●android:layout_height设置在屏幕上的高度 fill_parent强制性地使构件扩展,以填充布局单元内尽可能多的空间 wrap_content强制性地使视图扩展以显示全部内容 ●android:text设置显示的文本信息 ●android:textColor设置文本颜色 ●android:textSize设置文本尺寸
Android下使用Http协议实现多线程断点续传下载
0.使用多线程下载会提升文件下载的速度,那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度 HttpURLConnection.getContentLength(); RandomAccessFile file = new RandomAccessFile("QQWubiSetup.exe","rwd"); file.setLength(filesize);//设置本地文件的长度 (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置。 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条线程开始下载的位置如下图所示。 例如10M大小,使用3个线程来下载, 线程下载的数据长度 (10%3 == 0 ? 10/3:10/3+1) ,第1,2个线程下载长度是4M,第三个线程下载长度为2M 下载开始位置:线程id*每条线程下载的数据长度 = ? 下载结束位置:(线程id+1)*每条线程下载的数据长度-1=? (3)使用Http的Range头字段指定每条线程从文件的什么位置开始下载,下载到什么位置为止, 如:指定从文件的2M位置开始下载,下载到位置(4M-1byte)为止 代码如下:HttpURLConnection.setRequestProperty("Range", "bytes=2097152-4194303"); (4)保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。 RandomAccessFile threadfile = new RandomAccessFile("QQWubiSetup.exe ","rwd"); threadfile.seek(2097152);//从文件的什么位置开始写入数据
AndroidUI之线程与进度对话框
//创建一个进度条对话框 final ProgressDialog progressdialog=new ProgressDialog(MainActivity.this); progressdialog.setTitle("测试"); progressdialog.setMessage("正在对话框与线程"); progressdialog.show();//显示对话框 //创建线程 new Thread(){ public void run(){ try{ sleep(1000);//时间间隔1秒 }catch(Exception e){ e.printStackTrace(); }finally{ progressdialog.dismiss();//卸载对话框对象 } } }.start(); 菜单的创建于事件监听 public boolean onCreateOptionsMenu(Menu menu) { int a=Menu.NONE;//声明菜单顺序ID int b=Menu.NONE+1; int c=Menu.NONE+2; int d=Menu.NONE+3; menu.add(0, 1, a, "a");//第一个参数:分组,第二个参数:菜单的Id, 第三个参数:菜单的顺序,第四个参数:显示菜单的文字 menu.add(1, 2, b, "b"); menu.add(2, 3, b, "c"); menu.add(2, 4, d, "d"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Toast.makeText(MainActivity.this,"a", 1).show(); break; case 2: Toast.makeText(MainActivity.this,"b", 1).show(); break;
Android OnTouchListener触屏事件接口
Android OnTouchListener触屏事件接口 OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名如下。 Java代码: public boolean onT ouch(View v, MotionEvent event) 参数v:参数v同样为事件源对象。 参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息。 节中介绍了一个在屏幕中拖动矩形移动的案例,本节将继续采用该案例的思路,通过监听接口的方式实现在屏幕上拖动按钮移动的案例。开发步骤如下。 创建一个名为Sample的Android项目。 准备字符串资源,打开strings.xml文件,用下列代码替换原有代码。 Java代码:
Java代码:
Android Handle Thread
有关Android线程的学习 1. Android进程 会尽量保留一个正在运行进程,只在内存资源出现不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用,也能保证用户正在访问的当前进程有足够的资源去及时地响应用户的事件。Android会根据进程中运行的组件类别以及组件的状态来判断该进程的重要性,Android会首先停止那些不重要的进程。按照重要性从高到低一共有五个级别: ?前台进程 前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何时候都存在。他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候。一般来说,在这种情况下,设备会进行内存调度,中止一些前台进程来保持对用户交互的响应。 ?可见进程 可见进程不包含前台的组件但是会在屏幕上显示一个可见的进程是的重要程度很高,除非前台进程需要获取它的资源,不然不会被中止。 ?服务进程 运行着一个通过startService() 方法启动的service,这个service不属于上面提到的2种更高重要性的。service所在的进程虽然对用户不是直接可见的,但是他们执行了用户非常关注的任务(比如播放mp3,从网络下载数据)。只要前台进程和可见进程有足够的内存,系统不会回收他们。 ?后台进程 运行着一个对用户不可见的activity(调用过 onStop() 方法).这些进程对用户体验没有直接的影响,可以在服务进程、可见进程、前台进程需要内存的时候回收。通常,系统中会有很多不可见进程在运行,他们被保存在LRU (least recently used) 列表中,以便内存不足的时候被第一时间回收。如果一个activity正确的执行了它的生命周期,关闭这个进程对于用户体验没有太大的影响。 ?空进程 未运行任何程序组件。运行这些进程的唯一原因是作为一个缓存,缩短下次程序需要重新使用的启动时间。系统经常中止这些进程,这样可以调节程序缓存和系统缓存的平衡。
Android应用程序开发完整训练:从零起步通过23个动手实战案例精通App开发
从零起步,24小时内通过23个动手实战案例,循序渐进的对Android商业级别的应用程序开发要点各个击破,依托于在多年的Android(6款完整的硬件产品和超过20款应用软件)开发和企业级培训经验(超过150期的次Android的企业内训和公开课),旨在在实务的基础之上帮助你完成任何复杂程序的高质量Android应用程序开发,让Android开发跟上想象的速度。最后,通过ActivityManagerService揭秘Android应用程序一切行为背后的核心根源,让你从此开发应用程序居高零下、举重若轻。 课程要点: 1,抽取Android应用开发中用到的最精华的Java技术加以剖析; 2,从零起步构建Android开发环境和编写并彻底剖析第一个Android程序; 3,彻底剖析不同Activity之间所有的交互模式; 4,根据商业化场景彻底剖析Android的生命周期及其使用的最佳时间; 5,使用JUnit测试Android业务代码; 6,掌握Android基本和核心的UI开发技术; 7,”Android商业化高级UI实战”是根据过去20多款商业级别Android应用程序开发尤其是类似CRM系统中最经典、最经常使用的技术抽取而成,掌握之后基本上不会在遇到UI 方面的难点; 8,细致剖析并实战Android性能测试,找出性能瓶颈,并进行代码优化,分享代码优化的最佳实践; 9,对数据的处理时Android绝大多数应用程序的核心,尤其是对CRM系统而言,这一天,我们会对Android中的本地数据处理方式及其商业使用场景进行彻底剖析和实战; 10,从SharedPreferences到内部文件系统,从SDCard操作到SQLite数据库,从XML 和JSON的解析于生成到数据共享统一接口ContentProvider,对Android本地的数据处理方式进行地毯式轰炸; 11,通讯录的操作的原理、流程和场景等进行了情景再现性的代码实战; 12,通过Android手机卫士商业级别的代码案例实战Android中BroadcastReceiver和Service; 13,根据过去20多款程序的商业实战总结出了能够解决基于HTTP协议的任意文件类型、任意大小文件的网络上传和下载,Android网络开发从此一劳永逸; 14,实战WiFi数据交换; 15,尤其是额外提到异步http框架,具备很强的商业价值; 16,Android横竖屏切换的经典场景、生命周期和解决方案; 17,实战构建多语言国际化的Android应用程序; 18,如何编译APK来提高应用的安全性; 19,如何反编译Android应用 20,通过Android中WebView的特性洞悉Android中JavaScript与Java相互沟通的密码,追寻浏览器和HTML5开发的架构和技术实现根源; 21,使用NDK等技术利用C/C++的高效性来提高应用程序的性能; 22,实现Android中以Looper、Handler、Message、MessageQueue为核心的线程间通信方式; 23,实战并剖析AsyncTask框架实现的源代码,并提出对AsyncTask缺陷的解决方案;
android简单的广播事件处理
广播事件处理 一.Broadcast Receiver 比如打电话等等; 广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别,而广播事件处理机制是系统级别。 二.使用Broadcast Receiver 1.编写类继承BroadcaseReceiver,复写onReceiver()方法 2.在AndroidManifest.xml文件中注册BroadcaseReceiver 3.构建Intent对象 4.调用sendBroadcase()方法发送广播 三.BroadcaseReceiver生命周期 BroadcastReceiver对象仅在调用onReceive()方法时有效,当该方法执行完毕后,系统认为销毁该对象。 四.标准广播Action 五.注册Broadcast Receiver的方法 1.在AndroidManifest.xml文件中进行注册//有缺陷,不会因为Activity被销毁而销毁,一般不用
Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 前言 Android事件分发机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 Android事件分发机制的简介 Android事件分发机制的发生在View与View之间或者ViewGroup与View之间具有镶嵌的视图上,而且视图上必须为点击可用。当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View,即事件先传递给Activity,再到Window,再到顶级View,才开始我们的事件分发 Android事件分发机制的相关概念 Android事件分发机制主要由三个重要的方法共同完成的 dispatchTouchEvent:用于进行点击事件的分发 onInterceptTouchEvent:用于进行点击事件的拦截 onTouchEvent:用于处理点击事件 这里需要注意的是View中是没有onInterceptTouchEvent()方法的 Android事件分发机制的分发例子 这里以两个ViewGroup嵌套View来演示,下面是演示图 一、MyView 继承View并覆写其三个构造方法,覆写dispatchTouchEvent和onTouchEvent,前面已经说
了View是没有onInterceptTouchEvent方法的 public class MyView extends View { public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent event) { System.out.println("MyView dispatchTouchEvent"); return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { System.out.println("MyView onTouchEvent"); return super.onTouchEvent(event); } } 二、MyViewGroup01和MyViewGroup02 MyViewGroup01和MyViewGroup02是一样的代码,这里以01为例,继承ViewGroup并覆写其三个构造方法,覆写dispatchTouchEvent和onTouchEvent和onInterceptTouchEvent方法 public class MyViewGroup01 extends LinearLayout { public MyViewGroup01(Context context) { super(context); } public MyViewGroup01(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyViewGroup01(Context context, AttributeSet attrs) {
Android UI线程分析
理解UI线程——swt, Android, 和Swing的UI机理 线程 在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单独的提出来单独对待, 试着问自己, 当GUI启动的时候, 后台会运行几个线程? 比如 1. SWT 从Main函数启动 2. Swing 从Main函数启动 3. Android 界面启动 常常我们被告知, 主线程, UI线程, 因此这里很多会回答, 有两个线程, 一个线程是Main, 另外一个是UI. 如果答案是这样, 这篇文章就是写给你的。 OK, 我们以SWT为例, 设计以下方案寻找答案, 第一步, 我们看能否找到两个线程: 1. 从Main中启动SWT的界面, 在启动界面前, 将Main所在的线程打印出来这里设计为Shell中嵌入一个Button 2. 点击Button, 运行一个耗时很长的操作, 反复修改Button的文字, 在该线程中打印该线程的名称 代码是这样的: 1.public static void main(String[] args) { 2.final Display display = Display.getDefault(); 3.final Shell shell = new Shell();
4. shell.setSize(500, 375); 5. shell.setText("SWT Application"); 6. shell.setLayout(new FillLayout()); 7. btn = new Button(shell, SWT.NULL); 8. btn.setText("shit"); 9. registerAction(); 10. shell.open(); 11. https://www.360docs.net/doc/091647537.html,yout(); 12.while (!shell.isDisposed()) { 13.if (!display.readAndDispatch()) 14. display.sleep(); 15. } 16. shell.dispose(); 17. display.dispose(); 18.} 19.private static void registerAction() { 20. btn.addMouseListener(new MouseListener() { 21. @Override 22.public void mouseDoubleClick(MouseEvent e) { 23. // TODO Auto-generated method stub 24. } 25. @Override 26.public void mouseDown(MouseEvent e) { 27. methodA(); 28. } 29. @Override 30.public void mouseUp(MouseEvent e) { 31. } 32. }); 33.} 34./**
Android广播事件处理闹钟实例
Android广播事件处理闹钟实例 对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系 统中,linux实现的设备名为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或 者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并 发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间 还有一层封装,那就是JNI。 AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而 是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。 在android系统中,AlarmManage提供了3个接口5种类型的闹铃服务。 3个接口: 1. // 取消已经注册的与参数匹配的闹铃 2. void cancel(PendingIntent operation) 1. 2. //注册一个新的闹铃 3. void set(int type, long triggerAtTime, PendingIntent operation) 4. //注册一个重复类型的闹铃 5. void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 6. //设置时区 7. void setTimeZone(String timeZone) 5个闹铃类型 public static final int ELAPSED_REALTIME 1. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传 递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠 2. 时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是 3
Android复习题
Android复习题及答案 一、选择题 1. 下列哪些语句关于内存回收的说明是正确的?( ) A、程序员必须创建一个线程来释放内存 B、内存回收程序负责释放无用内存 C、内存回收程序允许程序员直接释放内存 D、内存回收程序可以在指定的时间释放内存对象 2. Android 中下列属于Intent的作用的是( ) A、实现应用程序间的数据共享 B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失 C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带 D、处理一个应用程序整体性的工作 3. 下面的对自定style的方式正确的是( ) A、
Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题new Thread( new Runnable() { public void run() { myView.invalidate(); } }).start(); 可以实现功能,刷新UI界面。但是这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 方法二:(Thread+Handler) 查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI。Handler myHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case TestHandler.GUIUPDATEIDENTIFIER: myBounceView.invalidate(); break; } super.handleMessage(msg); } }; class myThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = TestHandler.GUIUPDATEIDENTIFIER; TestHandler.this.myHandler.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } 以上方法demo看:https://www.360docs.net/doc/091647537.html,/blog/411860 方法三:(java习惯,不推荐) 在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类, Tim erTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的
主动发送事件 android
Testing和Instrumentation Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit 测试Android工程,但Android工具允许你为应用程序的各个方面进行更为复杂的测试,包括单元层面及框架层面。Android测试环境的主要特征有: ●可以访问Android系统对象。 ●Instrumentation框架可以控制和测试应用程序。 ●Android系统常用对象的模拟版本。 ●运行单个test或test suite的工具,带或不带Instrumentation。 ●支持以Eclipse的ADT插件和命令行方式管理Test和Test工程。 这篇文章是对Android测试环境和测试方法的简要介绍,并假设你已经拥有一定的Android应用程序编程及JUnit测试的经验。概要 Android测试环境的核心是一个Instrumentation框架,在这个框架下,你的测试应用程序可以精确控制应用程序。使用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态。Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。 通过在测试工程的manifest文件中添加
android多线程下载技术详解
Android 多线程、断点续传下载技术 1.为什么使用该技术? 答:(1)之所以采用多线程下载是因为考虑到手机,及移动设备的cup处理能力,让下载任务多抢占cup资源,从而加快了下载的速度,提高了用户体验 (2)断点续传技术,就是在下载过程中如果网络出现问题,导致文件没有下载完,那么下次下载时,接着上次终端位置继续下载,从而减轻了服务器的负担。 2.下面我们就开始建一个多线程下载的项目,来体验多线程下载的优势,项目的结构如下 2.1设计UI
main.xml 代码如下: android:text="@string/path" /> Android开发-触屏事件的获取和触摸屏幕位置 在修改后的工厂测试程序中,用到了关于触摸事件的获取,顺便学习关于触摸事件和触摸位 Java代码 1.publicbooleanonTouchEvent(MotionEventevent){ 2. 3.//获得触摸的坐标 4.floatx=event.getX(); 5.floaty=event.getY();switch(event.getAction()) 6.{ 7.//触摸屏幕时刻 8.caseMotionEvent.ACTION_DOWN: 9. 10.break; 11.//触摸并移动时刻 12.caseMotionEvent.ACTION_MOVE: 13. 14.break; 15.//终止触摸时刻 16.caseMotionEvent.ACTION_UP: 17.break; 18.} 19.returntrue; 20.} 的知识,其方法如下: 关于publicbooleanonTouchEvent(MotionEventevent)方法: 参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。 返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。 该方法并不像之前介绍过的方法只处理一种事件,一般情况下以下三种情况的事件全部由onTouchEvent方法处理,只是三种情况中的动作值不同。 屏幕被按下:当屏幕被按下时,会自动调用该方法来处理事件,此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN,如果在应用程序中需要处理屏幕被按下的事件,只需重新该回调方法,然后在方法中进行动作的判断即可。 屏幕被抬起:当触控笔离开屏幕时触发的事件,该事件同样需要onTouchEvent方法来捕捉,然后在方法中进行动作判断。当MotionEvent.getAction()的值为MotionEvent.ACTION_UP时,表示是屏幕被抬起的事件。 在屏幕中拖动:该方法还负责处理触控笔在屏幕上滑动的事件,同样是调用MotionEvent.getAction()方法来判断动作值是否为MotionEvent.ACTION_MOVE再进行处理。 完全理解Android TouchEvent事件分发 机制(二) 可以看出来,事件一旦被某一层消费掉,其它层就不会再消费了 到这里其实对事件分发的机制就有个大概了解,知道里面的原理是怎么回事。 下面就让我们来去梳理一下这个事件分发所走的逻辑。 我们仔细思考一下,为什么有的事件有UP有的没有? 为什么Up和Down的顺序不同呢? 为什么要按照这个顺序执行呢? 这个例子主要是为了说明分发、拦截、消费的流程 以例一为例,在每个View 都不拦截down 事件的情况下,down 事件是这样传递的 super.dispatchTouchEvent方法,上面我们介绍过, 这个方法内部实际上是调用的onTouchEvent方法 所以最后的输出日志顺序就是从父到子依次调用分发和拦截,然后从子到父依次调用消费。 例二也是同理,区别在于 当Father拿到事件的时候,选择了拦截下来不再询问其他, 但是Father也没消费,直接又还回给了Grandpa, Grandpa同样也没有消费这个事件。 所以最终的顺序就是,从Grandpa到Father再返回Grandpa就结束了,没有经过LogImageView。 例三的情况就不太一样了 当Grandpa->Father->LogImageView 传递到LogImageView时,LogImageView不消费又返回给了Father,Father在onTouchEvent消费掉了事件。 然后反馈给Father说事件已经消费。,就等于parent.dispatchTouchEvent返回true给上一级的Grandpa, Grandpa不会再调用grandpa.onTouchEvent方法。 从这里我们可以总结出来: **dispatchTouchEvent返回值的作用是用于标志这个事件是否“消费了”, 无论是自己或者下面的子一级用掉了都算是消费掉。** 再如这个例子中,如果我们让LogImageView消费掉事件, 那么Father收到LogImageView的消息后,也会调用parent.dispatchTouchEvent返回true给Grandpa, 所以这个方法返回值的true是只要用掉就行,无论自己还是下面某一级, 而非我把事件传递下去就是true了,下面没人消费最终其实还是返回false的。 至此,我们来总结一下这三个方法的大致作用: dispatchTouchEvent方法内容里处理的是分发过程。可以理解为从Grandpa->Father->LogImageView一层层分发的动作 dispatchTouchEvent的返回值则代表是否将事件分发出去用掉了,自己用或者给某一层子级用都算分发成功。比如Father消费了事件,或者他发出去给的LogImageView消费了事件,Android开发触屏事件的获取和触摸屏幕位置
完全理解AndroidTouchEvent事件分发机制(二)分析解析