正文内容
安卓个人心得体会
来源:盘古文库
作者:开心麻花
2025-09-13
1

安卓个人心得体会(精选5篇)

安卓个人心得体会 第1篇

个人事迹材料

我是经济管理系11级酒店管理专业的安卓。执笔书写人生路,且把书香铸青春。追逐梦想路,我们一路奋斗,一路拼搏。转眼间,大学的第一年即将结束,我也渐渐褪去初来时略显青涩的外衣,洋溢出属于自己这个年龄的成熟与魅力。

一年前,我还是一名在题海中奋斗的高中学生,怀着对未来满满的憧憬与希望,努力地追逐着自己最初的梦想。我就读于河北省平山县职业教育中心。期间,我担任过学习委员,体育委员等职务,管理班级的纪律,组织班级体的各类文化活动,同时还是宿舍的舍长,因为较好的组织能力,工作勤恳认真,我深受老师和同学的信任。我也参加了很多学校举办的竞赛,并获得了令人满意的成绩。中学时代,我曾获得校“三好学生”、“优秀学生”、“学习积极分子”等光荣称号。

进入大学,我依旧坚持为同学服务,锻炼自己的想法竞选班级干部。在同学的支持和老师的信任下,我担任了班级团支书的职务。在担任团支书将近一年的时间里,我一直兢兢业业,诚诚恳恳的工作,付出许多,也收获许多。通过近一年的团支书的工作,我收获了很多宝贵的经验,这使我的工作能力得到了很大的提高。我一直努力做好班级文化建设,为班级同学营造一个良好的学习氛围,增强班级成员的集体荣誉感。在此期间,班级也得到了较好的发展。通过认真细致的工作,我们班获得“班级文化一等奖”等荣誉。这些对于我工作的肯定进一步坚定了我努力做好工作的信念。一个没有领导者的集体是散乱的,同样,一个好的决策会增强集体的凝聚力,从而有更强的创造力。对以后的工作,我会在之前的基础上加强文化建设,找出不足并努力改进,将我们的班级发展成为一个在学院都出类拔萃的优秀班集体。

怀着梦想,我前行在大学的大道上,书写着自己三年的书香生涯,舒展着人生的美丽画卷。执笔书写人生路,且把书香铸青春。时间会在指尖慢慢流走,但我会把握好人生的每一分钟,我相信,做好自己,我能成功!我是一个乐观积极、奋力拼搏的男孩,骨子里有着一股永不服输的劲儿,在学习上我不甘落于人后,一直以认真严谨的态度来对待每一门功课。不放弃是我的任务,在现有的基础上争取更进步是我的职责。大学时代是学习现代科学知识的黄金时段,我们应该努力抓住这个机会,用知识武装我们的头脑。在校就读的时间里,我会一直严格要求自己,以身作则,为班级同学做好带头榜样作用。我合理安排调整自己的作息时间,分配学习、工作和休闲娱乐的时间,养成自己良好的生活习惯。我上课认真听讲,做好课堂笔记,积极思考老师提出的问题,课后认真独立完成老师布置的作业,不懂的问题及时向老师或同学请教,做好预复习工作,把所学知识学以致用,真正存进自己的脑海中。大一一学年,我获得了系举办的辩论赛的“最佳辩手”等荣誉。另外,我还利用空余时间阅读了一些课外书籍,借此拓宽自己的知识面,储备知识,增长见识,陶冶自己的情操。

身为一名共青团员,自入团以来就积极参加团组织的各类活动。进入大学,我更是努力提高自身的思想心理素质,自觉履行团员义务,也向党组织提交了入党申请。作为团支书,我以身作则,积极参加了系、院组织的各项活动,在活动中积累经验,实践理论。在班内,我努力尽职地向同学们传达上级的各项通知和精神要领,组织策划多次主题团日活动,弘扬社会主义道德风尚,严于律己,宽以待人,努力向党组织靠拢,争取早日入党,成为一名光荣的共产党员。

我活泼开朗、待人随和的个性让我与同学之间形成较好的朋友关系。我充分发挥自己较强的人际交往能力和语言表达能力。积极与舍友和周围宿舍的同学交流,处理好彼此之间的关系,并且协调好班级成员之间的关系和各项事宜。积极参加学院各类辩论比赛活动,并取得了优秀的成绩。参加各类集体活动,也开阔了我的视野,锻炼了我的沟通能力,团队协作能力,使我更自信更开朗,成熟稳重。

现在,大学生活将要过半,但青春依旧闪光,因为有梦想的翅膀,所以我们勇敢地翱翔天空。前方,道路依然漫长,在今后的学习生活中,我会更加努力,脚踏实地,一步一步走好人生的每一步,以更昂扬的姿态迎接每一次挑战,抓住每一次机遇,描绘属于自己的绚丽蓝图!最后,我希望团组织能考虑我的申请,我也会以实际行动来证明我自己,不辜负团组织和老师同学对我的期望。

经济管理系11级酒店管理

安卓 2012年5月9日

安卓个人心得体会 第2篇

性别 男

生日 1991.5

