从零开始学android之我的android 笔记.docx
《从零开始学android之我的android 笔记.docx》由会员分享,可在线阅读,更多相关《从零开始学android之我的android 笔记.docx(51页珍藏版)》请在冰豆网上搜索。
从零开始学android之我的android笔记
3G(3thGeneration)指的就是第三代数字通信,是将无线通信于国际互联网等多媒体通信结合的新的一代通信技术标准。
符合这个标准的技术有WCDMA、CDMA2000、TD-SCDMA这三种无线接口标准。
中国联通使用的是WCDMA(世界上大部分3G网络都采用的是该标准)使用联通上网时手机上有的会显示一个H(HSDPA)标示,这是加强版的3G。
中国电信使用的是CDMA2000(日、韩和北美使用)辐射小信号强;
中国移动使用的是具有自主知识产权的TD-SCDMA(只有中国才使用)为了推广TD-SCDMA产生了国产手机操作系统ophone,ophone支持htmlwidget和gif,只是ophone在续航和界面存在不足,目前使用不多。
相对第一代模拟制式手机(1G)和第二代GSM、CDMA等数字手机(2G),3G手机能处理图像、音乐、视频等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。
3G网络与前两代的主要区别是在传输声音和数据的速度上有很大的提升(最大下行速度2.4M/s)。
现在的手机大多还是2.5G手机,符合2.5G网络的接口标准有CDMA20001X和GPRS,中国联通使用的是CDMA20001X标准,中国移动使用的是GPRS标准。
目前,可以把2.5G移动通信技术看作是2G迈向3G的衔接性技术,在2.5G网络下出现了如WAP、蓝牙(Bluetoot)等技术。
Android系统今后将继续每半年一次的升级步伐,分别定在每年的夏天和年终。
每代Android系统都将以甜点命名.比如:
1.5版叫做Cupcake(纸杯蛋糕)
1.6版为Donut(甜甜圈)
2.1版的Éclair(闪电泡芙,一种法式奶油夹心甜点),此版本曾被叫做Flan“水果馅饼”
2.2版的Froyo(冻酸奶)
2.3版的Gingerbread(姜饼)添加了sip通话的支持,在省电上下了功夫,做成了黑色主题
3.0版的Honeycomb(蜂巢)主要是针对平板电脑,为平板和手机的整合做准备,有了对设备的判断开关
4.0版的IcecreamSandWich(简称ics,冰激凌三明治)统一版本,电视手机平板融合
以CDEFG字头顺序排列.Donut将把社交网络功能作为升级重点,在"手机的各种体验中"都增加社交网络元素
Android体系结构:
Android使用了开源的opensource音频编解码工具以库文件(.so)封装到Lib层的meda框架
Android使用的是Dalvikvm虚拟机,它和jvm相比更适合手机
开发环境的搭建
所需开发环境:
JDK5或以上版本(仅有JRE不够)、Eclipse3.6或以上版本
下载用于在Eclipse开发android应用的ADT插件
在企业开发中,很多程序员使用EclipseIDE作为应用的开发环境。
为了使得Android应用的创建,运行和调试更加方便快捷。
Android的开发团队专门针对EclipseIDE定制了一个插件:
AndroidDevelopmentTools(ADT)
下载地址:
安装Eclipse插件(ADT)
启动Eclipse,选择Help>InstallNewSoftware,在出现的对话框里,点击Add按钮,在对话框的name一栏输入“ADT”,然后点击Archive...,浏览和选择已经下载的ADT插件压缩文件。
点击OK.。
返回可用软件的视图,你会看到这个插件,然后选择DeveloperTools(会选中下面的“AndroidDeveloperTools”和“AndroidEditors“),点击Next,最后重启Eclipse。
下载安装AndroidSDK(standdevelopkits):
AndroidSDK包含了开发Android应用所依赖的jar文件、运行环境及相关工具。
下载地址:
下载完SDK后,把.zip文件解压到你电脑上合适位置。
启动Eclipse,选择window->preferences,在打开的视图左边点击android,在右边的SDKLocation中选择AndroidSDK所在位置。
要注意的是adt和sdk的版本一定要相符合否则不能创建android程序
模拟器vs虚拟机
模拟器:
模拟一些收发信息拨打电话等的操作模拟的环境不能代表真机
虚拟机vmware虚拟出来的网卡内存处理器等相当于真机
虚拟机的功能>模拟器的功能
开发中常用的屏幕分辨率:
HVGA800*480
QVGA320*240
WHVGA854*480
在android的sdk目录下platform-tools中有一些sdk提供的工具
adb.exe:
androiddebugbridge(android调试桥)
在dos下使用socket连接到模拟器上.提供一些列的工具帮助我们调试程序
adb的命令
adbinstallxxx.apk如果有多个设备,可以指定设adbinstall–semulator-5554D:
/xxx.apk
adbuninstall卸载一个apk的包名
adblogcat打印日志信息
adbdevices命令列出来当前所有可用的设备
adbshell挂载到linux的空间
adbkill-server
adbstart-server
重新启动一个现有的连接。
如果经常报出远程主机强迫关闭了一个现有的连接的错误很可能就是安装了豌豆荚类似的程序,因为这些程序会在C:
//system32中安装一个adb,这个adb版本比较低的话就会出现一些问题
aapt:
androidapplicationpackagetools(android应用程序打包工具)
把class打包成-apk文件
class-dex-res里面的资源->apk
过程如下图:
DDMS工具集:
dailvkdebugmanagersystem(dailvk调试工具集)
在ddms视图下可以查看和调试正在运行的模拟器
androidlisttargets列出可以使用的sdk的版本
android调出androidmanager视图
emulator–avdadvname启动模拟器例如:
emulator–avd2.2(2.2为创建设备的名称)mkmdcard20md:
/sdcard.img创建sdcard
adbpull
adbpush
androidcreateavd–nameandroid2.2–target8创建模拟器
3G:
android手机数据信道和通讯信道是分开的.这在ddms视图下EmulatorControl中的TelephonyStatus就能看到
关联源码:
在sdk相应的版本下的目录下建立source文件夹把源码解压进去就行了
目录结构
src存放源文件
gen目录编译器帮助我们自动生成的java文件
gen目录中存放所有由Android开发工具自动生成的文件。
目录中最重要的就是R.java文件。
这个文件由Android开发工具自动产生的。
Android开发工具会自动根据你放入res目录的资源,同步更新修改R.java文件。
正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。
R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,应用可以很方便地找到对应资源。
另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
android2.2指定依赖的jar包.
project.propertiestarget=android-8指定编译的jar包的等级
assets存放一些资源文件(不经过编译的资源文件)
android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:
file:
///android_asset/xxx.3gp
res存放也是资源文件编译这些资源文件在R文件中生成引用
在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。
res/drawable专门存放png、jpg等图标文件。
在代码中使用getResources().getDrawable(resourceId)获取该目录下的资源。
res/layout专门存放xml界面文件,xml界面文件和HTML文件一样,主要用于显示用户操作界面。
res/values专门存放应用使用到的各种类型数据。
不同类型的数据存放在不同的文件中,如下:
·strings.xml定义字符串和数值,在Activity中使用getResources().getString(resourceId)或getResources().getText(resourceId)取得资源。
它的作用和struts中的国际化资源文件一样。
xmlversion="1.0"encoding="UTF-8"?
>
传智播客
·arrays.xml定义数组。
xmlversion="1.0"encoding="utf-8"?
>
- red
- yellow
- green
- blue
·colors.xml定义颜色和颜色字串数值,你可以在Activity中使用getResources().getDrawable(resourceId)以及getResources().getColor(resourceId)取得这些资源。
例子如下:
xmlversion="1.0"encoding="UTF-8"?
>
#ff0000
·dimens.xml定义尺寸数据,在Activity中使用getResources().getDimension(resourceId)取得这些资源
xmlversion="1.0"encoding="UTF-8"?
>
50dip
·styles.xml定义样式。
xmlversion="1.0"encoding="utf-8"?
>
textSize">18sp
textColor">#0066FF
res/anim/存放定义动画的XML文件。
res/xml/在Activity中使用getResources().getXML()读取该目录下的XML资源文件。
res/raw/该目录用于存放应用使用到的原始文件,如音效文件等。
编译软件时,这些数据不会被编译,它们被直接加入到程序安装包里。
为了在程序中使用这些资源,你可以调用getResources().openRawResource(ID),参数ID形式:
R.raw.somefilename。
bin目录生成class文件和生成的apk
Android程序执行流程(任何java程序执行main())
1.应用程序被安装到模拟器上
操作系统就会读取apk里面的manifest文件注册到系统中
2.操作系统的框架中会根据这个manifest生成一个main()
根据清单文件->找到包名类名->反射->class.newInstence();
3.调用activity的oncreate();
4.setContentView(R.layout.main);
Android是面向组件的
Intentintent=newIntent();//创建了一个意图
intent.setAction("");//设置动作
intent.setData(Uri);//设置Uri类型的数据
startActivity(intent);//启动
更改sdcard的目录在创建时点击file制定文件夹(路径不要中文)
如果eclipse出现如下错误:
很可能就是安装的jdk和eclipse的不匹配
解决方案:
在eclipse目录下删除eclipse.ini再打开eclipse自动根据jdk生成
Android的布局:
LinearLayout(线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局)
Android的显示单位:
px(pixels)像素一般HVGA代表320x480像素,这个用的比较多。
dip或dp(deviceindependentpixels)设备独立像素,这个和设备硬件有关,一般为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。
sp(scaledpixels—bestfortextsize)比例像素,主要处理字体的大小,可以根据系统的字体自适应。
除了上面三个显示单位,下面还有几个不太常用:
in(inches)英寸
mm(millimeters)毫米
pt(points)点,1/72英寸
为了适应不同分辨率,不同的像素密度,推荐使用dip,文字使用sp。
在拨打电话时要注意的地方:
Intentintent=newIntent();
intent.setAction("android.intent.action.CALL");//直接拨打出去
intent.setAction(Intent.ACTION_DIAL);//显示在拨打面板上等待拨打
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("tel:
"+phoneNumber));
startActivity(intent);
在发送短信的时候要注意的地方:
SmsManagersms=SmsManager.getDefault();//短信管理器
ListmessageBodys=sms.divideMessage(messageContent);//对长信息切割
for(StringmessageBody:
messageBodys){//循环发送
//信息发送的三个方法
sms.sendTextMessage(destinationAddress,scAddress,text,sentIntent,deliveryIntent);
sms.sendDataMessage(destinationAddress,scAddress,destinationPort,data,sentIntent,deliveryIntent);
sms.sendMultipartTextMessage(destinationAddress,scAddress,parts,sentIntents,deliveryIntents);
}
真机部署:
真机部署时常用的手机型号:
两年前:
三星i57002.1800*480
比较高端:
htcg3800*480
比较高端:
索爱x10ifwvga854*480
比较低端:
华为u880320*240
比较低端:
三星galexyfit320*240
1:
安装手机驱动
Google官方手机nexus或者g1的驱动在sdk/driver/usb
其他的手机要在其官网上下载驱动安装后在我的电脑设备管理器中的导航栏中能看到
命令行adbdevices中也就能看到真机的设备
2:
然后在setting的应用程序中勾选未知来源,在setting的开发中勾选usb调试,否则不能安装程序,如果用的着话也要勾选允许模拟位置选项,然后就能像是在使用模拟器一样使用真机了
Android测试:
黑盒测试:
不关心程序代码只注重程序功能,记录了操作的步骤和产生crash的地方,实际中用的比较多
白盒测试:
根据程序的代码去写相应的测试逻辑
白盒测试根据测试粒度不同分
单元测试functiontest
集成测试intergrationtest
压力测试测试工具:
monkey.
单元测试:
测试类继承AndroidTestCase,并把异常抛出去给测试框架
在应用清单中配置:
在节点下配置name="android.test.runner"/>
在节点外配置
name="android.test.InstrumentationTestRunner"
android:
targetPackage="cn.itcast.action(自己的应用名)"android:
label="TestsforMyApp"/>
Android数据存储:
数据的存储是有关流对象的处理在android中可以通过context获得输入输出流
cotnext.openFileInput(name);
cotnext.openFileOutput(name,Context.MODE_PRIVATE);
获得的输出流的路径在rom(手机的内置硬盘大小在1G左右)/程序的包名/files
如果要在sdcard上存储数据就要显式的构造出流对象,而不同的版本的模拟器的sdcard的位置是不同的android2.1是/sdcard/android2.2是/mnt/sdcard/,要获取sdk的版本号可以通过android.os.Build的类中的常量获得,再根据版本号制定路径,一个更好的做法就是通过Environment类的方法和常量去判读sdcard的状态等信息
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);//sdcard开是否可用
Environment.getDataDirectory();//获取sdcard的目录
Android文件的权限:
modeprivate-rw-rw----
modeworldreadable-rw-rw-r--
modworldwriteable-rw-rw--w-
read/writeable-rw-rw-rw-
Context.MODE_APPEND文件一旦被创建出来,以后以追加的模式去访问文件
每一个apk他在android操作系统运行的时候操作系统会给每个应用程序分配一个uid
在ddms视图的fileExplorer的permission中:
d开头的代表目录
-开头的代表文件
除了d意外的九个字符分为3组当前用户-用户所在的组-所有其他的人
rwx的含义是r:
可读w:
可写x:
可执行
这是模仿的linux权限的管理模式
Pull解析xml
Android已经集成进了Pull解析器,无需添加任何jar文件。
android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。
Pull解析器的运行方式与SAX解析器相似。
它提供了类似的事件,如:
开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。
跟SAX不同的是,Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。
当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值
加载xmlthis.getClass().getClassLoader().getResourceAsStream("person.xml")
解析xml
XmlPullParserpullParser=Xml.newPullParser();
pullParser.setInput(is,"UTF-8");
intflag=pullParser.getEventType();
while(flag!
=XmlPullParser.END_DOCUMENT){
switch(flag){
//逻辑判断
}
flag=pullParser.next();
}
生成xml
XmlSerializerserializer=Xml.newSerializer();
Filefile=newFile(Environment.getExternalStorageDirectory(),"persons.xml");
FileOutputStreamos=newFileOutputStream(file);
serializer.setOutput(os,"utf-8");
serializer.startDocument("UTF-8",true);
serializer.startTag(null,"persons");
for(Personperson:
persons){
serializer.startTag(null,"person");
serializer.attribute(null,"id",person.getId()+"");
serializer.startTag(null,"name");
serializer.text(person.getName());
serializer.endTag(null,"name");
serializer.startTag(null,"age");
serializer.te