完整学习笔记之Android基础(简版)

#SDK

* software development kits
* ADT插件:eclipse开发Android必须使用的插件
* android development tools
* docs:离线帮助文档
* platforms:下载该平台才能创建该版本的模拟器
* system-images:CPU系统镜像,下载该镜像才能创建该平台的模拟器
* sources:Android.jar源码
* tools:SDK工具集
* platform-tools:平台工具集
* extras
* 支持类库:让低版本系统可以运行高版本的新特性

#Android项目目录结构

* src:java源码
* Android.jar:导入jar包才能使用Android的api
* libs:第三方jar包
* assets:资源文件夹,存放音频视频等较大文件
* bin:编译打包后自动生成的文件
* res:资源文件夹
* drawable:存放图片

#清单文件

* package:应用的包名,唯一标识
* versionCode:版本号,系统看的
* versionName:版本名字,给人看的
* application:
* icon:应用图标
* label:应用标题
* activity:Activity的使用必须要在清单文件中配置
* icon:Activity也可以配置icon,不配置默认使用application的

* 以下标签用于配置入口Activity
<intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

#DDMS

* dalvik debug monitor service

#ADB

* Android debug bridge
* 让Android设备和eclipse建立连接
* ADB指令
* adb install E:\yyh.apk:安装指定apk
* adb uninstall com.yingyonghui.market: 删除指定应用
* adb start-server:开启adb进程
* adb kill-server:杀死adb进程
* adb devices:列出与开发环境建立连接的Android设备的列表
* adb shell:进入Linux命令行
* ls:列出当前目录结构
* ps:列出当前设备的所有进程
* netstat -ano:查看端口占用情况
dp长度大小单位,sp指定字体大小。

#常见布局

#线性布局
* 竖直方向时
* 左右对齐生效
* 顶部底部对齐无效
* 水平居中生效
* 竖直居中无效
* 水平方向时

###权重
* 按比例分配剩余空间
###相对布局
* 组件可以重叠
* 所有组件默认位置:左对齐,顶部对齐
* 可以相对于父元素对齐
* 可以相对于其他组件对齐
* 可以布局于其他组件的上下左右
###帧布局
* 组件可以重叠
* 所有组件默认位置:左对齐,顶部对齐
* 布局方式的属性与线性布局一致
###表格布局
* 一个TableRow节点是一行
* TableRow中有几个子节点就是几列
* 宽高属性可以不写


#Logcat

* 分5个等级,每个等级使用不同颜色
 

#在Android中读写文件

* RAM:运行内存,相当于电脑的内存
* ROM:内部存储空间,相当于电脑的硬盘
* Android手机必须有的
* SD卡:外部存储空间,相当于电脑的移动硬盘
* 不是必须的
* 现在手机自带的空间都属于外部存储,然后手机基本内部外部共享同一个存储设备


###内部存储路径(不需要权限)

* 所有安装至手机的应用都会在data/data目录下生成一个包名文件夹,这个文件夹就是内部存储的路径
* 应用只能在自己的包名文件夹中读写文件
###外部存储路径(要权限)
2.2之前:sdcard
2.2~4.2:mnt/sdcard
4.3开始:storage/sdcard


#获取sd卡空间

* 存储设备会被分为若干个区块
* 每个区块的大小 * 区块总数 = 存储设备的总大小
* 每个区块的大小 * 可用区块的数量 = 存储设备可用大小
#文件访问权限
* 每一个应用都是一个独立的用户
* drwxrwxrwx
* 第一个字母d
* d:表示文件夹
* -:表示文件
* 第一组rwx:文件拥有者(owner)的权限
* r:读
* w:写
* x:执行execute
* 第二组rwx:与文件拥有者同一用户组的用户(grouper)
* 第三组rwx:其他用户(other)的权限


#SharedPreference

* 以键值对的形式保存数据
* 适合存放零散简单的数据
* 原理其实是生成xml文件去保存

#XML文件生成

* xml序列化器(XmlSerializer)


#测试