身高 163

籍贯 广西

民族 汉族

政治面貌 团员

毕业院校 桂林电子科技大学

学历 大专 专业 计算机信息管理

联系电话 ***********

电子邮件 ***@XXX.com

求职意向

应聘职位 Java/Android手机开发程序员

工作地点 北京市

期望薪资 根据我的能力给予我适当的工资

个人简介

本人毕业于桂林电子科技大学。在校表现优秀,热爱学习、有很强的自学能力,上进心强、乐于助人、工作耐心有责任感,不达目的不罢休。缺点就是太过追求完美的东西在校期间

担任过团支书,求学期间做过一些项目开发,如AndroidMP3播放器,Android***小游戏,Android****服务,新闻管理系统,图书管理系统,移动计费系统等,对Android非常痴迷,几乎到狂热状态希望公司能给我一个学习的机会,本人会奉献所有的激情为公司创造价值

爱好特长

Android、看书、听音乐

专业技能 1. Android移动开发,Android是Google的开源移动手机平台。了解Android的基本知识懂得四大组件。

2. 掌握Macromedia Dreamweaver 8、ASP基本语言、VB语言、Java、Java Web、MySQL、SQL Server、Struts、XML、SSH、J2EE。

3. 掌握Windows的基本办公软件、Macromedia Flash 8操作、Photoshop 7.0使用。

4. 熟悉软件测试网络环境配置,如:WEB服务配置,MySql5.1配置,Microsoft SQL Server配置。IIS配置。

5. 有一定的计算机基础知识,熟悉Windows操作系统。

6. 了解C、C++,能够看懂及进行简单初步的代码编写。 7. 了解数据库基础知识、SQL语言。

教育背景

时间 所在学校 所学专业 职业资格和学位

XX.9-.7 桂林电子科技大学 计算机信息管理 桂林电子科技大学

学历证书

社会实践

在XX―XX学年度荣获11级“三好学生”称号

参加红树林 “团结的力量”拓展训练培养团队意识 并获得证书

XX.2―XX.4在广东中山长虹工作

项目经验

Android 手机MP3播放器

简易MP3播放器,基本实现播放功能,播放,暂停,进度条,同步歌词及时间栏等,本项目为Android应用的实例开发。

本人在小组中担任developer角色,负责主要代码的编写其中包括Activity和Service之间服务的绑定,以及通过启用新的线程,将需要更新的信息通过Handler的Runnable加到主线程UI更新的队列中,实现滚动条随时间移动的效果,并通过滚动条反控制当前播放的时间,完成滚动条拖动时,时间随即更新且歌曲无干扰播放。

Android ***小游戏第一关 使用imagebutton,当点击时候发生事件,本身以及周围按钮实现图片反转,

图片用了Opera和Chrome,全部为opera图片时则通关

Android **服务

Activity和Service之间服务的绑定,取EditView的text通过服务的绑定取得Service对象,而后调用Service里面的业务逻辑处理方法,在textView去承装使用者的健康信息。

Java****棋

该项目涉及的技术要点一Java基础为主,技术难点就是数组的应用以及业务处理的逻辑,本人在项目开发中成该项目中地动态地图的实现,

职业目标 本人能以高度的责任心,敬业心,创业心与贵公司共创美好未来!希望贵公司给我一个展示自我能力的空间!

附:

在撰写个人简历的时候,能够巧妙的结合个人能力,铸就最出色简历,而个人的能力包括有很多方面,比如说技能上就包括有硬技能还有软技能。相对来说软技能更好些一些,不需要有专业证书,通过一些兴趣爱好就能够体现出来。

(1),沟通能力

不管是从事什么行业领域,所应聘的单位属于什么性质,沟通能力都是普遍使用的软技能。沟通能力不仅是上级对你的管理上需要, 也是你对下级交流上的需要。在一个组织中有交流就要有沟通能力。而沟通能力在个人兴趣爱好上⊥ü演讲、辩论赛等来体现出来,当然其他一些先关语言交流上的爱好也可以体现此方面的技能。

(2),团队精神

求职是来应聘企业单位或者其他事业单位的招聘,求职成功之后就要加入所对应的组织。而不管组织是属于怎样的性质,要能够提高其工作效率,需要人才要具有较高偶的团队精神。团队精神也是非常中遨游的软技能之一,可以通过一些团队性质的爱好来体现,例如足球、篮球等团队性的运动。

(3),战略意识

人才的战略意识也是个人的谋略能力,在企业管理上还有销售方面都需要有这种能力,战略意识也包括大局观,爱好棋类并在此方面有一定的造诣的人,则具有很高的战略能力以及意识。

如何将安卓安装到个人电脑上? 第3篇

不过等一下!安卓不是为智能手机而开发的吗?第一批搭载安卓的笔记本电脑不是有点让人失望吗?说到安卓在类似PC的环境下运行表现如何,不是还存在几个老大难问题吗?

