Android开发
Java
开发环境
环境配置:
- JDK下载
https://www.oracle.com/java/technologies/downloads/
- 环境变量
|
|
编译运行Java程序:
代码示例:
|
|
|
|
- 文件名和类名一致
- 一个类对应一个文件
- 包里面的以点分割的字段,分别对应一个文件夹名
编译运行:
应用的示例代码为上面的
- 文件夹结构
- 编译
|
|
- 运行
|
|
Eclipse导出Java工程:
运行Java的可执行Jar文件:
数据类型
关键字
final:
|
|
运算符:
|
|
abstract, extends:
|
|
interface, implements:
|
|
包装类
模板:
|
|
Java中的基本数据类型没有方法和属性, 而包装类就是为了让这些拥有方法和属性,实现对象化交互.
|
|
流程控制语句
跳出多重循环:
|
|
内部类
|
|
集合类的使用
List Set Map
库的使用
百度搜索 java api, 可看到官方网址: https://docs.oracle.com/javase/8/docs/api/
Android
概述
Android网站体系架构
- 最底层,Linux内核.
- HAL层,硬件抽象层,为了不修改Linux代码,因为一旦修改了,就必须开源,Linux开源协议是gpl协议.
- Lib库层,C语言写的,类似于Windows的API.
- ART虚拟机,Dalvik虚拟机已经淘汰了,从Android5.0开始使用ART虚拟机.
- Java Api框架,Java代码写的,让程序员可以用Java调用C.
- 应用层,提供各种各样的控件,直接调用.
Jvm
编译方式:.java文件->.class文件->.jar文件
架构:基于堆栈
Dvm
编译方式:.java文件->.class文件->.dex文件
.dex文件:压缩版的.jar文件,将所有的.class文件合并为一个.dex文件,减少冗余 如:两个class文件中有相同的字符串,这样合并为.dex文件时 相同的字符串只保留了一份.
架构:基于寄存器
AndroidStudio
Android开发者网站安装SDK
安装虚拟机
开启虚拟机开发者模式
- 在设置中,一直点击版本号.
- 在开发者模式中,开启USB调试.
快捷键
重命名:
Shift + F6
注释:
Ctrl + Shift + /
代码格式化:
Ctrl + Alt + L
所选代码封装为方法:
Ctrl + Alt + M
后退:
Ctrl + Alt + 向左箭头
前进:
Ctrl + Alt + 向右箭头
快速代码生成:
Alt + Insert
方法参数提示:
Ctrl + P
查看类方法:
Ctrl + F12
类结构窗口:
Alt + 7
类继承图:
Ctrl + H
APK的生成
APK结构
res目录中的xml文件为二进制格式,称为AXML
SDK目录工具
aapt.exe
res(编译前的资源)-> aapt.exe(aapt2.exe) -> resources.arsc + res(AXML) + AndroidManifest.xml.
可将编译前的资源文件转换成APK文件中的资源文件,也可将APK文件中的资源文件转换成编译前的资源文件.
javac.exe
.java文件->javac.exe->.class文件
dx.bat(d8.bat)
将编译前的*.class文件->dx.bat(d8.bat)->.dex文件 (老版是用dx.bat, 新版是用d8.bat)
zip压缩算法打包
res(AXML) + AndroidManifest.xml + .dex + resources.arsc -> .apk
zipalign.exe
此工具,与dx.bat同目录. 上述生成的.apk文件,需经此工具进行对齐(AndroidStudio生成的apk文件自动对齐),目的是要确保所有未压缩数据的开头均相对于文件开头部分执行特定的对齐.
apksigner.bat(数字签名 RSA)
此工具,与dx.bat同目录. 对上述apk文件,进行数字签名,系统才会安装此apk. 签名在apk文件解压缩后的META-INF文件夹中.
apk签名
V1签名机制只校验了现有的文件,没有校验整个apk文件,这就导致了,可以通过向apk中添加文件达到劫持注入的目的.
签名后的文件,在工程根目录中的app目录下的release目录下.
本地化应用
中文系统,界面就显示中文;英文系统,界面就显示英文.
- 向strings.xml添加字符串
- 修改activity_main.xml中的字符串引用为strings.xml中的
- 复制values文件,添加后缀zh
- 修改values-zh中的strings.xml中的内容为中文
Activity
提供窗口供应用在其中绘制界面,此窗口通常会填满屏幕,但也可能比屏幕小,并浮动在其他窗口上面.
新建一个Activity
- 新建一个类
- 在AndroidManifest.xml文件中说明
快速创建Activity
启动新界面
生命周期
在Avtivity中重写上述虚函数:
进程和应用生命周期
布局
AS新建布局
设置布局
绝对布局
指明子组件的绝对位置,对于不同尺寸的手机来说,适配性较差.
|
|
线性布局
用于使所有子视图在单个方向(垂直或水平)保持对齐.
|
|
相对布局
不能设置权重,目前AS支持很差,已被约束布局取代.
帧布局
一个控件可以覆盖在另一个控件上.
应用场景:切换界面.
表格布局
用的很少,可以用线性布局来做.
约束布局
主流布局,在相对布局的基础上加上权重.
查看别人的布局
要确保AS和模拟器连接上,方可在下方选择进程,查看布局.
控件相关
华丽界面示例
- 创建一个xml文件.
- 写下按钮被按下和未被按下所应用的图片.
- 修改button的背景.
- button修改完成.
模拟Android系统操作xml文件
TextView
EditText
Button
按钮消息响应:
- 自定义一个事件监听类.
- 按钮注册监听.
CheckBox
RadioButton
列表组件
数据适配器
上图展示了数据源、适配器、列表控件之间的关系. 我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的. 数据适配器正是建立了数据源与ListView之间的适配.
常用适配器
ArrayAdapter:
只能操作一个控件,如下述中在操作了TextView控件后,不能修改图片控件.
- 新建一个布局文件, 记录每行的UI.
- 设置.
SimpleAdapter:
- 新建一个布局文件.
- 设置
自定义适配器
不用考虑通用性.
示例:
- 新建一个布局文件.
- 写一个类,继承BaseAdapter.
调用:
源代码
菜单
选项菜单
- 新建一个menu文件夹.
- 新建一个menu Xml文件.
- 重写onCreateOptionsMenu函数,产生菜单.
- 重写onOptionsItemSelected函数,处理菜单消息.
上下文菜单
- 存放菜单相关信息,同上.
- 注册菜单(示例给ListView注册菜单).
- 重写onCreateContextMenu函数,产生菜单.
- 重写onContextItemSelected函数,处理菜单消息.
源代码
提示信息
消息对话框
事件处理模型
基于多态机制
使用场景:
触摸,按键.
示例:
重写虚函数.
基于监听接口
使用场景:
按钮.
监听过程:
事件接口:
示例:
外部类(基本不用):
- 新建一个类实现监听接口.
- 给按钮注册监听器.
内部类(常用):
当按钮较多时,直接由Activity实现监听接口:
匿名类(常用):
跟内部类没有区别, 匿名类会由编译器自动生成为内部类, 生成的类名通常为外部类名$1 外部类名$2…
基于系统设置
Configuration类专门用于描述手机设备上的配置信息.
基于消息循环
Android中只有主线程可操作UI,其他线程操作UI会崩,考虑同步的话会降低效率.
自己创建消息循环:
在Android开发者网站搜索Looper类.
源代码
Intent(意图)
3个信息
- 行为, 指定要执行的通用操作(例如,查看或选取)的字符串.
- 数据.
- 类别,一个包含应处理Intent组件类型的附加信息的字符串.
注册意图
Activity中的意图不能只给行为,也要给类别.
显示Intent
如打车,明确告诉从哪条路走,无跨进程概念.
用Intent来传输数据:
这里启动另一个Activity,将用户名和密码传过去(即便跨进程,也可以将数据传过去),然后另一个Activity将真正的密码传回来,最后取回传回来的数据并显示.
- 启动一个Activity并传数据.
- 另一个Activity接收数据.
- 接收Activity销毁后传回来的数据.
隐式Intent
如点外卖,不用关心外卖是如何送到的,可跨进程.
- 在Manifest说明权限.
- 请求权限.
- 获取请求权限结果.
启动别人的Activity:
- 以自己写的为例.
- 设置闹铃.
- 打电话.
源代码
服务
是一种可在后台执行长时间运行操作而不提供界面的应用组件.
创建服务
- 创建一个类,继承Service.
- 注册服务.
- 启动与停止服务.
本进程和服务进行通讯
- 创建一个内部类,继承Binder.
- 在onBind函数中,返回Binder对象.
- 创建一个ServiceConnection对象.
- 绑定服务.
跨进程操作服务
在高版本的Android系统中,自建服务的跨进程操作,只能在创建服务的子进程中进行操作,只有系统服务,所有进程可操作.
- 将服务放在创建服务的子进程中
- 跨进程启动和停止服务
跨进程通讯
AIDL:
利用内核,进行进程间的通讯.
使用AIDL创建绑定服务:
- 创建.aidl文件.
- 在.aidl文件中声明接口.
此时编译整个工程,会发现编译器帮我们创建了一个ICount的接口.
- 实现声明的接口.
- 在另一个进程中,重写服务连接函数.
若两个工程,需要把aidl文件拷贝过去.
- 绑定服务,解绑服务,与服务进行通讯.
前台服务
UI放在通知栏.
- 在Manifest文件声明权限.
- 创建渠道ID.
- 创建前台服务.
源代码
广播
广播是一种状态的通知,例如我想知道手机网络状态变化,此时我只要注册一个网络状态变化的广播,当系统网络状态发生变化的时候,系统就会发广播,我就可以收到.
广播电台
有序广播
接收广播的时候按优先级,优先级高的先接收到广播,可选择是否中断广播,让后面优先级低的接收不到广播.
无序广播
接收广播的时候无优先级,谁注册了都可以接收到此广播.
本地广播
效率高,不需要跨应用发送广播,可选本地广播.
广播接收者
- 创建一个类继承BroadcastReceiver
- 注册广播
静态注册:
在Manifest文件中进行说明,高版本目前不允许(即便静态注册了,也不会收到广播), 当然也有例外.
为了兼容老版本,在高版本中静态注册会变成动态注册,但必须软件运行起来方可接收到广播.
动态注册:
发送带权限的广播
接收系统广播示例
系统常见广播:
以接收系统短信广播为例:
- Manifest文件中说明权限.
- 新建一个类继承BroadcastReceiver.
- 注册短信广播.
需要应用有接收短信的权限,方可接收到短信广播.
源代码
文件
Android中每个应用有自己的私有空间,其他应用不允许访问.
文件存储
配置文件(保存键值对数据)
使用 SharedPreferences API.
- 创建配置文件并写内容.
创建的文件,在根目录的data/data/包名目录中.
- 读取配置文件.
自定义文件格式
使用Java中的文件流:
示例:
创建的文件,在根目录的data/data/包名目录中.
共享存储
Android中SD卡内容,所有应用共享.
- 说明权限.
- 操作示例.
[Android 10.0后创建文件createNewFile()和创建文件夹mkdirs()均失败解决方案.mhtml](Android 10.0后创建文件createNewFile()和创建文件夹mkdirs()均失败解决方案.mhtml)
源代码
数据库
创建数据库和表:
增:
删:
改:
查:
内容提供程序
内容提供者
- 创建一个类继承ContentProvider, 实现增删改查接口.
- 在Manifest文件中注册内容提供者.
内容接收者
拿上述内容提供者的数据:
增:
删:
改:
查:
内容接收者拿系统内容提供者的数据:
拿联系人信息:
- 在Manifest文件中说明.
- 示例.
拿短信信息:
- 在Manifest文件中说明.
- 示例.
内容观察者
向系统注册一个内容观察者,当内容发生了变化,就会收到通知.
- 在Manifest文件中说明.
- 写一个类继承ContentObserver,重写onChange函数.
- 注册内容观察者.
Fragment
Activity中放Fragment,Fragment中放布局,可以用来切换视图.
- 新建一个布局文件.
- 写一个类继承Fragment,重写onCreateView函数.
- 静态注册.
- 动态注册.
源代码
功能操作
遍历系统安装的软件
管理器:
示例:
通过包管理器,我们可以知道系统安装的软件.
启动应用
卸载应用
遍历进程
流量查看
低版本用TrafficStats 不准确,高版本用NetworkStatsManager.
监控电话
屏幕截图
Android5.0以后,加入了屏幕采集的API.
示例:
无视权限,截图:
在Android系统的system/bin目录下有screencap这个程序,这就是用来截图的.只有当uid = shell或者uid = root才可以调screencap来截图.
shell权限,就是cmd 执行adb shell.
获取Root权限:
未root的手机,system/bin目录下没有su这个程序,所谓的root就是在system/bin目录下放su这个程序.
模拟键盘 鼠标 触摸等:
在system/bin目录下 有个input程序.
网络编程
使用Java的API
PC端为Server, Android端为Client.
Server:
Java中的收发数据跟读写文件一样,一切都是流.
Client:
Android为Client, PC为Server时, 若通过回环地址连接,Android端需填 10.0.2.2
Android为Server, PC为Client时, 若通过回环地址连接,PC端需要做端口映射.
在Android虚拟机打开的情况下,通过adb命令 adb forward tcp:port tcp:port