###按岗位分
* 黑盒测试:测试业务逻辑
* 白盒测试:测试逻辑方法
###按测试粒度
* 方法测试 function
* 单元测试 unit
* 集成测试 integration
* 系统测试 system
###按暴力程度
* 冒烟测试 smoke
* 压力测试 pressure
###monkey(自动化测试工具,Android指令,monkey 1000,随便按1000次)


#单元测试框架
* 可以直接运行代码
* 需要指定指令集和定义使用的类库


#SQLite数据库



#ListView

* 用来显示列表
* 每一行内容称为一个条目
* ListView的每一个条目都是一个View对象
* 不同布局文件中,资源id可以相同,找的时候注意设置在哪个布局中找
* 只要内存中有条目缓存,在新的条目出现时,就会使用缓存

###MVC

* M:模型层
* javaBean
* personList
* V:视图层
* jsp
* ListView
* C:控制层
* servlet
* Adapter


#网络图片查看

* 客户端发送http请求至服务器,如果请求成功,响应码为200,服务器会通过流向客户端返回请求的数据
* 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,用户体验非常差
* 耗时操作不要写在主线程
###ANR异常
* Application not responding

###消息队列

* 只有主线程可以刷新ui
* 主线程创建时,同时也会创建MessageQueue(消息队列)和Looper(消息轮询器)对象
* 如果需要使用消息队列机制,程序员需要自行创建Handler(消息处理器)
* 轮询器不断检测消息队列中是否有消息,如果有,就会把消息取出,交给Handler对象
* Handler对象拿到消息之后,就会在主线程执行handleMessage()
* 也就是说子线程,只要往消息队列中发送消息,主线程立刻执行handleMessage()

#请求文本信息

#提交数据
###get方式提交表单
* 数据拼接在url后面写给服务器
* 表单数据需要经过url编码
###post方式提交表单
* 数据通过输出流写给服务器


#HttpClient

* apache提供的一个发送Http请求的框架




#多线程断点续传下载

### 多线程:快
* 原理:抢占服务器资源
* 单线程下载:线程从第0个字节开始下,下到最后一个字节,在本地硬盘的临时文件中从第0个字节开始写,写到最后一个字节,下载完成时,临时文件也写完了,本地就创建了一个与服务器文件一模一样的文件
* 多线程下载:每条线程下载的开始位置和结束位置都是不一样的,每条线程下载的数据合在一起才是服务器的完整的文件
###断点续传:
* 下载从上一次下载结束的位置开始
* 原理:每次下载把下载进度保存至一个文本临时文件中,下一次下载时从文本临时文件获取上一次下载的进度,从这个进度开始继续下载
###进度条
* 计算下载百分比进度时要在long类型下计算


#Activity

* 安卓四大组件之一
###创建Activity
* 定义java类,继承Activity
* 在清单文件中配置activity标签
###Activity跳转
#####显式跳转
* 同一应用中,指定目标Activity的字节码和当前的上下文
* 不同应用中,指定目标Activity所在的应用的包名和目标Activity的包名加类名
#####隐式跳转
* 系统会在所有清单文件中寻找与程序员创建的intent匹配的intent-filter,找到则启动,找不到则抛异常
* 匹配就是intent-filter中定义了什么属性,程序员创建的intent中也必须设置什么属性
* 在清单文件的activity标签下,配置intent-filter子节点,其中再配置action和category 
#####应用场景
* 启动同一应用中的Activity,用显式
* 启动不同应用中的Activity,用隐式
* 显式启动效率高于隐式
* 如果系统找到了多个intent-filter与程序员创建的intent匹配,那么就会弹出对话框,列举所有匹配的Activity,让用户选择
###Activity跳转传递数据
* Activity跳转时,可以把数据封装在intent对象中
* intent中可以封装的数据类型:八大基本数据类型和字符串及它们的数组,还有实现了序列化接口的对象,还有bundle对象
* 数据可以先封装至Bundle,再把Bundle封装至intent

###Activity生命周期