是的,不用担心。引人入胜的安卓-x86项目已将谷歌的开源操作系统从智能手机和平板电脑上常见的ARM处理器,移植到普通电脑里面的x86芯片,所以你在掏钱购买体现计算融合理念的最新产品之前,可以在自己的电脑上试一把安卓。就算你没打算购买安卓电脑,在现有的电脑上体验一番安卓也是很有意思的事。

谷歌面向移动设备的操作系统在全尺寸、移动性不太强的电脑上到底表现如何呢?在虚拟机中测试一下安卓后,你就会有切身感受了。

为何使用虚拟机?

应当承诺,虚拟机的性能不如物理机,除非你有大量的系统资源可供支配。没错,你可以将安卓安装在电脑硬盘上,但我不建议你以双引导方式来运行这款特别的操作系统。

硬件是否支持这款操作系统,全凭运气;不过安卓-x86项目多少缓解了这个问题,它提供了围绕特定硬件(比如华硕和联想ThinkPad笔记本电脑)而制作的几个ISO映像文件。即便如此,在虚拟机中运行安卓比双引导运行安卓一贯来得更顺畅(相信我,我在三台电脑上作过尝试)。

不过,如果你还是想以双引导方式运行安卓,那么这方面的步骤与以双引导方式运行Windows 8基本上一样,至少在实际安装安卓之前是一样。之后,你需要看看下面的“将安卓安装到电脑上”章节部分。

不管你如何决定着手,都要获取某个虚拟机软件——本文使用了甲骨文公司出色而免费的VirtualBox,以及最新版本的安卓-x86移植版。要是有适用于你那款笔记本电脑的ISO映像文件,下载一份。

安装并运行VirtualBox

一旦你下载了所有相关软件,打开VirtualBox,点击任务栏中那个大大的蓝色Open(打开)按钮,就可以开始了。这时会出现Create Virtual Machine(创建虚拟机)窗口。可以为数字安卓电脑取你喜欢的任何名称,但务必要选择Linux作为操作系统的类型,选择Linux 2.6作为版本。点击Next(下一步)。

在随后出现的几个选项屏幕中,你得配置虚拟机的硬件分配参数。如果可以,至少分配512MB的内存,不过要是你在使用一台资源有限的电脑,安卓-x86也可以在256MB内存上运行。可供分配的内存越大,运行起来会越顺畅,不过你不希望分配太多的内存给安卓,以至于虚拟机处于活动状态时,你原本的计算体验大受影响。

使用默认选项,创建一个虚拟硬驱;如果你希望,还可以添加更多存储空间。(切记:安卓是为手机而开发的,所以它并不占用太多空间,哪怕安装了多个应用程序。)

好了!虚拟机出现在VirtualBox管理器中。

接下来,你需要将虚拟机指向你的安卓-x86 ISO映像文件。点击虚拟机管理器中的Storage(存储)按钮,然后在出现的窗口中,选择Controller: IDE(控制器:IDE)下面的Empty(空白)选项,调出右边的各个Attributes(属性)选项。在此,点击CD/DVD Drive(CD/DVD驱动器)右边的磁盘图标,从随后出现的下拉菜单中选择Choose a virtual CD/DVD disk file(选择一个虚拟CD/DVD磁盘文件)。只要浏览你的硬盘驱动,选择安卓-x86 ISO映像文件,即可将它装入到虚拟机。完毕后,最后点击OK(确定)。

不过,还没有大功告成。点击Audio(音频)选项,在随后出现的窗口中,点击Audio controller(音频控制器)下拉框,并选择ICH AC97。如果你任由它采用默认的Soundblaster 16设置,安卓虚拟机的音频就无法正常工作。

好了!现在,你可以准备将安卓安装到电脑上了。这个过程比平常的Windows安装要来得复杂一点。

将安卓安装到电脑上

点击VirtualBox左面板中安卓-x86虚拟机的名称,然后点击那个大大的绿色Start(开始)箭头。点击随后出现的任何对话框上的OK(确定)后——务必看清内容后点击,你马上会注意到:安装过程中无法使用鼠标。使用箭头键向下滚动到Installation(安装),然后按回车键。同样按回车键,选择下一个屏幕上的Create/Modify partitions(创建/修改分区)。

如果你平常使用图形化界面,下一个菜单可能会让你犯晕,但也没什么好怕的。只要浏览到New(新建),再次按回车键。选择Primary(主分区)作为分区类型,然后再按一次回车键,即可将分区设成默认大小。你会看到下面这个屏幕。

在Bootable(可引导)选项上按回车键,这应该会将Boot(引导)添加到Flags(标记)下方,就在电脑名称旁边。完成这一步后,选择Write(写入)选择。这时出现一则警告信息,提醒写到磁盘上会擦除已经在磁盘上的任何数据。谁在乎呢?对安装软件来说,这是虚拟机。键入yes,然后再按一下回车键。

高亮选中Quit(退出)选项,按回车键,返回到Choose Partition(选择分区)屏幕,现在它列出了你在虚拟硬驱上创建的那个sda1分区。再按一下回车键。你会看到格式化选项列表。选择ext3,按回车键,看到询问是否真想格式化磁盘时,选择Yes(确定)。

