(一)Android操作系统简介
Android是安迪鲁宾团队开发的,最初用于数码相机,2005.08被谷歌收购
Android应用范围:手机,平板,智能家居,穿戴设备
(二)重要版本
- Android2.3:早期最稳定的一个版本,支持前置摄像头
支持NFC(近距离无线传输),支持文本复制黏贴功能得到简化,增加电池应用监控 - Android3.0:专为平板设计 fragment
- Android4.1.2:4.x以后比较稳定的版本
- Android5.0:新特性(Metrail Design)
- Android6.0:运行时权限控制
- Android7.0:私有目录被限制访问
(三)Android系统架构
- 应用层 Application ( java)
- 框架层 Application FameWork (java+jni)
- 函数库和运行时 (c/c++)
- Linux 内核驱动
(四)两种虚拟机的不同
jvm:java虚拟机 sum公司
dvm;dalvik虚拟机 google公司
区别:
- 基于的架构不同,jvm是基于栈架构,栈是位于内存上的一个空间,再执行指令操作时,需要向cpu寻址,dvm是位于寄存器架构,寄存器是cpu的一部分,在执行指令操作的时候,无需寻址,直接执行,所以dvm更快
- 执行文件的格式不同,jvm执行的是多个.class文件而dvm执行的是一个.dex文件
(五)ART模式:Android runtime
程序在安转时需要预编译读取,将代码转化为机器码
优点:程序运行时无需实时转化,运行速度快
缺点:安转时间长,由于转换机码,内存占用略高。
(六)开发环境介绍
- JDK: java deverloper kit
- 开发工具:eclipse AndroidStudio
- Android SDK soft deverloper kit
- adt:Android Deverloper tools
- api level :19:4.4版本 18:4.3版本 11:3.0版本 10:2.3版本 8:2.2版本
- aapt:Android application packagetool
- dx.bat:将多个.class打包成一个.dex
- add-ons:预留一个附加目录
- build-tools:构建工具目录
- docs:文档目录
- extras:开发中额外提供的一些工具和jar
- platforms:不同版本Android的核心jar
- platforms-tools:平台一些相关工具
- source:源码
- systemimage:系统图片
- tools:开发中使用的一些工具,如 9patch
(七)Android打包过程
.java—->.class—–>.dex—->apk—–>final apk
通过jdk把.java文件转化为.class文件 ,再通过dx.bat 转化为dex文件,再通过aapt生成apk,最后通过签名,得到final apk
IDE把整个过程实现了,安装了工具直接运行就行,不需要手动编译。
(八)常用adb(Android debug bridge)指令
ADB:建立手机与电脑的直接链接,需要配置环境变量
- adb devices:列出当前电脑所连接的安全设备
- adb push [pc-path] [phone-path]:将电脑端文件放到手机端
- adb install [pc-path]:将电脑端文件安转到手机端
- adb install -r [apk-path]:将电脑端文件强制安转到手机端
- adb kill-service:杀死服务
- adb start -service:开启服务
- adb uninstall [package name]:卸载程序
- netstart -oan:查看端口
- adb shell:linux环境下,进入当前设置
- adb shell logcat:查看系统运行日志
- adb shell ls:查看当前设备目录
更多参考:[adb命令大全](http://zmywly8866.github.io/2015/01/24/all-adb-command.html)
(九)测试相关概念
测试分类:
- 按照测试是否知道源代码:黑盒测试:不知道代码 白盒测试:知道代码
- 按照测试的粒度:方法测试 集成测试 单元测试 系统测试
- 按照测试的暴力程度:冒烟测试【硬件】压力测试【使用人数多的时候】
- 第三方网站:百度云测,优测网,monkey测试:adb shell下的一个测试指令
步骤:cmd–>adb shell–>monkey
or:cmd–>adb shell–>monkey -p packageName
单元测试步骤:
1,创建一个类继承AndroidTestCase,那么该类就具备单元测试功能,
2,需要在AndroidMainifest中的application配置uses-library
<!--表示使用了Android中的函数库-->
<uses-library android:name="android.test.runner" />
3,在AndroidMainifest中配置,instrumentation
<!--表示我要测试那一个工程,下面targetPackage指定了测试那一个包-->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.layouttest" />
(十)存储使用应该注意的问题
- 不要使用硬性路径
通过Context.getFileDir().getPath()
获取内部存储路径
通过Enviroment.getExternalStorageDirectory().getPath();
获取外部存储的路径 - 权限问题:如果使用外部存储要添加外部存储权限
- 判断sd卡状态:通过
Enviroment.getExteralStorageState().equals(Enviroment.MEDTA_MONTED)
获取状态,返回boolean值 - 判断sd卡剩余存储空间
-先判断sd卡的存储空间是否满足文件存储:File sdFile=Environment.getExternalStorageDir();
-sd卡目录作为一个文件对象,先获取文件的剩余空间
long useable= sdFile.getUseableSpace();
-获取总共的空间
long totalSpace= sdFile.getTotalSpace();
-私有目录和外部存储的区别
- 获取方式不一样
- 权限不一样
- 私有用于存放安全性高但是文件小,外部用于存放安全性低一些但是文件大的数据
(十一)文件的权限概念
linux下的文件权限由10位表示
- 第1位:文件类型
- 2-4位:该文件所属用户对文件的权限
- 5-7位:该文件所属用户组对本文件的权限
- 8-10位:其他用户对该文件的权限
rwx是用二进制表示,如果是就用0,如果不是就用1,再把二进制转换为十进制
(十二)SharedPreferenced数据存储
参考我的另一篇文章[Android复习之SharedPreferences](http://blog.csdn.net/cdhahaha/article/details/52734388)
(十三)Android下的数据库创建
什么时候使用数据库存储数据?答案是当数据库数据量大的时候
创建数据库步骤:
- 创建数据库类继承SqliteOpenHelper,实现pnCreate和onUpgrade两个方法,
- 创建一个帮助类调用getReadable方法,会帮助我们创建数据库
- 复写onCreate方法和onUpgrade方法,onCreate方法是表初次创建时调用,适合做表结构的初始化,onUpgrade是在版本号发生改变时调用,适合做表结构的修改。
(十四)Android下数据库的增删改查
第一种方式:
- 创建一个帮助类对象,调用getReadableDataBase方法返回一个SqliteDataBase方法,使用这个对象调用exesql做增删改查,调用rawquery方法做查询
特点:增删改没有返回值,不能判断sql是否执行成功,而且sql语句容易写错
第二种方式:
创建帮助类对象,调用getReadableDatabase方法返回一个SqliteDatabase对象,通过这个对象调用insert,update,query,delete做增删改查
特点:增删改查有返回值,可以判断操作是否成功,但是查询不够灵活,不能做多表查询,在公司增删改用第二种,查询用第一种
(十五)数据库中的事务
事务:执行多条sql语句,要么同时执行成功,要么同时执行失败,不能有成功有失败
eg:银行转账,要么转成功,要么转失败,不能有一方已经转账,而另一方未收到款的情况
db.beginTransation()//开启一个数据库事务
db.setTransitionSuccessful();//标记语句全部执行成功
db.endTransation();//判断事务的标记是否执行成功,如果不成功回滚之前的语句
有关数据库的基础知识可参照我的另外一篇文章Android学习之sql基础使用
(十六)消息机制的写法和主要元素
消息机制的写法
1,在主线程中创建一个Handler对象并重写handlMessage(Message msg)方法
2,在子线程中创建Message对象,把数据封装到message中,可通过bundle封装也可以通过msg.what,msg.obj,调用handler的sendMessage方法把message传入到主线程的handleMessage(Message msg)方法中的Message参数中,通过这个参数获取子线程的中message封装的数据,进行ui的更新等操作。
消息机制的主要元素
- Message:用来携带子线程中的数据
- MessageQueue:用来存放所有子线程发出的Message
- Handler:用来在子线程发出消息,在主线程接收消息
- Looper:是一个消息循环器,循环遍历MessageQueue,从MessageQueue中取出Message指派给handler处理
(十七)其他消息处理方式
子线程一定不能更新ui?
不是的,sufaceView可以在子线程更新ui,progressBar相关控件也可以在子线程更新UI,Android中有审计机制,activity完全显示时,审计机制才会去检查子线程有没有更新UI,所以如果这个更新UI的时间较短,比如40毫秒以内,此时即使在子线程更新UI也不会报错,因为审计机制还来及不检查,就已经更新完了。
使用activity的runOnUIThread()方法更新ui,无论当前线程是子线程还是主线程,都将在子线程中执行
(十八)get与post的区别
- 请求的url地址不同
- 请求头不同:post方式多了请求头:
content-length
cache-control
origin
…… - post方式还多了请求内容
- 请求时携带的内容大小不同,get1k,post理论上无限
我很菜,,但我仍在努力…….