* onCreate:创建时调用
* onStart:在屏幕上可见,但是还没有获得焦点
* onResume:可见并且获得焦点
* onPause:可见,但是失去焦点
* onStop:不可见
* onDestroy:销毁时调用
* 手机内存不足时,会杀死之前启动的进程,按照LRU算法(最近最少使用)锁定杀死谁

###Activity的启动模式

* Activity task stack:任务栈
* 栈
* 连续的内存空间
* 后进先出
* 标准模式:默认就是标准模式
* singleTop:如果Activity的实例不在栈顶,那么就会创建,如果已经在栈顶了,就不会再创建了
* singleTask:如果Activity没有被创建任何实例,那么启动时会创建,如果已经创建了一个实例,那么启动时是返回至该Activity而不会再创建该Activity
* 保证栈中永远只有一个该Activity的实例
* singleInstance:在一个单独的任务栈中创建该Activity的实例,然后再也不会创建第二个实例了,以后的每次启动该Activity,都是把该Activity所在的栈显示至前台
* 保证整个系统的内存都只有一个该Activity的实例

###横竖屏切换

* 默认情况横竖屏切换会触发生命周期方法重新执行,Activity销毁重建
* 用以下代码让横竖屏切换时不重建Activity


android:configChanges="orientation|screenSize|keyboardHidden"
* 用以下代码写死屏幕方向


android:screenOrientation="portrait"
###Activity摧毁时返回数据
* 请求码
* 结果码


#广播接收者

* BroadcastReceiver
* 接收系统发出的广播
* 现实中的广播:电台为了传达一些消息,而发送的广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了
* Android中的广播:系统在运行过程中,会发生很多事件,系统为了让其他应用知道系统发生了这个事件,会发送一个对应该事件的广播,比如:电量改变、收到短信、拨打电话、屏幕解锁、系统开机,应用只要注册一个广播接收者,就可以接收到系统发出的广播

###定义方式

* 定义一个类继承BroadcastReceiver
* 在清单文件中配置该类,指定接收的广播种类
* 广播是通过intent发送的,intent中会携带一个action,系统会在所有清单文件中寻找,看哪一个广播接收者的intent-filter和广播中的intent是匹配的,那么这个广播接收者就会收到这条广播

#IP拨号器

* 系统拨打号码时,会发出一个广播,广播中会携带拨打的号码,注册广播接收者接收这个广播,取出这个号码,修改这个号码,然后把修改后的号码重新放入广播
* 广播接收者所在进程即便没有启动,广播发送出来时,系统也会启动这个进程,然后把广播交给广播接收者
#短信拦截器
* 设置广播接收者的优先级,大于系统短信应用,先一步收到短信广播,然后拦截广播,短信应用收不到广播,用户就看不到短信了
* 4.0之后,进程需要启动过一次,广播接收者才能生效
* 4.0之后,用户手动停止进程,那么广播接收者再也不会启动了,直到用户下一次手动启动进程

#SD卡状态侦听

* 一个广播接收者可以接受多种广播,定义多个action即可
#应用的安装卸载侦听
#勒索软件
#发送自定义广播
###无序广播
* 所有与广播中的intent匹配的广播接收者,都可以收到这条广播,并且不分先后顺序,视为同时收到
###有序广播
* 所有与广播中的intent匹配的广播接收者,都可以收到这条广播,但是是分先后顺序的,优先级高的先收到,优先级低的后收到


-----

#服务

* Service
* 四大组件之一
* 运行于后台,没有前台界面的组件,用于运行需要在后台运行的代码
* 可以理解为没有前台的Activity
* 定义方式:创建java类继承Service,清单文件中注册该类
#服务的启动和生命周期
* 用户手动停止服务,服务不会重启
###startService的生命周期
* onCreate->onStartCommand->onDestroy
* 重复的startService不会调用onCreate只会重复调用onStartCommand
#进程优先级
1. 前台进程:拥有一个正在与用户交互的Activity(onResume方法调用)
2. 可见进程:拥有一个不在前台但是对用户依然可见的Activity(onPause方法调用)
3. 服务进程:拥有一个通过startService启动的服务
4. 后台进程:拥有一个对于用户不可见的Activity(onStop方法调用)
5. 空进程:没有任何活动的应用组件(Activity和Service)
#通话录音机
###电话状态
* 空闲
* 响铃
* 摘机