你应该安装引导装载程序GRUP吗?是的!看到系统询问时,还应该以读/写格式安装/system目录。

终于看到了我们期待已久的那个屏幕。可以运行安卓-x86了。

评估安卓

你会像在新的安卓手机或平板电脑上那样安装这款操作系统。过程相当简单直观,甚至可以将安卓-x86虚拟机连接到你的谷歌帐户。但在这么做之前,你需要设法模拟鼠标光标在屏幕上使用,因为通过键盘试图浏览针对触摸屏优化的操作系统让人抓狂。

点击VirtualBox任务栏中的Machine(机器),选择Disable Mouse Integration(禁用鼠标集成)。可能会出现对话框;如果出现,一路点击,继续下一步。禁用鼠标集成让你可以手动控制你的鼠标控制主操作系统还是控制安卓-x86。按键盘上右边的Ctrl按键即可在这两个操作系统之间切换。想进行滑动操作,点击并按住鼠标按键,然后移动鼠标。

搞定了这个问题,你就可以在电脑上随意使用安卓了!

别指望使用安装-x86的过程完美无缺。你无法将谷歌帐户的应用程序同步到虚拟机,尽管设置过程表明可以同步——至少目前还不能同步。(幸好,安卓-x86随带已安装的Google Play,我试过的大多数应用程序都可以顺畅运行,不过你可能会注意到偶尔会出差错。)这个虚拟化的操作系统也无法与我试过的任何触摸屏显示屏兼容。没错,不管你为安卓-x86分配了多大的内存,运行速度都有点慢。

话虽如此,不过在电脑上试一下安卓可以让你对在搭载安卓的笔记本电脑上运行可能会怎样有一个直观的了解。结果并不完美,但如果你作一下尝试,我想你最后会有惊喜。安卓不是为大屏幕开发的,但所有那些针对智能手机优化的应用程序都表现OK,其中大量应用程序完全免费,完全出色,是普通电脑上所没有的。

不管你信不信,安卓Gmail界面完胜丑陋的网络邮箱用户界面。

-沈建苗编译

安卓实习心得体会 第4篇

接下来说一下自己的体会。

一 心态

我们每个人都存在着一种心态,都想走捷径,这就像一种侥幸心理。其实学习有没有捷径可以走呢,肯定是有的,我认为最短的捷径就是不要走弯路就已经是捷径了。前辈们常说:“欲速则不达”,这句话存在肯定是有它的道理的,所以我们不能浮躁,要静下心来做好自己该做的事就可以了。

二 理论与实践相结合

为什么要理论与实践相结合呢?只有理论是不够的,它要通过实践才能更好的理解,也只有有了理论才能更好的实践,做出更好的东西。比如我们现在要写一段程序,只有看了书我们才知道是一个什么样的格式,也只有通过我们来编写程序才能知道理论知识是否已经掌握。有时候我在想,为什么老师能够将一段程序进行随意的更改,能够做到随心所欲呢?而我们自己该怎么学才好?其中的道理,我认为应该是将每一个类型的题目都搞懂,做到举一反三,那么就能一通百通。也就是说我们不能紧紧看中多做题,更重要的是要在搞懂各种类型的题的基础上去进行有针对性的练习,在不懂的时候尽量自己想办法解决,实在没办法再去请教高手,这样印象会更深刻,同时也能培养自己独特的编程思想。

三 培养自己对Android的兴趣

在这个时代,我们都知道软件开发是一个带着光环的职业,那么软件开发之路好不好走呢?其实老鸟们都回答了我们这个问题,用他们的话说,软件开发之路就是:编程---编程---再编程。实际上也是在说这条路是很枯燥的,需要培养自己对它的兴趣,兴趣是我们能够坚持下去的动力,而不能紧紧将它作为一种谋生的手段,这样会很累,说实话也对不起自己。说到这里,怎样培养自己的兴趣呢?第一,多了解一些Android和编程上有趣的事。比如说多去论坛转转,我们会发现其实那些老鸟是很幽默的,他们在枯燥的世界里还寻求着属于自己的一份甜蜜;第二,要让自己对它充满渴望。我们手上都有一本书,清华大学出版的《流动的世界》,我刚拿起这本书看的时候,觉得写的很无聊,我就想清华大学怎么会出这样的一本毫无价值的书?看着看着就有了不同的想法,它的存在是有它的价值的,这是一本漫天想象的书,主要讲的是对未来高技术的渴望和期盼,这些技术现在有些我们已经在用了,有些还没有被发明,而这份渴望和期盼就是我们前进的动力,它会引导我们对开发之路的产生兴趣。

安卓学习心得 第5篇

-----093380117

计算机应用(1)

张峰

1.关于Activity

1.在一个Activity中使用多个View

如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。首先,我们增加一个新的资源描述layout/second.xml。

除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。2.还是回到正道上,多个Activity之间的跳转

Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。

这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。

然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。

2.关于 Intent的使用

Intent分为两大类,显性的(Explicit)和隐性的(Implicit)。一般来说,intent要定位事件的目的地,无外乎需要以下几个信息: 1.种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。

