1. Canvas.save() 跟 Canvas.restore()的调用时机
save: 用来保存
Canvas
的状态。save
之后,可以调用Canvas
的平移,放缩,旋转等操作。
restore
: 用来恢复canvas
之前保存的状态。防止save
后对Canvas
执行的操作对后续的绘制有影响。
2. Android P(9.0) 的新特性
- 支持WiFi室内定位
- 适配刘海屏
- 通知栏改进:可以显示对话,附加照片和表情等
- 多摄像头api
- 对于非
http
连接,将直接拦截,推荐使用https
Android 8.0
PHONE 权限组新增加两个权限
- ANSWER_PHONE_CALLS:允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用 assceptRingingCall() 函数
- READ_PHONE_NUMBERS: 权限允许您的应用读取设备中存储的电话号码
通知适配
为了更好的管理通知的提醒,不想一些不重要的通知打扰用户,新增加用户渠道,用户可根据渠道屏蔽一些不重要的通知
安装apk
在 AndroidManifest 文件中添加未知来源应用的权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
这样系统会自动询问用户完成授权。也可以通过
canRequestPackageInstalls
查询是否有此权限,如果没有的话就使用Settings.ACTION_MANAGE_UNKNOW_APP_SOURCE
引导用户安装未知应用权限去授权。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18if(Build,VERSION>SDK_INT >= 26){
Boolean isInstall = getPackageManager().canRequestPackageInstalls();//26以上
if(isInstall){
//有此权限,安装应用
}else{
//跳转到 安装未知应用 权限界面,引导用户开启权限
Uri selfPackageUri = Uri.parse("package:" + this.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri);
startActivityForResult(intent, REQUEST_CODE_UNKNOWN_APP)
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_UNKNOWN_APP) {
//如果权限开启,则开始安装应用
}
}静态广播无法正常接受
Android N(7.0) 的新特性
- 私有文件外部将不能访问,通过
FileProvider
可解决 SharedPreferences
进程间通信模式闪退,SecurityException
Android 6.0
运行时权限的申请
https
的推荐
3. APK 内容
assets
存放需要打包到APK
中的静态文件lib
目录native
库res
目录 存放应用程序的资源- META-INF 存放应用程序签名和证书的目录
AndroidManifest.xml
classes.dex
resources.arsc
资源配置文件
4. Binder 机制的优点
Linux
中使用的IPC
通信机制有:pipe
(管道),signal
(信号量),Socket
socket
:是一个通用接口,传输效率低,开销比较大;- 管道和消息队列:采用存储转发方式,所以至少需要拷贝2次数据,效率低,共享内存虽然在传输时没有拷贝数据,但其控制机制复杂,而
Binder
更好传输性能。- 安全性更高,可以建立私有通道,有身份标识(UID/PID)
- 另外一个优点就是,通过
binder
可以很方便的调用server
端的方法,犹如调用本地方法一样。
5. Gradle 的生命周期
1.初始化
初始化主要是读取
settings.gragle
文件,用于确定哪些项目参与构建,并创建Project
实例2.配置
配置阶段主要是为每个
build.gradle
文件配置project
对象3.执行
主要根据
gradle
命令和传入参数创建并执行任务