#服务的启动方式

###startService
* 通过startService启动的服务,该服务所在进程会变成服务进程
* 服务与启动它的Activity,不再有一毛钱关系
###bindService
* 通过bindService启动的服务,进程优先级不变
* 绑定的服务与启动它的Activity是同生共死的,Activity销毁了,服务也要销毁,不过服务销毁了,Activity不会销毁


#音乐播放器
* 服务的混合启动
* start-bind-unbind-stop


#广播接收者注册

###清单文件注册
* 广播接收者永远生效,除非卸载应用,或者手动停止进程
###使用代码注册(用服务注册)
* 需要广播接收者生效时,注册它,不需要时,反注册它,反注册之后,广播接收者就失效了
* 特殊广播接收者,必须代码注册
* 屏幕开关
* 电量改变


#服务的分类

###远程服务
* 与启动者在不同应用的服务
###本地服务
* 与启动者在同一应用的服务


#AIDL

* Android interface definition language
* 在Android中用于进程间通讯

###步骤

#####修改 05远程服务
1. 把接口文件的后缀名改成aidl
2. aidl文件中所有东西都是public的,不需要也不能自己定义访问修饰符
3. 中间人对象继承Stub,这个对象已经继承了Binder并实现了PublicBusiness接口
#####修改 06启动远程服务
1. 把05项目的aidl文件复制到06项目,然后aidl所在的包名06和05项目必须一致
2. 把06项目获取到的中间人对象使用Stub.asInterface强转


#进程优先级补充

1. 前台进程
1. 拥有一个正在与用户交互的Activity(onResume方法调用)
2. 拥有一个与正在和用户交互的ACtivity绑定的服务
3. 拥有一个运行在前台的服务(服务调用了startForeground())
4. 拥有一个正在执行其中一个生命周期方法(onCreate(),onStart(),onDestroy())的服务
5. 拥有一个正在执行onReceive方法的广播接收者
2. 可见进程
1. 拥有一个不在前台但是对用户依然可见的Activity(onPause方法调用)
2. 拥有一个与可见Activity绑定的服务(指的是远程服务)


#样式和主题

* 样式和主题定义方式是一模一样的
* 布局文件中使用样式
* 清单文件中使用主题


#多媒体编程

* 文字、图片、音频、视频
#图片处理
###加载大图片
#####图片大小的计算
* 图片总大小 = 图片总像素 * 每个像素的大小
* 单色:只能表示两种颜色,只需要使用两个数字即可,0和1表示黑白
* 每个像素需要使用一个长度为1的二进制数字表示颜色
* 每个像素占用1/8个字节
* 16色:能表示16种颜色,需要16个数字
* 0 - 15,二进制表示:0000 - 1111
* 每个像素需要一个长度为4的二进制数字表示颜色信息
* 每个像素占用1/2个字节
* 256色:能表示256种颜色,需要256个数字
* 0 - 255,二进制表示:0000 0000 - 1111 1111
* 每个像素需要长度为8的二进制数字
* 每个像素占用1个字节
* 24位色:能表示一千六百七十七万多种颜色
* 每个像素占用3个字节
* R:0-255,占用1个字节
* G:同上
* B:同上

#####压缩大图片

* 图片总像素:7680000
* 屏幕总像素:153600
* 图片原始尺寸2400 * 3200
* 屏幕尺寸320 * 480
* 宽的缩放比例:2400 / 320 = 7
* 高的缩放比例:3200 / 480 = 6
* 两个比例不一样,取较大值


###在内存中创建图片副本
* 加载图片获取的bitmap对象是只读的


#画画板

###保存图片
* 图片在sd卡中,但是图库没有
* 系统每次遍历sd卡时,会把sd卡中的所有多媒体文件(图片、音频、视频)都在MediaStore数据库中保存一个索引,这个索引包含的字段有文件名、文件保存路径、标题、艺术家、持续时间
* 每次启动图库时,图库应用并不会去遍历sd卡,检测图片文件,而是直接从MediaStore数据库读取图片的索引,从而读取到这张图片