2.类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。

3.组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。4.附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。

其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种松藕合的实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用,可手机上又有什么“较大”的系统呢?无非是可以与不同来源的多个应用之间方便地互操作而已,那么会是什么样的场景呢?比如,给QQ好友发送gmail邮件,用GoogleMap查找QQ好友所在的位置?看上去挺不错的。

关于这个ContentProvider,其实还有话说,它主要是的那些看似数据库操作的方法我们都没真正去实现呢。不过今天就到这里了,等下回再去研究吧。

3.关于ListActivity

准备一个List对象并借助Adapter就可以构造出一个列表。重载onListItemClick方法可以响应选择事件,利用第一个参数可以访问到这个ListView实例以得到选中的条目信息。这里有一点要说明的,就是如果更简单的话,其实连那个setContentView都可以不要了,Android也会自动帮我们构造出一个全屏的列表。但是本例中我们需要一个TextView来显示选中的条目,所以我们需要一个layout.mainb描述一下这个列表窗口。

这里需要注意的是那个ListView的ID,是系统自定义的android:list,不是我们随便取的,否则系统会说找不到它想要的listview了。然后,在这个listview之外,我们又增加了一个TextView,用来显示选中的条目。

再来说说这里用到的ArrayAdapter,它的构造函数中第二个参数是一个资源ID,ArrayAdapter的API文档中说是要求用一个包含TextView的layout文件,平台用它来显示每个选择条目的样式,这里的取值是R.layout.list_row,所以,我们还有一个list_row.xml文件来描述这个布局,相当简单。

从ArrayAdapter上溯到BaseAdapter,发现还有几个同源的Adapter也应该可以使用,象SimpleAdapter和CursorAdapter,还是做个例子来实验一下吧。

然后,在HelloTwoB中的onCreate函数中,修改代码,有几个不同:items的元素是HashMap实例,这是一点变化,然后构造函数除了要求items以外,还要求提供一个string[]来说明用hash表中的哪个字段显示在列表中,而后是一个资源ID的数组。

因为单纯的CursorAdapter是抽象类,所以我用的是它的子类SimpleCursorAdapter,很好理解,先用ContentResolver查询通讯簿得到一个游标,然后告诉SimpleCursorAdapter要用其中的People.NAME作为显示项来构造出一个adapter即可。4.关于Dialog

注意到android.app包下除了Dialog(可用于制作复杂的对话框)以外,还包括了几个系统定义好的对话框类,如DatePickerDialog、TimePickerDialog及AlertDialog。

其中AlertDialog我上回用过一次,基本上就那样子了,今天看看另外两个对话框的使用吧。

很简单的,无非是需要一个OnDateSetListener接口的实现而已,在它里面的dateSet方法中就可以得到选择的日期了。而TimePickerDialog与DatePickerDialog使用如出一辙。

看看另一个ProgressDialog的用法吧,这个类与AlertDialog一样包含了多个static的方法,所以使用起来是非常方便的。比如说,如果我们需要用它来表示一个长时间的操作。

5.关于Service和Notification

大略地看了一下android.app下的Service类,觉得它与Activity非常相似,只是要注意几个地方:

1.生命周期,Service的从onCreate()->onStart(int,Bundle)->onDestroy()显得更为简单。但是它的onStart是带参数的,第一个ID可用来标识这个service,第二个参数显示是用来传递数据的了。比较Activity,传递数据的Bundle是在onCreate就带进入的。

2.Service的启动由Context.startService开始,其实Activity或者Service都是Context的派生类。结束于Context.stopService()或者它自己的stopSelf()。

3.Service还有一个与Activity不一样的是它可以由另一个Context去绑定一个已存在的Service。就是这个方法Context.bindService(),被绑定的Service要求是已经onCreate了但可以没有onStart。在Service类中有个抽象方法getBinder()可以得到这个IBinder对象。关于这方面的细节,以后再看,这里只做个记录罢。

4.与Service有关的还有一个安全的问题,可以在AndroidManifest.xml中用标签来声明一个Service的访问权限,关于Android的安全问题也留待以后再解决吧。

6.GridView与ImageView

简单一点吧,就瞧瞧那个Grid的效果,Android提供了一个GridView,不过从APIDemo中看来,它似乎与PC上的GRID差别还是挺大的,更像那个IconView的感觉。不知道Android中如何实现表格界面?虽然在移动终端上,表格一般不会有谁使用,大家似乎更倾向于使用ListView,而Android对于ListView则有更简单的实现ListActivity。

很简单,只要重载几个方法就可以了,关键是那个getView方法,它负责构建出每个单元格中的对象实例。这里我们构造的是一个ImageView实例。

然后就是同样的将这个Adapter赋给GridView即可,大家可以看看效果,注意在做这个例子前,先放几个小图片到res/drawable目录下,buildproject一下就可以得到那个R.drawable.a了(这里的a是图像文件名,如a.png)。

在getView方法中我们使用了ImageView类,这又是一个widget。除了上面用到的几个方法以外,还有以下几个方法值得注意: 与图像来源有关的方法,我们只用了资源文件的方式。

