Google Android开发文档学习
文档地址:https://developer.android.com/guide?hl=zh_cn
基础知识
应用组件
1.Android共四种不同的应用组件类型:
- 活动Activity
- 服务Service
- 广播接收器BroadcastReceiver
- 内容提供者ContentProvider
启动组件
1.有三种(Activity、服务、广播接收器)是通过异步消息Intent来启动,内容提供者会在成为ContentResolver的请求目标时启动;
2.启动Activity:向 startActivity() 或 startActivityForResult() 传递 Intent(让 Activity返回结果),或者为其安排新任务
3.使用 JobScheduler 类来调度操作
4.向sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法传递 Intent 来发起广播
5.在 ContentResolver 上调用 query(),对内容提供程序执行查询。
清单文件
1.清单(AndroidManifest.xml)文件的作用
- 读取确认组件
- 确认用户权限
- 声明最低API级别
- 声明硬件和软件功能
- 声明API库
2.组件声明标签
<application> 元素中,android:icon 属性指向标识应用的图标所对应的资源
<activity> 元素中,android:name 属性指定 Activity 子类的完全限定类名
<activity> 元素中,android:label 属性指定用作 Activity 的用户可见标签的字符串
3.声明应用组件
- Activity 的 <activity> 元素
- 服务的 <service> 元素
- 广播接收器的 <receiver> 元素
- 内容提供程序的 <provider> 元素
应用资源
分组资源类型
1.将各类资源放入项目 res/ 目录的特定子目录,如:一个简单项目的文件层次结构:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml
2.资源目录
目录 |
资源类型 |
animator/ |
定义属性动画 |
anim/ |
定义渐变动画 |
color/ |
定义颜色状态列表 |
drawable/ |
位图文件(.png、.9.png、.jpg、.gif)或编译为以下可绘制对象资源子类型的 XML 文件: 位图文件、九宫格(可调整大小的位图)、状态列表、形状、动画可绘制对象、其他可绘制对象 |
mipmap/ |
启动器图标 |
layout/ |
定义用户界面布局的 XML 文件 |
menu/ |
定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件 |
raw/ |
需以原始形式保存的任意文件 |
values/ |
包含字符串、整型数和颜色等简单值的 XML 文件。命名约定: arrays.xml:资源数组(类型数组)。colors.xml:颜色值。dimens.xml:尺寸值。strings.xml:字符串值。styles.xml:样式。 |
xml/ |
可在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处 |
font/ |
带有扩展名的字体文件(如 .ttf、.otf 或 .ttc),或包含 <font-family> 元素的 XML 文件 |
访问应用资源
1.访问资源的两种方式
- 在代码中:使用来自 R 类子类的静态整型数:[<package_name>.]R.<resource_type>.<resource_name>,例如:R.string.hello
- 在XML中:使用同样与 R 类中所定义资源 ID 对应的特殊 XML 语法:@[<package_name>:]<resource_type>/<resource_name>,例如:@string/hello
引用样式属性
1.语法:?[<package_name>:][<resource_type>/]<resource_name>
2.例子:android:textColor="?android:textColorSecondary"
访问平台资源
1.访问方式:通过 android 包名称限定资源引用
2.例子
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
应用清单文件
文件功能介绍
1.软件包名称和应用ID
2.应用组件
3.Intent过滤器
4.图标和标签
5.权限
6.设备兼容性,如<uses-feature>、<uses-sdk>
示例:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.example.myapp"> <!-- Beware that these values are overridden by the build.gradle file --> <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- This name is resolved to com.example.myapp.MainActivity based upon the package attribute --> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".DisplayMessageActivity" android:parentActivityName=".MainActivity" /> </application> </manifest>
<action> | 向 Intent 过滤器添加操作。 |
<activity> | 声明 Activity 组件。 |
<activity-alias> | 声明 Activity 的别名。 |
<application> | 应用的声明。 |
<category> | 向 Intent 过滤器添加类别名称。 |
<compatible-screens> | 指定与应用兼容的每个屏幕配置。 |
<data> | 向 Intent 过滤器添加数据规范。 |
<grant-uri-permission> | 指定父级内容提供程序有权访问的应用数据的子集。 |
<instrumentation> | 声明支持您监控应用与系统进行交互的 Instrumentation 类。 |
<intent-filter> | 指定 Activity、服务或广播接收器可以响应的 Intent 类型。 |
<manifest> | AndroidManifest.xml 文件的根元素。 |
<meta-data> | 可以提供给父级组件的其他任意数据项的名称-值对。 |
<path-permission> | 定义内容提供程序中特定数据子集的路径和所需权限。 |
<permission> | 声明安全权限,可用于限制对此应用或其他应用的特定组件或功能的访问。 |
<permission-group> | 为相关权限的逻辑分组声明名称。 |
<permission-tree> | 声明权限树的基本名称。 |
<provider> | 声明内容提供程序组件。 |
<receiver> | 声明广播接收器组件。 |
<service> | 声明服务组件。 |
<supports-gl-texture> | 声明应用支持的一种 GL 纹理压缩格式。 |
<supports-screens> | 声明应用支持的屏幕尺寸,并为大于此尺寸的屏幕启用屏幕兼容模式。 |
<uses-configuration> | 指明应用要求的特定输入功能。 |
<uses-feature> | 声明应用使用的单个硬件或软件功能。 |
<uses-library> | 指定应用必须链接到的共享库。 |
<uses-permission> | 指定为使应用正常运行,用户必须授予的系统权限。 |
<uses-permission-sdk-23> | 指明应用需要特定权限,但仅当应用在运行 Android 6.0(API 级别 23)或更高版本的设备上安装时才需要。 |
<uses-sdk> | 您可以通过整数形式的 API 级别,表示应用与一个或多个版本的 Android 平台的兼容性。 |
应用权限
权限概览
1.权限申请:在AndroidManifest中添加<uses-permission>标记
2.危险权限的请求提示:
- 运行时请求
- 安装时请求
3.如何确定应用是否已获得权限
将该权限传入 ContextCompat.checkSelfPermission() 方法。根据应用是否具有相应权限,此方法会返回 PERMISSION_GRANTED 或 PERMISSION_DENIED
4.需要获取权限时
如果 ContextCompat.checkSelfPermission() 方法返回 PERMISSION_DENIED,请调用 shouldShowRequestPermissionRationale()。如果此方法返回 true,请向用户显示指导界面。请在此界面中说明用户希望启用的功能为何需要特定权限。
-------------------------------------------------------------------------
Android开发核心主题
一、Activity
A.概念
其实就是应用与用户互动的入口点;其中一个需要指定为主Activity
B.声明Activity
添加 <activity> 元素作为 <application> 元素的子元素,例如:
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
此元素唯一的必要属性是 android:name,该属性用于指定 Activity 的类名称
C.声明intent过滤器
<intent-filter>
<action android:name="android.intent.action.SEND" /> // 指定该 Activity 会发送数据
<category android:name="android.intent.category.DEFAULT" /> // 使 Activity 能够接收启动请求
<data android:mimeType="text/plain" /> // 指定此 Activity 可以发送的数据类型
</intent-filter>
D.Activity生命周期
Activity 类提供六个核心回调:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()
1.onCreate()
执行基本启动逻辑,声明界面、定义成员变量、配置某些界面等;
2.onStart()
初始化维护界面等
3.onResume()
已恢复来到前台时执行
4.onPause()
表示Activity不再位于前台。停止功能,还可以释放系统资源
5.onStop()
应用应释放或调整在应用对用户不可见时的无用资源
6.onDestroy()
应释放先前的回调尚未释放的所有资源
E.Activity之间的跳转
如果不需要返回结果,调用startActivity()
如果需要返回结果,调用startActivityForResult()
F.任务和返回栈
Activity四种启动模式:
- standard :Activity 可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例
- singleTop:Activity 可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例(但前提是返回堆栈顶部的 Activity 不是该 Activity 的现有实例)
- singleTask:系统会创建新任务,并实例化新任务的根 Activity。Activity 一次只能有一个实例存在
- singleInstance:与 "singleTask" 相似,唯一不同的是系统不会将任何其他 Activity 启动到包含该实例的任务中。该 Activity 始终是其任务唯一的成员;由该 Activity 启动的任何 Activity 都会在其他的任务中打开
G.进程
进程类型包括:
- 前台进程:用户目前执行操作所需的进程
- 可见进程:正在进行用户当前知晓的任务
- 服务流程:包含一个已使用 startService() 方法启动的 Service
- 缓存进程:目前不需要的进程
H.片段Fragment
1. 可以将片段理解为是Activity的模块化组成部分,并且可以在Activity运行时添加或移除片段
2. 片段的生命周期
3. 向Activity添加片段的方式:
- 在 Activity 的布局文件内声明片段<fragment>
- 通过编程方式将片段添加到某个现有 ViewGroup
4. 管理片段
从Activity 调用 getSupportFragmentManager(),得到FragmentManager
5. 执行片段事务
从 FragmentManager 获取一个 FragmentTransaction 实例
可以使用 add()、remove() 和 replace() 等方法进行更改,然后必须调用执行commit()
二、架构组件
A.概览
Android 架构组件其实就是一组库
B.项目添加组件的方式
打开项目的 build.gradle 文件(而不是应用或模块的该文件)并添加 google() 代码库:
allprojects { repositories { google() jcenter() } }
C.其他具体用法,参考文档即可,不做赘述
三、导航组件
A.暂未学习,待定
四、Intent和Intent过滤器
A.Intent基本用例
- 启动Activity
- 启动服务
- 传递广播
B.通用Intent
闹铃
创建闹铃:ACTION_SET_ALARM
创建定时器:ACTION_SET_TIMER
显示所有闹铃:ACTION_SHOW_ALARMS
日历
添加日历事件:ACTION_INSERT
相机
拍摄照片或视频并将其返回:ACTION_IMAGE_CAPTURE 或 ACTION_VIDEO_CAPTURE
以静态图像模式启动相机应用:INTENT_ACTION_STILL_IMAGE_CAMERA
以视频模式启动相机应用:INTENT_ACTION_VIDEO_CAMERA
联系人/人员应用
选择联系人:ACTION_PICK
选择特定联系人数据:ACTION_PICK
查看联系人:ACTION_VIEW
编辑现有联系人:ACTION_EDIT
插入联系人:ACTION_INSERT
电话
发起通话:ACTION_DIAL
设置
打开特定设置部分:ACTION_SETTINGS、ACTION_WIRELESS_SETTINGS、...
.....等
五、界面
A.布局
1.布局的视图层次结构
加载布局资源:setContentView(R.layout.main_layout);
B.Material Design
1.概念
是用于指导用户在各种平台和设备上进行视觉、动作和互动设计的全面指南
2.悬浮按钮 FloatingActionButton
3.涉及功能
文本、按钮、复选框、单选按钮、切换按钮、微调框、选择器、提示
C.通知
1.添加依赖库
dependencies { implementation "com.android.support:support-compat:28.0.0" }
2.设置通知内容
NotificationCompat.Builder 对象设置通知内容和渠道
小图标,通过 setSmallIcon() 设置
标题,通过 setContentTitle() 设置
正文文本,通过 setContentText() 设置
通知优先级,通过 setPriority() 设置
setStyle() 添加样式模板来启用可展开的通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(new NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT);
3.Android 8.0及以上版本展示:
必须先通过向 createNotificationChannel() 传递 NotificationChannel 的实例在系统中注册应用的通知渠道,然后才能在 Android 8.0 及更高版本上提供通知。
4.显示通知
调用 NotificationManagerCompat.notify(),并将通知的唯一 ID 和 NotificationCompat.Builder.build() 的结果传递给它
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); // notificationId is a unique int for each notification that you must define notificationManager.notify(notificationId, builder.build());
D.应用栏
1.Toolbar/ActionBar
2.设置应用栏
1)添加 v7 appcompat 支持库
2)Activity 继承 AppCompatActivity
3)在应用清单中,将 <application> 元素设置为使用 appcompat 的其中一个 NoActionBar 主题背景。使用其中一个主题背景可以防止应用使用原生 ActionBar 类提供应用栏
4)向 Activity 的布局添加一个 Toolbar
5)在 Activity 的 onCreate() 方法中,调用 Activity 的 setSupportActionBar() 方法,然后传递 Activity 的工具栏
E.系统界面可见度
1.调暗系统栏
View.SYSTEM_UI_FLAG_LOW_PROFILE
2.隐藏状态栏
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
3.隐藏导航栏
SYSTEM_UI_FLAG_HIDE_NAVIGATION
4.全屏模式
选项:
- 向后倾斜模式:调用 setSystemUiVisibility() 并传递 SYSTEM_UI_FLAG_FULLSCREEN 和SYSTEM_UI_FLAG_HIDE_NAVIGATION
- 沉浸模式:调用 setSystemUiVisibility() 并将 SYSTEM_UI_FLAG_IMMERSIVE 标志与 SYSTEM_UI_FLAG_FULLSCREEN 和 SYSTEM_UI_FLAG_HIDE_NAVIGATION 一起传递
- 粘性沉浸模式:调用 setSystemUiVisibility() 并将 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 标志与 SYSTEM_UI_FLAG_FULLSCREEN 和 SYSTEM_UI_FLAG_HIDE_NAVIGATION 一起传递
启用方式:
调用 setSystemUiVisibility() 并将其传递给 SYSTEM_UI_FLAG_HIDE_NAVIGATION 和/或 SYSTEM_UI_FLAG_FULLSCREEN。可以包含 SYSTEM_UI_FLAG_IMMERSIVE(用于普通沉浸模式)或 SYSTEM_UI_FLAG_IMMERSIVE_STICKY(用于粘性沉浸模式),也可以同时不含这两种标记以启用向后倾斜模式。
F.滑动刷新
1.添加 SwipeRefreshLayout 微件
将 SwipeRefreshLayout 添加为单个 ListView 或 GridView 的父级
2.将刷新操作添加到操作栏
android:showAsAction=never
3.响应刷新请求
实现 SwipeRefreshLayout.OnRefreshListener 接口及其 onRefresh() 方法
G.消息框
1.消息展示
Toast.makeText(context, text, duration).show();
2.调整消息位置
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
H.弹出消息Snackbar
1.将现有的布局元素封装在 CoordinatorLayout 中
2.创建Snackbar对象
Snackbar mySnackbar = Snackbar.make(view, stringId, duration);
3.为消息添加操作
定义一个可实现 View.OnClickListener 接口的监听器对象。如果用户点击该消息操作,系统会调用您的监听器的 onClick() 方法;且在调用 show() 之前附加监听器
mySnackbar.setAction(R.string.undo_string, new MyUndoListener());
mySnackbar.show();
I.对话框Dialog
1.一般使用子类:
- AlertDialog
- DatePickerDialog 或 TimePickerDialog
2.使用 DialogFragment 作为对话框的容器
J.菜单Menu
1.三种基本的菜单
- 选项菜单和应用栏:某个 Activity 的主菜单项集合
- 上下文菜单和上下文操作模式:用户长按某元素时出现的浮动菜单
- 弹出菜单:以垂直列表形式显示一系列项目
2.构建菜单的元素
<menu> <item> <group>
K.设置
1.在 XML 中定义 PreferenceCategory
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <PreferenceCategory app:key="notifications_category" app:title="Notifications"> <SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/> </PreferenceCategory> <PreferenceCategory app:key="help_category" app:title="Help"> <Preference app:key="feedback" app:summary="Report technical issues or suggest new features" app:title="Send feedback"/> </PreferenceCategory> </PreferenceScreen>
L.搜索
M.复制和粘贴
N.拖放
六、动画和过度
七、图片和图形
八、音频和视频
九、后台任务
A.后台任务处理
1.后台任务的分类
即时任务、延期任务、精确任务
B.在后台线程中运行 Android 任务
1.创建多个线程
线程池是在队列中并行运行任务的托管线程集合。当现有线程变为空闲状态时,新任务会在这些线程上执行。如需将任务发送到线程池,请使用 ExecutorService 接口
2.在后台线程中执行
在主线程上发出网络请求会导致该线程处于等待或阻塞状态,直到它收到响应。由于该线程处于阻塞状态,因此操作系统无法调用 onDraw(),于是应用会冻结,这样有可能导致出现应用无响应 (ANR) 对话框。我们改为在后台线程上运行此操作
3.与主线程进行通信
在切换回主线程之前,无法直接修改界面层或与其通信
4.使用处理程序
可以使用 Handler 将要在其他线程上执行的操作加入队列。如需指定要在哪个线程上运行操作,使用 Looper 为线程构造 Handler。Looper 是为关联的线程运行消息循环的对象。创建 Handler 后,可以使用 post(Runnable) 方法在相应的线程中运行代码块。
public class LoginRepository { ... public void makeLoginRequest( final String jsonBody, final RepositoryCallback<LoginResponse> callback, final Handler resultHandler, ) { executor.execute(new Runnable() { @Override public void run() { try { Result<LoginResponse> result = makeSynchronousLoginRequest(jsonBody); notifyResult(result, callback, resultHandler); } catch (Exception e) { Result<LoginResponse> errorResult = new Result.Error<>(e); notifyResult(errorResult, callback, resultHandler); } } }); } private void notifyResult( final Result<LoginResponse> result, final RepositoryCallback<LoginResponse> callback, final Handler resultHandler ) { resultHandler.post(new Runnable() { @Override public void run() { callback.onComplete(result); } }); } }
C.服务
D.广播
十、应用数据和文件
十一、用户数据和身份
十二、用户位置
十三、触摸和输入
十四、CameraX
十五、相机
十六、传感器
十七、连接性
十八、RenderScript
十九、基于网络的内容
二十、Android App Bundle
二十一、Google Play
二十二、切片
-------------------------------------------------------------------------
在Android平台上测试应用
测试金字塔的级别
测试金字塔说明了应用应如何包含三类测试(即小型、中型和大型测试):
- 小型测试是指单元测试,用于验证应用的行为,一次验证一个类。
- 中型测试是指集成测试,用于验证模块内堆栈级别之间的互动或相关模块之间的互动。
- 大型测试是指端到端测试,用于验证跨越了应用的多个模块的用户操作流程。