#音乐播放

* SeekBar
* 可以反应播放进度,类似于ProgressBar
* 可以拖动,通过拖动可以改变播放进度
#视频播放
* 也是用MediaPlayer
###SurfaceView
* 视频播放在SurfaceView上
* SurfaceView应用了双缓冲技术,适用于对画面实时刷新要求较高的场景
* FFMPEG:开源免费音视频编解码器
* 重量级组件
* 可见时才会创建
* 不可见时就会销毁,可见时再次创建
* vitamio


#摄像头


#内容提供者

* Android四大组件
* ContentProvider
* 把私有数据共享给其他应用访问
* 使用内容提供者可以自己定义访问规则,选择私有数据中哪些共享出去,哪些不共享
#获取系统短信
* 查询sms表
* address
* date
* type
* body

#获取系统联系人

###raw_contacts表
* contact_id:联系人id
###data表:保存联系人的详细信息,一条信息是一行
* data1:联系人信息的具体内容
* raw_contact_id:联系人id,标识该行信息属于哪个联系人
* mimetype_id:标识该行信息属于什么类型
###mimetypes表:mimetype_id对应的mime类型


#知识点回顾

* ADB进程
* adb指令
* adb install xxx.apk
* adb uninstall 包名
* adb devices
* adb start-server
* adb kill-server
* adb shell
* ls
* ps
* rm
* cd
* adb push 文件路径/文件名 sdcard/文件名
* adb pull sdcard/文件名


* Android开发环境
* sdk
* eclipse
* adt:eclipse插件
* DDMS
* 查看Android设备
* 控制台输出
* 给模拟器打电话发短信
* Android项目目录结构
* assets:较大资源文件,没有资源id,使用io流读取
* libs:第三方jar包
* res:资源文件,有资源id
* 按钮点击事件
* 设置侦听
* onClick属性
* android五种常见布局
* 线性
* 相对
* 帧
* 表格:TableRow
* 绝对
* Log
* 控制台输出分5个等级
* Log.v
* Log.e
* 单元测试框架
* AndroidTestCase
* 指令集和类库
* 数据存储
* 文件读写:内部存储、外部存储路径
* SharedPreference
* 键值对形式保存数据
* 保存到xml文件
* 数据库SQLite数据库
* ContentProvider
* 把数据保存在别人的私有文件中
* XML生成解析
* XmlSerializer,序列化器(生成XML文件)
* DOM、SAX、PULL
* pull事件类型
* START_DOCUMENT
* END_DOCUMENT
* START_TAG
* END_TAG
* TEXT
* SQLite数据库
* SQLiteOpenHelper:创建数据库
* 构造方法的4个参数
* SQLiteDatabase:增删改查
* 主键:_id
* ListView:用于显示列表
* 条目是一个View对象,可以用布局文件填充而来
* 设置Adapter
* getCount:获取条目总数
* getView:获取View对象作为条目显示
* 条目一旦划出屏幕,就会被缓存
* 下一次getView方法调用时,会把缓存传进去
* 网络请求
* URL对象封装网址
* 打开连接对象
* 对连接对象做设置
* 请求方式get/post
* 连接/读取超时
* 发送请求,获取相应码
* 服务器通过流把请求的数据交给客户端
*  消息队列机制
* 主线程创建时,就会创建MessageQueue和Looper对象
* 程序员创建Handler对象
* 消息队列中有消息,Looper就把消息取出,交给Handler,触发handleMessage调用
* 发送消息:sendMessage
* 把消息发到创建Handler的那个线程的消息队列
* 消息携带数据
* what
* obj
* setData:Bundle
* Android四大组件
* Activity
* service
* broadcastReceiver
* contentProvider
* Activity
* 生命周期:
* oncreate
* onstart
* onresume
* onpause
* onstop
* ondestroy
* onrestart
* 启动方式:
* startActivity
* startActivityForResult
* 回调onActivityReslut
* 启动模式:
* 标准
* singleTop
* singleTask
* singleInstance
* Intent
* Activity跳转
* Service启动
* 广播发送
* 显式意图:指定目标Activity/Service的字节码
* 隐式意图:设置intent对象去匹配intent-filter
* 可以封装数据
* 八大基本数据类型及其数组
* String及其数组
* bundle
* 实现了序列化接口的对象
* Serializable
* Parcelable
* 广播接收者
* 通过intent-filter定义接收什么广播
* 可以设置优先级,对于有序广播有效
* 有序广播
* 按照优先级区分接收的先后顺序
* 无序广播
* 不分先后顺序
* 不能拦截,不能修改广播内容
* Service
* 启动方式
* startService
* 服务进程
* 服务跟Activity没有一毛钱关系
* onCreate-onStartCommand-onDestroy
* bindService
* 进程优先级不变
* 服务和Activity同生共死
* * onCreate-onBind-onUnbind-onDestroy
* 进程优先级
* 前台进程
* 可见进程
* 服务进程
* 后台进程
* 空进程
* 先杀优先级低的,相同优先级,LRU算法定生死
* AIDL
* 把接口文件后缀名改成aidl
* aidl中默认都是public,不需要也不允许定义访问修饰符
* 中间人对象继承Stub
* 把aidl赋值到启动者的应用中,包名必须一致
* 绑定时获得中间人对象,Stub.asInterface强转
* ContentProvider:
* 共享私有数据
* 提高安全性,可以定义共享规则
* Uri匹配器
* 匹配Uri末尾携带的内容
* ContentObserver:接收通知,内容提供者改变数据库时会发通知
* 播放器
* MediaPlayer:音乐视频
* SurfaceView:视频播放
* surfaceHolder
* 可见时创建,不可见时销毁
* 摄像头
* 启动系统自带的Activity
* Camera:负责拍照
* SurfaceView:显示预览界面