还是习惯性跑题了,其实,我是想通过我对这个类的无数次Debugger跟进,说说它的多线程异步处理的解决策略的。他的基本策略如下: 1.当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程(后面会详述...),这个线程里面会构建一个消息循环。

2.获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。3.当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。4.在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。

5.构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。

6.主线程默认的AsyncQueryHandler类的handleMessage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。

7.用户重写的onXXXComplete方法开始工作。

这就是它偷偷摸摸做过的事情,基本还是很好理解的。我唯一好奇的是它的线程管理方式,我猜测他是用的单件模式。第一个AsyncQueryHandler的实例化会导致创建一个线程,从此该线程成为不死老处男,所有的ContentResolver相关的工作,都由该线程统一完成。个人觉得这种解决方式很赞。本来这个线程的生命周期就很难估量,并且,当你有一个ContentProvider的请求的时候,判断你会做更多的类似操作并不过分。就算错了,花费的也只是一个不死的线程(与进程同生死共存亡...),换来的却是简单的生命周期管理和无数次线程生死开销的节约。同时另外一个很重要的问题,他并会涉及到单件中数据同步的问题,每个类都有各自的Handler类,彼此互不干扰,分发可以分别进行。当多个数据请求的时候,在同一个ContentResolver上进行的可能微乎其微,这就避免了堵塞。总而言之,这套解决办法和Android的整体设计算是天作之合了。

所以建议,如果你有什么非ContentProvider操作,却需要异步多线程执行的话,模拟一套,是个不错的策略,当然,具体情况具体分析,生搬硬套是学不好马列主义的。

7.显示控件使用

Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。

从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。

一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。

一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有ListView 的Layout,还有simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。

除了这些要求,做好UI还有注意易用性和效率。快捷键是一个比较不错的选择,在 Activity中调用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以开启快捷键模式,然后你可以将菜单绑定到指定快捷键上就OK了。个人觉得Tip也是一个比较重要的东西,但目前观察看来,这个东西只能够自己提供了。界面的动态性有时候是不可避免的,比如说菜单就是一个需要经常根据光标位置提供不同的选项。这个东西Android很人道的考虑到了,你可以参看NodeList这个Sample。它采取的应该是一个静态模拟动态的方式,这样有助于提高速度。你也可以利用ViewInflate,动态从一个XML创建一个控件。成本据Doc说很大,不到万不得已不要使用。

8.Intent消息传递

在前面写Android的ContentProvider时候,可以看到那是基于观察者模式的一个消息传递方法。每一个Cursor、ContentResolver做为一个小的注册中心,相关观察者可以在这个中心注册,更新消息由注册中心分发给各个观察者。而在MFC或Winform中,都会形成一个消息网,让消息在网中流动,被各节点使用、吃掉或者在出口死掉。

相比之下,我个人觉得基于Intent的Android核心消息传递机制是有所不同的。它应该会有一个全局性的注册中心,这个注册中心是隐性的,整个Android系统中就那么一个。所有的消息接收者,都被隐形的注册到这个中心。包括Activity,Service和IntentReceiver。其实说隐形注册是不确切的,所有注册都还是我们手动告诉注册中心的,只是与传统的方式不一样,我们通常不是通过代码,而是通过配置文件来做。在应用的Manifest中,我们会为一些Activity或Service添加上Intent-filter,或在配置文件中添加项。这其实就相当于向系统的注册中心,注册了相关的Intent-filter和receiver(这个事情完全可以通过代码来做,只是这样就失去了修改的灵活性)。

当程序有一个消息希望发出去的时候,它需要将消息封装成一个Intent,并发送。这时候,应该是有一个统一的中心(恩,有可能Android底层实现的时候不是,但简单这样看是没问题的...)接受到这个消息,并对它进行解析、判定消息类型(这个步骤降低了耦合...),然后检查注册了相匹配的filter或receiver,并创建或唤醒接收者,将消息分发给它。这样做有很多好处。虽然这种传递有的时候不如点对点的传递快(这有些需要速度的地方,我们看到Android会通过直接通信来做),但有时候又因为它只经过一跳(姑且这么叫吧...),比复杂的流动又要更快。更重要的是,它耦合性低,在手机平台这种程序组件多变的条件下使用十分适合。并且它可以很容易实现消息的精确或模糊匹配,弹性很大。(我个人曾想在开发一个C++二次平台的时候引入这样的机制,但在C++中,建立一套完整的数据marshal机制不容易,相比之下,用java来做会简单很多...)

恩,废话说了很多,具体讲讲Android中Intent的使用。当你有一个消息需要传递,如果你明确知道你需要哪个Activity或者其他Class来响应的话,你可以指定这个类来接受该消息,这被称为显性发送。你需要将Intent的class属性设置成目标。这种情况很常见,比如startActivity的时候,会清楚当前Activity完了应该是哪个Activity,那就明确的发送这个消息。

