第一篇:Android日常开发总结的技术经验60条
Android日常开发总结的技术经验60条
存在多个不同的dbhelper实例情况下,sqlitedatabase对象必然存在不同的实例,多线程同时写入数据,轮流写入数据时会不定时的报db is locked,引起崩溃,不管是操作同张表还是异表。读和写可以同时并发,轮流无规律的交替执行。同时写入数据时解决方案是用并发的每个线程都用事务,db则不会lock,按次整体写入。
作者:佚名来源:安卓开发精选|2017-01-10 19:06 收藏 分享
1.全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效。
2.数据库表段字段常量和SQL逻辑分离,更清晰,建议使用Lite系列框架LiteOrm库,超级清晰且重心可以放在业务上不用关心数据库细节。
3.全局变量放全局类中,模块私有放自己的管理类中,让常量清晰且集中.4.不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一职责原则,一个类专心做好一件事情更为清晰。
5.如果数据没有必要加载,数据请务必延迟初始化,谨记为用户节省内存,总不会有坏处。
6.异常抛出,在合适的位置处理或者集中处理,不要搞的到处是catch,混乱且性能低,尽量不要在循环体中捕获异常,以提升性能。7.地址引用链长时(3个以上指向)小心内存泄漏,和警惕堆栈地址指向,典型的易发事件是:数据更新了,ListView视图却没有刷新,这时Adapter很可能指向并的并不是你更新的数据容器地址(一般为List)。
8.信息同步:不管是数据库还是网网络操作,新插入的数据注意返回ID(如果没有赋予唯一ID),否则相当于没有同步。
9.多线程操作数据库时,db关闭了会报错,也很可能出现互锁的问题,推荐使用事务,推荐使用自动化的LiteOrm库操作。
10.做之前先考虑那些可以公用,资源,layout,类,做一个结构、架构分析以加快开发,提升代码可复用度。
11.有序队列操作add、delete操作时注意保持排序,否则你会比较难堪喔。12.数据库删除数据时,要注意级联操作避免出现永远删不掉的脏数据喔。13.关于形参实参:调用函数时参数为基本类型传的是值,即传值;参数为对象传递的是引用,即传址。
14.listview在数据未满一屏时,setSelection函数不起作用;ListView批量操作时各子项和视图正确对应,可见即所选。控制Activity的代码量,保持主要逻辑清晰。其他类遵守SRP(单一职能),ISP(接口隔离)原则。
16.arraylist执行remove时注意移除int和Integer的区别。你懂得。
17.Log请打上Tag,调试打印一定要做标记,能定位打印位置,否则尴尬是:不知道是哪里在打印。
18.码块/常量/资源可以集中公用的一定共用,即使共用逻辑稍复杂一点也会值得,修改起来很轻松,修改一种,到处有效。
19.setSelection不起作用,尝试smoothScrollToPosition。ListView的LastVisiblePosition(最后一个可见子项)会随着getView方法执行位置不同变动而变。
20.与Activity通讯使用Handler更方便;如果你的框架回调链变长,考虑监听者模式简化回调。
21.监听者模式不方便使用时,推荐EventBus框架库,使用时间总线,没接触过的同学可以自行脑补一下哦。
22.Handler在子线程线程使用Looper.prepare,或者new的时候给构造函数传入MainLooper来确保在主线程run。23.timepicker 点击确定后需要clearFocus才能获取手动输入的时间。
24.构造函数里面极度不推荐启动异步线程,会埋下隐患。比如:异步线程调用了本例的示例,就会悲剧等着崩溃吧。
25.千万不要理所当然的以为一个对象不会为空,充分的做好容错处理;另外注意null也可以插入ArrayList等容器中。
26.ExpandableListView的子列表不能点击(禁用)要把Adapter的isChildSelectable方法返回true。
27.UI显示注意内容过长的情形要提前使用ScrollView否则在小手机上尴尬你懂得。
28.注意按钮的感应范围不小于9mm否则不易点击;输入框注意光标的位置更易用户输入。
29.服务器和客户端尽量统一唯一标识(有可能是ID),否则多少会有歧义和问题。30.注释,尽量去写足够的注释,去描述一下思路,达到看了可以明白某一块代码的效果。
31.完整型数据一定要用Sqlite的Transaction,大数据一定要用。粗略测试插入100个数据有20倍的提速,插入1000个数据就有100多倍的提速。
32.避免String=”null”的情况出现String = null,=””都可以。避免出现title=”无主题”这样的数据提交到数据库浪费空间。
33.存在多个不同的dbhelper实例情况下,sqlitedatabase对象必然存在不同的实例,多线程同时写入数据,轮流写入数据时会不定时的报db is locked,引起崩溃,不管是操作同张表还是异表。读和写可以同时并发,轮流无规律的交替执行。同时写入数据时解决方案是用并发的每个线程都用事务,db则不会lock,按次整体写入。
34.建议整个应用维护一个dbhelper实例,只要db没有关闭,全局就只有一个db实例,多线程并发写入db不会lock,严格交替进行写入:123123123。。(123代表不同线程,轮流插入一个记录),读和写均不会锁住db,读写交替并没有规律,执行次数和程度看cpu分配给哪个线程的时间片长。
35.一个任务使用事务嵌套N个事务,N个事务中有一个失败,这个任务整体失败,全部成功后,数据才写入,具有安全性,整体性。并且事务写入大批量数据的效率经实际测试成百上千倍的高于一般的单个写入。数据库大量数据、多线程操作建议使用LiteOrm数据库框架,更稳定简单。36.经常需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。37.Long a;判断a有没有赋值,if(a == 0)在a没有赋值情况下会报错。应该if(a == null),Integer、Floag等也一样,原因你懂,只是提醒你要小心喔。
38.编码遇到读写、出入等逻辑要双向考虑,文件导入导出,字符字节相互转换都要两边转码。
39.一个 int 值与一个 Integer 对象(能包含 int 值的最小对象)的大小比率约为 1:4(32位和64位机器有不同)。额外的开销源于 JVM 用于描述 Java 对象的元数据也就是 Integer,(Long、Double等也是)。
40.对象由元数据和数据组成。元数据包括类(指向类的指针,描述了类的类型),标记(描述了对象状态,如散列码、形状等),锁(对象同步信息)。数组对象还包括大小的元数据。
41.一个在 32 位 Java 运行时中使用 1GB Java 堆的 Java 应用程序在迁移到 64 位 Java 运行时之后,通常需要使用 1.7GB 的 Java 堆。
42.Hash 集合的访问性能比任何 List 的性能都要高,但每条目的成本也要更高。由于访问性能方面的原因,如果您正在创建大集合(例如,用于实现缓存),那么最好使用基于 Hash 的集合,而不必考虑额外的开销。
43.对于并不那么注重访问性能的较小集合而言,List 则是合理的选择。ArrayList 和 LinkedList 集合的性能大体相同,但其内存占用完全不同:ArrayList 的每条目大小要比 LinkedList 小得多,但它不是准确设置大小的。List 要使用的正确实现是 ArrayList 还是 LinkedList 取决于 List 长度的可预测性。如果长度未知,那么正确的选择可能是 LinkedList,因为集合包含的空白空间更少。如果大小已知或可预知或比较小,那么 ArrayList 的内存开销会更低一些。43.选择正确的集合类型使你能够在集合性能与内存占用之间达到合理的平衡。除此之外,你可以通过正确调整集合大小来最大化填充率、最小化未得到利用的空间,从而最大限度地减少内存占用。
44.充分利用封装(提供接口类来控制访问数据)和委托(helper对象来实施任务)两种理念。45.延迟分配 Hashtable:如果 Hashtable 为空是经常发生的普遍现象,那么仅在存在需要存储的数据时分配 Hashtable 应该是一种合理的做法。将 Hashtable 分配为准确的大小:虽然会有默认大小,但建议使用更为准确的初始大小。46.EditText在setText时不要忘记是否需要setSelection。在大多数情况下是需要设置的。
47.XML两种情况要注意:1 属性名字时候有重复;2 注意文本是否包含非法字符,注意使用CDATA包裹。
48.当逻辑没有明显问题时考虑对象属性、函数参数、网络传输参数是否全部了解,是否设置正确。
49.当出现编译或者运行时错误,别人那没问题时,考虑你的编译环境和环境版本是否有问题。
50.由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuilder提升性能,多线程使用StringBuffer操作string提高程序效率。
51.java 栈的优势是比堆速度快,可共享,主要存放临时变量、参数等,堆的优势是可动态分配内存大小。
52.只要是用new()来新建对象的,都会在堆中创建,而且其数据是单独存值的,即使与栈中的数据(值)相同,也不会与栈中的数据共享。
53.基本数据类型定义的变量称自动变量,存的是‘字面值’,存在于栈中,可共享(存在即不新建)。
54.多个RandomAccessFile对象指向同一个文件,可使用多个线程一起写入无需再自己加锁,经试验结论:三个线程分别写入100万次数据,使用锁约12秒,不使用约8.5秒。100个线程分别写入1万次数据使用锁耗时约4.2秒,不使用锁耗时约3秒。
55.XmlPullParser解析慎用nextText()方法,xml比较复杂,含有空标签、重复名字标签时容易出现异常问题;TEXT中使用getText()方法代替START_TAG中使用nextText()方法;START_TAG,TEXT,END_TAG三个事件配合使用。注意每个xml节点之间(不管是开始节点还是结束节点)都会出现TEXT事件。
56.改变逻辑的时候考虑全部用到这项功能的地方,分散的地方多了,容易大意。57.当系统原生组件出现问题时,查看错误栈信息,自己写一个该组件的子类,并在合适的地方将出错方法复写一下,加上try catch保证不崩溃掉。不要扰乱了该系统控件的正常逻辑。
58.输入控件注意对空格、换行等符号的控制;输入框里内容注意和左右控件的空间,防止误点击。
59.注意函数参数里的++或者–操作。是++c 还是 c++,区别很大。
60.各种地方、永远的不要小看null指针问题,甚至有些场合宁可错杀(try catch),不可放过。
【编辑推荐】
1.Android快速实现微信支付
2.Android嵌套滑动机制NestedScrolling 3.我的Android开发实战经验总结
4.用Jenkins自动化构建Android和iOS应用 5.Android轻松实现RecyclerView悬浮条
第二篇:Android高级开发技术教学大纲
《Android高级开发技术》课程教学大纲
课程名称(中文):Android高级开发技术
课程名称(英文):Advanced Android Development Technology 适用专业:计算机科学与技术、软件工程、网络工程 课程类别及课程模块:学科专业课程/特色创新课程 课程编码:11A023 学分/开课学期和周学时/学时类型/折算后总学时:
学分:
开课学期: 6
周学时:2+2 学时类型: 理论+实践
折算后总学时:64 教材名称及作者、出版社、出版时间、版次:《第一行代码Android第2版》,郭霖,北京:人民邮电出版社, 2016 大纲主笔人:樊相奎 大纲审定人:李贵洋
一、课程的目的、要求和任务
近几年移动终端的开发发展迅速,相关公司越来越多,随着时间的推移,预计社会对移动终端开发领域人才的需求量也会迅速增多。据悉,在成都的软件开发企业中,有多数企业都或多或少涉及移动终端开发领域。对于移动终端开发平台,目前市场占有率最高,未来发展最有希望是iOS和Andriod开发平台。其中Andriod由具有极度创新能力的Google公司开发,同时Andriod采用开源方式,引入了大量合作开发伙伴,目前全世界有大量的公司采用Andriod作为移动终端开发平台,包括三星、华为、小米等。
开设本课程的目的是使学生比较全面地了解和掌握移动终端设计的基本概念、原理及相关技术,为以后的深入学习打下坚实的基础。具体要求和任务是掌握Andriod移动终端开发平台的具体开发语言、开发工具、调试方法等相关技术。
二、大纲基本内容及学时分配
(一)Android开发起步(2课时)1.2.3.4.5.Android平台简介、背景介绍和平台架构 Android开发环境的搭建,相关软件的下载与安装 虚拟设备的创建和使用 创建“Hello Android” Android应用程序的调试
说明:
(1)基本要求:介绍Android开发起步的相关知识,包括 Android平台Android的背景及其应用程序的框架,通过让学生完成一个hello world app的开发,体验一个android开发过程;
(2)教学重点:Android平台Android的背景及其应用程序的框架,搭建Android的开发环境,使用开发平台创建Android项目;(3)教学难点:平台架构,Android应用程序的调试;
(二)Android应用程序的构成(4课时)
1.2.3.4.5.6.7.8.Android系统架构 Activity生命周期 Android界面的布局 服务—Service 三大组件间通信—Intent AndroidManifest.xml解析 共享数据—content Provider 通知用户—Android Notification
9.Android应用程序的生命周期
说明:
(1)基本要求:主要对Android的基本组件及Android应用程序的构成进行介绍,同时还将对Android应用程序的生命周期进行分析,主要目的是让读者了解Android应用程序的构成,掌握Android基本组件的特性及使用方法。(2)教学重点:了解Android应用程序的构成,掌握Android基本组件的特性及使用方法,Activity以及Intent的概念及使用;
(3)教学难点:掌握应用程序的生命周期以及具体使用场景;
(三)Android布局管理器(4课时)
1.2.3.4.5.6.控件类概述,View类简介、ViewGroup类简介
线性布局,LinearLayout类简介、线性布局案例
表格布局,TableLayout类简介、表格布局案例
相对布局,RelativeLayout类简介、相对布局案例
帧布局,FrameLayout类简介、帧布局案例
绝对布局,AbsoluteLayout类简介、绝对布局案例
说明:
(1)基本要求:介绍的内容为Android平台下的布局管理器。Android中的布局包括线性布局、表格布局、相对布局、帧布局和绝对布局,分别对每个布局管理器进行详细的介绍。
(2)教学重点:了解Android平台下的布局管理器及使用方法;(3)教学难点:布局管理器的嵌套使用,如何合理有效的使用嵌套布局;
(四)Android常用基本控件(2课时)
1.2.文本控件的介绍,TextView类简介、EditText类简介以及使用案例
按钮控件,Button类简介、ImageButton类简介、Patch图片简介以及Patch图片使用案例
3.4.状态开关按钮,ToggleButton类简介以及开关按钮的使用
单选按钮与复选按钮,CheckBox和RadioButton类简介以及单选按钮和复选按钮使用案
5.6.图片控件,ImageView类简介以及图片查看器
时钟控件,AnalogClock和DigitalClock类简介以及时钟控件使用案例 7.日期与时间选择控件,DatePicker类简介、TimePicker类简介以及日期时间控件使用案例
说明:
(1)基本要求:对进行用户界面开发时常用到的Android基本控件进行介绍,主要包括文本框、按钮、单选按钮和复选按钮、状态开关按钮和日期时间控件等,了解这些基本控件的工作方式有助于学习后面要介绍的Android中的高级控件。(2)教学重点:掌握Android基本控件及使用方法;(3)教学难点:不用布局文件,直接代码生成控件;
(五)Android常用高级控件(4课时)
1.2.3.4.5.6.7.8.自动完成文本框,AutoCompleteTextView类简介以及自动完成文本使用案例
下拉列表控件,Spinner类简介以及下拉列表使用案例
列表视图,ListView类简介以及列表视图使用案例
网格视图,GridView类简介以及网格视图使用案例
画廊控件,Gallery类简介以及画廊控件使用案例
滚动视图,ScrollView类简介以及滚动视图使用案例
选项卡,TabHost类简介以及选项卡使用案例
滑块、进度条与星级滑块,ProgressBar、SeekBar、RatingBar类简介以及使用案例
说明:
(1)基本要求;上一章已经介绍了Android中的一些基本控件,本章对Android中常用的高级控件逐一进行介绍。
(2)教学重点:掌握Android常用高级控件及使用方法;(3)教学难点:BaseAdapter适配器的概念以及使用;
(六)菜单与对话框(4课时)
1.菜单功能的开发,包括选项菜单和子菜单简介、选项菜单和子菜单使用案例、上下文菜单
2.对话框功能的开发,包括对话框简介、普通对话框、列表对话框、单选按钮对话框、复选框对话框、日期及时间选择对话框、进度对话框
3.消息提示,Toast的使用,Notification的使用
说明:
(1)基本要求:介绍用户界面中菜单与对话框的开发,同时还会对Android平台下的Toast和Notification进行介绍。
(2)教学重点:掌握Android常用菜单和对话框的概念和使用;(3)教学难点:Notification的概念和使用;
(七)Android事件处理模型(2课时)
1.了解Android中的事件处理概念和模型;基于回调机制的事件处理,基于监听接口的事件处理。
2.掌握Android中的事件处理具体方法,包括OnClickListener、OnLongClickListener、OnFocusChangeListener、OnKeyListener、onTouchEvent、OnCheckedChange、OnItemSelected、日期和时间监听事件等;
3.说明:
(1)基本要求:对Android平台用户界面的各种事件响应进行详细介绍,加深对Android平台的事件处理模型的理解,熟练掌握控件的各种事件处理方法。
(2)教学重点:掌握Android中的事件处理概念以及具体的常用事件及其处理方法;(3)教学难点:理解基于回调机制和基于监听接口事件处理机理;
(八)消息广播与服务(2课时)
1.2.BroadcastReceiver组件,BroadcastReceiver类简介,基于广播的案例
Service组件,Service类简介,基于服务的案例
说明:(1)基本要求:在很多应用程序中,都会通过广播形式来发送和接收消息,当应用程序接收到消息后,一般启动一个Activity或者一个Service进行处理。本章对服务组件Service进行详细介绍,章末通过对一个单机版的音乐播放盒的介绍帮助掌握服务组件的使用方法。
(2)教学重点:对Android的消息广播机制及服务组件运行机理和具体使用方法;(3)教学难点:广播Broadcast、服务Service的运行机制和处理原理;
(九)多线程及消息处理(4课时)
1.2.3.4.Android多线程,概述、创建线程、操作线程 UI线程与非UI线程
多线程中的常用类,包括Handler类、AsyncTask类、Timer定时器等 Android多线程通信机制
说明:
(1)基本要求:了解线程的概念、生命周期,通过实例学习,掌握多线程的创建、使用以及多种具体事项方式。
(2)教学重点:对Android的多线程运行机理和具体使用方法;(3)教学难点:线程同步;
(十)数据处理(4课时)
1.掌握SharedPreferences的使用方法 2.3.4.5.6.掌握各种文件存储的区别与适用情况 了解SQLite数据库的特点和体系结构 掌握SQLite数据库的建立和操作方法 理解ContentProvider的用途和原理(选讲)掌握ContentProvider的创建与使用方法(选讲)
说明:
(1)基本要求:本章要介绍访问手机存储卡的方法及如何在程序中使用SQLite数据库。(2)教学重点:掌握Android数据存储的相关机制和具体使用方法;(3)教学难点:SQLite数据库的具体使用;
授课内容及学时说明:前述大纲章节及学时分配是本门课程指导性意见,针对不同专业学生以及具体授课情况,授课教师对具体章节的内容及学时可进行适当调整,但主要章节知识点(除可选部分)需要覆盖到。
三、与其他课程的关系
1.先行课程:数据库原理、Java 2.后续课程:无
四、考核方式
考核形式:考查
评分标准:平时成绩占30%(主要考察课堂与上机考勤、实验等方面),两次阶段性上机考试占40%,期末作品占30%。
五、参考书目
1.明日科技编著,《Android从入门到精通》,北京:清华大学出版社, 2016 2.李刚编著,《疯狂Android讲义(第3版)》,北京:电子工业出版社, 2015 3.(美)Erich Gamma等著,《设计模式》,北京:机械工业出版社,2013
第三篇:Android项目开发总结
项目开发总结报告
1引言
1.1编写目的
总结开发经验与学习中的不足
1.2背景
以方便用户记录日常学习心得,生活体会为目的,进行主题为“随心笔记”的应用开发
2实际开发结果
2.1产品
2.2主要功能和性能
能够查看笔记的目录,记录笔记完成时间。能够改变主题颜色,目录排版方式,拥有简洁的主题。对于涂鸦功能,插入图片,密码锁等功能未能实现。
3开发工作评价
3.1对产品质量的评价
本应用拥有简单实用的功能,能够满足一般用户的需要
3.3对技术方法的评价
开发中使用了软件工程中的增量开发模型,黑盒测试等技术,使开发逐步向前发展
3.4出错原因的分析
对于部分Android版本支持性不好,不能正常使用安装等
4经验与教训
通过这次开发,我们体验了开发不易,需要很多人员的合作。开发过程中,必须明确整体目标,不能东一榔头,西一棒槌。另外由于学习时间短,对很多东西都不太了解,还好通过CSDN等一些网站能够找到有益的帮助,感谢那些博客,论坛。
第四篇:Android编程开发入门学习经验
Android编程开发入门学习经验
首先说一下,之所以选择android培训,主要有下面几个原因:因为我不是计算机专业,一些计算机语言高级的计算机语言也没学过,只学过c语言,本身想自学,但自学觉得效率太低,自己没有系统的学习方法,考虑到报班学习,有个老师带着,这样效果会好很多,因此决定上个编程培训班学习。
在看了好多家Android编程开发培训机构的官方介绍后,也在论坛上搜索了一些评价,之后和咨询老师进行了一些沟通,同时我还打听到了一些之前毕业学员的一些就业情况。相比同行业的其他培训机构,各方面的反馈都还不错,所以我选择了千锋android培训。四个月android学习过去了,老师给我的印象是非常负责,在课堂上,他们会一一为同学答疑解惑,甚至当看到你带有疑惑的眼神,他们也会问下你有没有不懂的地方, 这一点我很感动。这里的课程安排的很合理,从基础的java,以及培养面向对象的一些细节,白天老师讲课,晚上自习有老师辅导,一直到Android编程开发最后的大项目,课程都安排的很有层次,深入浅出。
在学习android编程的这段时间里,我学到很多之前没有接触到的知识,过得挺充实的。这里的授课老师讲课方式各有特色,但是课后对于我们来说都很亲切。刘老师讲话风趣幽默,让我们在轻松环境中掌握java语言基础,课程中,老师更加注重我们对于代码的积累,并强调实用性,让我们自己在项目中理解,很多老师都知识面很广,亲和力又强,让我们能够在轻松地氛围中更好地融会贯通所学android编程知识。
最后,我想对已经或即将在培训中学习android编程的学弟学妹们说几句,选择一家好的android编程培训机构固然很重要,但是最终还是得靠自己的努力,如果自己不努力,谁都帮不了你,如果,你选择了像我选择的这种一流的机构,那剩下的就好好努力吧。如果当你坚持不下去的时候,那就想想你的梦想,你的家人,你今天的努力,不仅仅是为了你自己。相信自己,你一定能成功。
第五篇:Android开发基本知识总结-Android课件
Android开发基础教程
2015-4-13周一2CJ02 目录
1.什么是Android? 2.Android应用开发环境 3.Gradle 4.模拟器Emulator 5.开发一个安卓应用程序的步骤 6.关于多个模拟器的问题 7.安卓工程文件的结构 8.android界面文件---xml文件 9.android程序文件---java文件 10.界面布局方式 11.几个常用组件 12.Roast组件 13.对话框AlertDialog 14.几条重要的语句 15.监听器Listener 16.识别响应事件的组件 17.界面切换
18.界面之间的数据传递 19.Activity生命周期 20.多媒体播放
21.日志文件在程序调试中的使用 22.使用XML文件保存数据
23.使用TXT文件保存数据 24.使用数据库保存数据 25.时间组件 26.线程Thread 27.视频播放VideoView 28.MediaPlayer,SurfaceView和SurfaceHolder播放视频 29.录制音频MediaRecorder 30.菜单组件
1.什么是Android? 移动设备(常常指手机mobile)的操作系统,由google公司出品,是免费的, 最早是基于Linux平台的;目前已经推出的Android3.0是平板电脑上的操作系统。
其它的手机操作系统有:iPhone系统等。
手机厂商:三星(Samsung,宏达电(HTC),摩托罗拉(Motorola),华硕,索尼,Garmin等都支持iPhone系统。
Android系统功能:自定义用户界面,支持蓝牙,多点触摸,具有导航功能和语音识别功能,结合了google地图。
Android软件开发工具SDK
4.0。
Android系统特点:虚拟键盘,以WebKit为核心的WebView组件,可以使用HTML, javascript等。
2.Android应用开发环境 Eclipse+ADT+Android SDK。ADT---Android开发工具插件(Android Plugs for Eclipse).开发环境安装注意事项:关闭防毒软件,按顺序安装,保持网络畅通,比较耗时。特别说明,安装和运行需要高配置机器和高速网络,比较费时。
(1)安装Java
JDK。甲骨文
网站: http://www.xiexiebang.com ”);Intent in = new Intent(Intent.ACTIN_VIEW, uri);startActivity(in);(2)调用系统拨号界面
Uri uri = Uri.parse(“tel:*** ”);Intent in = new Intent(Intent.ACTIN_DIAL, uri);startActivity(in);(3)调用系统拨号功能
Uri uri = Uri.parse(“tel:*** ”);Intent in = new Intent(Intent.ACTIN_CALL, uri);startActivity(in);注意:需要在AndroidManifest.xml文件中进行设置,才可以自动拨号:
= new Bundle();bndle.pushString(“name”, “David”);bndle.pushInt(“age”, 22);//pushChar, putShort,put Boolean, pushChar等等
Uri uri = Uri.parse(“http://www.xiexiebang.com ”);Intent in = new Intent(Intent.ACTIN_VIEW, uri);in.putExtras(bundle);startActivity(in);在第二个界面中: Intent in = this.get Intent();Bundle bundle
= in.getExtras();String studentName = bundle.getInt();//getDouble, 2.方法2:调用有返回参数 例1,在第一个界面中: private static final int ACTIVITY_EDIT = 1;Bundle bundle = new Bundle();bundle.pushString(“name”, “David”);Intent in = new Intent();
getShort, getIntArray等 in.putExtras(bundle);in.setClass(FullscreenActivity.this, SecondActivity.class);startActivityForResult(in, ACTIVITY_EDIT);注意:startActivityForResult后所有语句无效,不执行;在第一个界面中,第二个界面可以在不同位置被多次调用;在第一个界面中,在其它位置可以调用其它界面。
在第一个界面中,重写onActivityResult,接收所有被调用界面返回的参数(如果有):@Override protected void onActivityResult(int
requestCode,int resultCode,Intent
data){ super.onActivityResult(requestCode, resultCode, data);if(requestCode== ACTIVITY_EDIT)
//此参数可以区分不同的调用
{
Bundle bundle = data.getExtras();if(resultCode == RESULT_OK)
//此参数可以判断有无返回参数
{
Bundle bundle = data.getExtras();……
} if
(resultCode == RESULT_CANCELED)
{ } }
…… } ……
问题
:如何判断被调用界面是否传递返回参数?如何区分返回参数是由不同的被调用界面传递的?android的这种解决方法并不是完美的。例2,在第二个界面中:
读取第一个界面传递的参数,省略;下面是向调用程序传递返回参数: Bundle bundle
= new Bundle();bndle.pushString(“name”, “贺昌峰373780592”);Intent
setResult(RESULT_CANCELED);//传递参数返回
// 或setResult(RESULT_OK, in);//不传递参数返回 finish();注意:这时,第二个界面返回到第一个界面,可以不传递参数直接返回(RESULT_CANCELED),in = new Intent();
in.putExtras(bundle);也可以传递参数返回(RESULT_OK)。19.Activity生命周期
onCreate
---onStart
---onResume
---onPause---onStop
---onDestroy 也就是说,有: protected void oncreate(…){ ….} protected void onStart(…){ ….} protected void onResume(…){ ….} protected void onPause(…){
….} protected void onStop(…){ ….} protected
void onDestroy(…){ ….} 20.多媒体播放MediaPlayer public MediaPlayer player = new MediaPlayer();//生成语句可省略 try{ player.reset();
//重新播放音乐
player.setDataSource(“/sdcard/music/music_file_name.mp3”);
// player = MediaPlayer.create(getApplicationContext(), R.raw.music);
// 打开音乐文件
//music为音乐资源文件
player.prepare();player.start();
// player.isPlaying()
//准备播放 //播放音乐
//判断是否正在播放
//音乐播放完成触发事件
player.setOnCompletionListener(new OnCompletionListener){ public void onCompletion(){ //音乐播放完成后,处理代码 } }
player.pause();player.start();player.stop();
} catch(IllegalStateException e){ ……} catch(IOException e){ ……}
//播放暂停 //继续播放音乐 //停止播放音乐 player.release();
//释放存储空间
//注意:可以播放存储卡上任意一个音乐文件;也可以播放资源列表中的音乐文件 21.日志文件在程序调试中的使用
import android.util.Log;对应的方法有:debug,verbose,info,warn,error。注意,使用简写。问题:如何查看系统日志文件?
Log.d(“这里是分类标签”, “这里是输出信息”);22.使用XML文件保存数据
对XML文件进行操作,形式为(key,value)。SharedPreferences
sp = get SharedPreferences(文件名,权限);
权限:MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE 例:
//1打开XML文件 SharedPreferences
//2更改数据
Editor editor = sp.eidt();
//更改数据
sp = get SharedPreferences(“myconfig”,MODE_PRIVATE);
editor.putString(“name”, “贺昌峰373780592”);editor.putInt(“age”, 48);editor.putFloat(“salary”, 2048.5);//putLong,putBoolean等;
editor.commit();
//保存数据
//3读取数据
String myname = sp.getString(“name”, “”);
//4删除数据
editor.remove(“name”);//删除数据 editor.commit();
editor.clear();//删除全部数据 editor.commit();
//5简写形式如下: Editor editor = sp.eidt()
//更改数据
//读取数据
.putString(“name”,.commit();
“贺昌峰”)23.使用TXT文件保存数据 FileOutPutStream
fout = openFileOutput(文件名, 文件权限);文件权限: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE
1.在文件中写入数据
try { //打开TXT文件 FileOutPutStream
BufferedOutputStream
String
//向文件中写入数据
bufferoutput.write(s.getBytes());s = “大家跟我学习android”;
bufferoutput = new BufferedOutputStream(fout);fout = openFileOutput(“myconfig.txt”, MODE_PRIVATE);
//关闭文件 bufferoutput.close();fout.close();} Catch(Exception e){
2.从文件中读取数据
try { FileInputStream
BufferedInputStream
byte[] bufferbytes = new byte[20];int flag = bufferoutput.read(bufferbytes);if(flag==-1){ //文件读取到文件末尾,否则可以继续读出
}
//仅读取长度为20个字节的数据
bufferoutput = new BufferedInputStream(fout);
fout = openFileInput(“myconfig.txt”);
//打开文件
e.printStackTrace();} bufferoutput.close();fout.close();} Catch(Exception e){
24.使用数据库保存数据 1.数据库相关类
//关闭缓冲区 //关闭文件
e.printStackTrace();} import android.content.ContentValues;import android.content.Context;import android.database.Coursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;
2.SQLiteDataBase类
注意:数据库操作时,要求捕获异常,此处省略。
SQLiteDataBase db = openOrCreateDatabase(“databasename.db”, MODE_PRIVATE);//说明:数据库权限同文件权限
// Context就是this指针 db.execSQL(sql_exp): 执行SQL语句
Cursor cs = db.rawQuery(select_exp, null): 返回数据集。Cursor cs1 = db.query(arg0, ……): 使用较繁琐,可用rawQuery替换。
db.insert(arg0, ……): 使用较繁琐,可用rawQuery替换。db.delete(arg0, ……): 使用较繁琐,可用rawQuery替换。db.update(arg0, ……):
使用较繁琐,可用rawQuery替换
db.close(): 一般写在onDestroy事件中。3.Cursor类 方法有:
move, moveToPosition, moveToFirst, moveToLast,moveToNext, getCount(), getInt(),getString(),isNull(), isFirst()等等。
4.ContentValues类
一般用在SQLiteDataBase.insert中, 此处省略。
ContentValues content
= new ContentValues();
content.put(“name”, “贺昌峰”);
moveToPrevious, content.put(“age”, 48);5.SimpleCursorAdapter类
SimpleCursorAdapter是界面组件如ListView和Cursor的桥梁。例, 在ListView组件listview1中,显示数据集(有绑定功能吗?):
Cursor cs = db.rawQuery(“select SimpleCursorAdapter
adapter
* from table”, null);
= new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, new String[]{“id”, “name”}, new int[]{ android.R.id.text1, android.R.id.text2});// 注意:第2个参数的作用
listview1.setAdapter(cs);
//在ListView组件显示数据集
25.时间组件
1.常用组件AnalogClock,DigitClock 用法比较简单,无需过多设置,仅仅显示当前时间:机械式,数字式
2.计时组件:Chronometer 常用方法:start开始计时, stop停止计时, setBase设置时间 setFormat(“秒表:%s”):设置组件时间显示格式。
附:与时间格式有关的函数 SimpleDateFormat String
sformat = new SimpleDateFormats(“hh:mm:ss”);
//得得当前时间 s = sformat.format(new Date());
例,Chronometer对象是chroTime: chroTime.setOnChronometerTickListeter(chrolisteten);
private Chronometer.onChronometerTickListeter Chronometer.onChronometerTickListeter(){ @Override public
void OnChronometerTickListeter(Chronometer chronomoter){ //每秒执行一次该方法 } }
3.计时组件Timer和TimerTask
chrolisteten = new 常用函数:schedule(TimerTask对象, Timer对象延迟时间, TimerTask对象间隔时间);
TimerTask对象用法: private TimerTask { public void run(){ //按设定间隔调用执行 handle.sendMessage(msg);//特别注意:此处不能对界面进行更新,因为影响计时精度,所有需要使用Handle配合。见下。} }
4.Handle和Message的配合使用 Handle handle { public void handleMessage(){ super.handleMessage();//进行其它处理 }
= new Handle()
timetask = new TimerTask()} Message
msg.what = “******”;handle.sendMessage(msg);
26.线程Thread
1.Thread的定义
public class ClockThread extends Thread{ @Override public void run(){ //进行其它处理
//注意:不会自动重复执行多次的 } } 2.Thread的启动、延时启动、停止 使用Handle对线程进行控制: msg = new Message();Handle handle = new Handle();
ClockThread clock = new ClockThread();
handle.post(clock);
//启动线程 5000);
//延时5000ms启动线程 //停止线程 handle.postDelayed(clock, handle.removeCallbacks(clock);
问题:使用Handle有什么优点? 27.视频播放VideoView 支持的文件格式:H.264的mp4, wmv, 3gp等。1.视频播放
private VideoView
videoview.setVideoPath(“/sdcard/robot.mp4”);//增加控制面板
videoview.setMediaController(new MediaController(getApplicationContext()));
videoview
= new VideoView();videoview.start();//开始播放
2.视频准备播放事件
videoview.setOnPreparedListener(videoPreparedListener);videoview.setOnCompletionListener(videoCompletionListener);
private MediaPlayer.onPreparedListener videoPreparedListener = new MediaPlayer.onPreparedListener(){ @Override public
void onPrepared(MediaPlayer
mp){ //视频准备播放 } }
3.视频播放完成事件
private MediaPlayer.onCompletionListener videoCompletionListener = MediaPlayer.onCompletionListener(){ @Override public
void onCompletion(MediaPlayer
mp){
new //视频播放完成 } }
28.MediaPlayer,SurfaceView和SurfaceHolder播放视频
MediaPlayer也可以播放视频,需要SurfaceView和SurfaceHolder配合,其中SurfaceView为可视化组件可以播放视频,SurfaceHolder为桥梁。
private SurfaceView surfview = new SurfaceView();//此组件可视化设计,无需这里声明 private MediaPlayer
surfholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaplayer.setDisplay(surfholder);
mediaplayer.setDataSource(“/sdcard/vedio.mp4”);mediaplayer.reset();
//打开视频文件
mediaplayer = new MediaPlayer();
= surfview.getHolder();private SurfaceHolder surfholder
//重新播放视频 mediaplayer.prepare();mediaplayer.start();mediaplayer.stop();mediaplayer.release();
//准备播放视频 //播放视频
29.录制音频MediaRecorder MediaRecorder
mediaRecorder.SetAudioSource(MediaRecorder.AudioSource.MIC);mediaRecorder.SetAudioEncode(MediaRecorder.AudioEncode.DEFAULT);mediaRecorder.SetOutputFormat(MediaRecorder.OutputFormat.DEFAULT);mediaRecorder.SetOutputFile(“/sdcard/recorder.amr”);mediaRecorder.prepare();mediaRecorder.start();
注意:要有写入SD卡的权限,在AndroidManifest.xml文件中:
//准备录音 //开始录音
mediaRecorder = new MediaRecorder(); :
1.附1:ImageView.setAlpha(50)的含义?设置透明色 2.附2:遍历目录下所有文件: private File pathfile;pathfile = Environment.getExternalStorageDirectory();
//疑问:pathfile + ”/myfilename.txt” 这个用法正确吗? for(File file: pathfile.listFiles()){ if {(file.getName().toLowerCase().endsWith(“.amr”))……
// File.getAbsolutePath(), File.getName()的区别 } } 30.菜单组件 //添加系统菜单 protected protected static final int MENU_ABOUT
= Menu.FIRST;static final int MENU_QUIT = Menu.FIRST + 1;
//得到SD卡路经 protected
@Override static final int MENU_EDIT = Menu.FIRST + 2;public boolean onCreateOptionsMenu(Menu menu){ menu.add(0,MENU_ABOUT,0,“关于本软件...”).setShortcut('0','A');
menu.add(0,MENU_QUIT,1,“结束”).setShortcut('1','E');
menu.add(0,MENU_EDIT,2,“编辑”).setShortcut('2','D');
menu.add(0,MENU_FILE,3,“文件”).setShortcut('3','F');
return super.onCreateOptionsMenu(menu);} //添加菜单响应事件 @Override public boolean onOptionsItemSelected(MenuItem switch(item.getItemId()){ case MENU_ABOUT: // 响应处理 break;case MENU_QUIT: // 响应处理 break;}
return super.onOptionsItemSelected(item);}
//添加快捷菜单 protected static final int MENU_BACKCOLOR protected static final int MENU_SMALLSIZE =
item){
= Menu.FIRST;
Menu.FIRST + 1;//定义快捷菜单组件 private LinearLayout private TextView
layout;
txtview1,txtview2;在onCreate中, 增加以下语句: layout =(LinearLayout)findViewById(R.id.layout);txtview1 =(TextView)findViewById(R.id.txtview1);txtview2 =(TextView)findViewById(R.id.txtview2);registerForContextMenu(txtview1);registerForContextMenu(txtview2);
在java文件类中, 增加以下语句: @Override public boolean onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ //注意:父类函数先调用,或最后调用? super.onCreateOptionsMenu(menu, v, menuInfo);
if(v == txtview1)menu.add(0, MENU_BACKCOLOR,0,“设置背景颜色”); if(v == txtview2)menu.add(0, MENU_SMALLSIZE,1,“较小字体”);
}
//添加菜单响应事件 @Override public boolean onContextItemSelected(MenuItem switch(item.getItemId()){ case MENU_BACKCOLOR: // 响应处理
layout.setBackgroundColor(Color.BLUE);break;case MENU_SMALLSIZE: // 响应处理
txtview2.setTextSize(12);break;}
return super.onContextItemSelected(item);}
item){