* 图片处理
* 加载图片时会解析图片的所有像素信息
* 内存中使用ARGB保存像素信息,也就是32位色,占用4个字节
* 压缩图片后再加载


#Fragment

* 在一个Activity中切换多个界面,每个界面就是一个Fragment
* Fragmnent的内容也是一个View对象
###生命周期
* 11个方法
* 新的fragment创建,会销毁旧的

#帧动画

* FrameAnimation
* 多张图片快速切换,形成动画效果
* drawable文件夹不放图片,只放资源文件
* ImageView显示图片可以设置内容(src),也可以设置背景(background)

#补间动画

* TweenAnimation
* 为了让对象从初始状态向结束状态改变的过程更加自然而自动生成的动画效果
###位移


TranslateAnimation ta = new TranslateAnimation(-100, 100, -60, 60);
* -100:表示动画的水平方向的初始坐标
* iv原始x -100
* 100:表示动画的水平方向的结束坐标
* iv的原始x + 100


*


TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, -1.5f, Animation.RELATIVE_TO_SELF, 1.5f, Animation.RELATIVE_TO_SELF, -2, Animation.RELATIVE_TO_SELF, 2);
* -1.5f:表示动画的水平方向的初始坐标
* iv的原始x - iv宽度 * 1.5
* 1.5f:表示动画的水平方向的结束坐标
* iv的原始x + iv宽度 * 1.5


###缩放


ScaleAnimation sa = new ScaleAnimation(0.3f, 2, 0.2f, 1, iv.getWidth()/2, iv.getHeight()/2);
* 0.3f:动画x轴的初始比例
* 2:动画x轴的结束比例
*  iv.getWidth()/2:缩放点的x坐标
*  iv原始x + iv.getWidth()/2
###透明


AlphaAnimation aa = new AlphaAnimation(1, 0.2f);
* 1:动画的初始透明度
* 0.2f:动画结束透明度
###旋转


ra = new RotateAnimation(0, -720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
* 0:动画的初始角度
* 720:动画的结束角度
* Animation.RELATIVE_TO_SELF, 0.5f:旋转的中心点坐标:
* iv的原始x + iv宽度 * 0.5

#属性动画

* 属性动画是真正改变对象的某个属性的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值