但是,有的时候你并不确定你的消息是需要具体哪个类来执行,而只是知道接收者该符合哪些条件。比如你只需要有一个接收者能显示用户所选的数据,而不想制定某个具体的方法,这时候你就需要用到隐形发送(传统上,我们可能会考虑用多态,但显然这种方式更为灵活...)。在Android中,你可以为Intent指定一个action,表示你这个指令需要处理的事情。系统为我们定义了很多Action类型,这些类型使系统与我们通信的语言(比如在Activity里面加一个Main的filter,该activity就会做成该应用的入口点),当然你也可以用于你自己的应用之间的通信(同样当然,也可以自定义...)。强烈建议,在自己程序接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。当然只有Action有时候是不够的,在Android中我们还可以指定catalog信息和type/data信息,比如所有的显示数据的Activity,可能都会响应View action。但很多与我们需要显示的数据类型不一样,可以加一个type信息,明确的指出我们需要显示的数据类型,甚至还可以加上一个catalog信息,指明只有你只有按的是“中键”并发出这样的消息才响应。从上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注册中心会根据这些信息帮你找到符合的接收者。其中class是点对点的指示,一旦指明,其他信息都被忽略。Intent中还可以添加key/value的数据,发送方和接收方需要保持统一的key信息和value类型信息,这种数据的marshal在java里做,是不费什么力气的。

Android的Intent发送,可以分成单播和广播两种。广播的接收者是所有注册了的符合条件的IntentReceiver。在单播的情况下,即使有很多符合条件的接收者,也只要有一个出来处理这个消息就好(恩,个人看法,没找到确切条款或抉择的算法,本来想实验一下,没来得及...),这样的情况很容易理解,当你需要修改某个数据的时候,你肯定不会希望有十个编辑器轮流让你来处理。当广播不是这样,一个receiver没有办法阻止其他receiver进行对广播事件的处理。这种情况也很容易理解,比如时钟改变了,闹钟、备忘录等很多程序都需要分别进行处理。在自己的程序的使用中,应该分清楚区别,合理的使用。

9.ContentProvider数据模型

数据库操作

