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()

Google Android开发文档学习

1.onCreate()

执行基本启动逻辑,声明界面、定义成员变量、配置某些界面等;
2.onStart()

初始化维护界面等

3.onResume()

已恢复来到前台时执行

4.onPause()

表示Activity不再位于前台。停止功能,还可以释放系统资源

5.onStop()

应用应释放或调整在应用对用户不可见时的无用资源

6.onDestroy()

应释放先前的回调尚未释放的所有资源

 

E.Activity之间的跳转

如果不需要返回结果,调用startActivity()

如果需要返回结果,调用startActivityForResult()

 

F.任务和返回栈

Google Android开发文档学习

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.    片段的生命周期

Google Android开发文档学习

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.布局的视图层次结构

Google Android开发文档学习

加载布局资源: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平台上测试应用

 

测试金字塔的级别

测试金字塔说明了应用应如何包含三类测试(即小型、中型和大型测试):

  • 小型测试是指单元测试,用于验证应用的行为,一次验证一个类。
  • 中型测试是指集成测试,用于验证模块内堆栈级别之间的互动或相关模块之间的互动。
  • 大型测试是指端到端测试,用于验证跨越了应用的多个模块的用户操作流程。

Google Android开发文档学习