从我目前掌握的知识来看,SQLite比较轻量(没有存储过程之类的繁杂手段),用起来也比较简单。实例化一个SQLiteDatabase类对象,通过它的APIs可以搞定大部分的操作。从sample中看,Android中对db的使用有一种比较简单的模式,即派生一个 ContentProviderDatabaseHelper类来进行SQLiteDatabase对象实例的获取工作。基本上,ContentProviderDatabaseHelper类扮演了一个singleton的角色,提供单一的实例化入口点,并屏蔽了数据库创建、打开升级等细节。在ContentProvider中只需要调用ContentProviderDatabaseHelper的openDatabase方法获取SQLiteDatabase的实例就好,而不需要进行数据库状态的判断。URI 像进行数据库操作需要用SQL一样,对ContentProivder进行增删改查等操作都是通过一种特定模式的URI来进行的(ig:content: //provider/item/id),URI的能力与URL类似,具体细节可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder类并实现insert, delete, update等抽象函数即可。在这些接口中比较特殊的是getType(uri)。根据传入的uri,该方法按照MIME格式返回一个字符串(==!没听过的诡异格式...)唯一标识该uri的类型。所谓uri的类型,就是描述这个uri所进行的操作的种类,比如content://xx/a与 content://xx/a/1不是一个类型(前者是多值操作,后者是单值),但content://xx/a/1和content://xx/a/2 就会是一个类型(只是id号不同而已)。

在ContentProvider通常都会实例化一个ContentURIPraser来辅助解析和操作传入的URI。你需要事先(在static域内)为该ContentURIPraser建立一个uri的语法树,之后就可以简单调用 ContentURIPraser类的相关方法进行uri类型判断(match方法),获取加载在uri中的参数等操作。但我看来,这只是在使用上简化了相关操作(不然就需要自己做人肉解析了...),但并没有改变类型判定的模式。你依然需要用switch...case...对uri的类型进行判断,并进行相关后续的操作。从模式来看,这样无疑是具有强烈的坏味道,类似的switch...case...代码要出现N此,每次一个 ContentProvider做uri类型的增减都会需要遍历修改每一个switch...case...,当然,如果你使用模式(策略模式...)进行改造对手机程序来说无疑是崩溃似的(类型膨胀,效率降低...),所以,只能是忍一忍了(恩,还好不会扩散到别的类中,维护性上不会有杀人性的麻烦...)。增删改查

ContentProvider 和所有数据源一样,向外提供增删改查操作接口,这些都是基于uri的指令。进行insert操作的时候,你需要传入一个uri和 ContentValues。uri的作用基本就限于指明增减条目的类型(从数据库层面来看就是table名),ContentValues是一个 key/value表的封装,提供方便的API进行插入数据类型和数据值的设置和获取。在数据库层面上来看,这应该是column name与value的对应。但为了屏蔽ContentProvider用户涉及到具体数据库的细节,在Android的示例中,用了一个小小的模式。它为每一个表建一个基于BaseColumn类的派生类(其实完全可以不派生自BaseColumn,特别当你的表不基于默认的自动id做主键的时候),这个类通常包括一个描述该表的ContentURI对象和形如 public static final TITLE = “title”这样的column到类数据的对应。从改变上角度来看,你可以修改column的名字而不需要更改用户上层代码,增加了灵活性。insert方法如果成功会返回一个uri,该uri会在原有的uri基础上增加有一个row id。对于为什么使用row id而不是key id我想破了脑袋。到最后,我发现我傻了,因为ContentProvider不一定需要使用数据库,使用数据库对应的表也可以没有主键,只有row id,才能在任何底层介质下做索引标识。

但,基于row id在删除和修改操作是会造成一定的混乱。删除和修改操作类似。删除操作需要传入一个uri,一个where字串,一组where的参数(做条件判定...),而修改操作会多一个ContentValues做更新值。着两个操作的uri都支持在末尾添加一个row id。于是混乱就出现了。当在where参数中指明了key id,而在uri中提供了row id,并且row id和key id所指函数不一致的时候,你听谁的?示例代码中的做法是完全无视row id(无语...),如此野蛮的方式我估计也只能在示例中出现,在实际中该如何用,恩,我也不知道。幸运的是,我看了下上层对 ContentProvider的删除操作,其实都不会直接进行,而是通过调用Cursor的delete方法进行,在这前提下,我想Cursor会处理好这些东西吧。

最后一个操作是查询操作,可以想见,查询的参数是最多的,包括uri和一组条件参数。条件参数类型和标准的sql类似,包括 sort, projection 之类的。从这些参数到sql语句的生成,可以寻求QueryBuilder类的帮助,它提供了一组操作接口,简化了参数到sql的生成工作,哪怕你不懂 sql都完全没有问题(这话说的我自己都觉得有点悬...)。查询返回一个Cursor。Cursor是一个支持随机读写的指针,不仅如此,它还提供了方便的删除和修改的API,是上层对ContentProvider进行操作一个重要对象,需要仔细掌握(Cursor还可以绑定到view上,直接送显,并与用户进行交互,真是程序越往上,封装越好,工作越机械没有复杂性了...)。数据模型

在与界面打交道的Cursor、ContentResolver等数据操作层中,大量采用观察者模式建立数据层与显示层的联系。一个显示层的视图,可以做成某一种观察者注册到Cursor或ContentResolver等数据中间层中,在实现底层ContentProvider中,我们需要特别注意在对数据进行修改操作(包括增删改...)后,调用相应类型的notify函数,帮助表层对象进行刷新(还有一种刷新方式是从一个view发起的)。可以看到 Android的整体数据显示框架有点像MVC的方式。Cursor、ContentResolver相当于控制层,数据层和显示层的交互通过控制层来掌管,而且控制层很稳定不需要特别定制,通常工作只在定制数据层和显示层空间,还是比较方便和清晰的。

10.学习感想

相关文章
保健品网络营销方案

保健品网络营销方案

保健品网络营销方案(精选8篇)保健品网络营销方案 第1篇消费者需要的不是产品,而是成功幸福新生活。他们需要的不是化妆品,而是年轻漂亮...

1
2025-09-15
部分现代服务业

部分现代服务业

部分现代服务业(精选11篇)部分现代服务业 第1篇在我国现行的税制结构当中,存在着营业税和增值税两个并行的流转税税种,增值税主要集中在...

1
2025-09-15
办公自动化发展

办公自动化发展

办公自动化发展(精选12篇)办公自动化发展 第1篇办公自动化系统,是现代的管理中管理者常用的办公室辅助管理系统,它通过将先进的网络电子...

1
2025-09-15
巴林右旗组织部实施品牌战略加强自身建设

巴林右旗组织部实施品牌战略加强自身建设

巴林右旗组织部实施品牌战略加强自身建设(精选6篇)巴林右旗组织部实施品牌战略加强自身建设 第1篇实施“四比一提高”品牌战略 加强自身...

1
2025-09-15
部队首长在2015级军训总结大会上的讲话范文

部队首长在2015级军训总结大会上的讲话范文

部队首长在2015级军训总结大会上的讲话范文(精选7篇)部队首长在2015级军训总结大会上的讲话范文 第1篇部队首长在2015级军训总结大会上的...

2
2025-09-15
办理医保转移委托书

办理医保转移委托书

办理医保转移委托书(精选14篇)办理医保转移委托书 第1篇如何办理医保转移手续太原日报网 2011-03-17 11:23来源:太原日报市民李女士在...

1
2025-09-15
病虫害危害范文

病虫害危害范文

病虫害危害范文(精选9篇)病虫害危害 第1篇1 秀珍菇主要病虫害的危害特征1.1病害秀珍菇常见的病害有生理性病害和侵染性病害2类。1.1.1生...

1
2025-09-15
保护汉江作文范文

保护汉江作文范文

保护汉江作文范文(精选6篇)保护汉江作文 第1篇保护汉江作文汉江在我心中好似一颗不可缺少的明珠。它也是长江的一大支流。汉江是一条非常...

1
2025-09-15
付费阅读
确认删除?
回到顶部