发布时间:2025-12-10 11:28:55 浏览次数:4
文档地址:https://developer.android.com/guide?hl=zh_cn
应用组件
1.Android共四种不同的应用组件类型:
启动组件
1.有三种(Activity、服务、广播接收器)是通过异步消息Intent来启动,内容提供者会在成为ContentResolver的请求目标时启动;
2.启动Activity:向 startActivity() 或 startActivityForResult() 传递 Intent(让 Activity返回结果),或者为其安排新任务
3.使用 JobScheduler 类来调度操作
4.向sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法传递 Intent 来发起广播
5.在 ContentResolver 上调用 query(),对内容提供程序执行查询。
清单文件
1.清单(AndroidManifest.xml)文件的作用
2.组件声明标签
<application> 元素中,android:icon 属性指向标识应用的图标所对应的资源
<activity> 元素中,android:name 属性指定 Activity 子类的完全限定类名
<activity> 元素中,android:label 属性指定用作 Activity 的用户可见标签的字符串
3.声明应用组件
分组资源类型
1.将各类资源放入项目 res/ 目录的特定子目录,如:一个简单项目的文件层次结构:
MyProject/src/MyActivity.javares/drawable/graphic.pnglayout/main.xmlinfo.xmlmipmap/icon.pngvalues/strings.xml2.资源目录
目录 | 资源类型 |
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.访问资源的两种方式
引用样式属性
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"?><manifestxmlns:androandroid: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" /><applicationandroid: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.MainActivitybased 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><activityandroid: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_DENIED4.需要获取权限时
如果 ContextCompat.checkSelfPermission() 方法返回 PERMISSION_DENIED,请调用 shouldShowRequestPermissionRationale()。如果此方法返回 true,请向用户显示指导界面。请在此界面中说明用户希望启用的功能为何需要特定权限。
-------------------------------------------------------------------------
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四种启动模式:
G.进程
进程类型包括:
H.片段Fragment
1. 可以将片段理解为是Activity的模块化组成部分,并且可以在Activity运行时添加或移除片段
2. 片段的生命周期
3. 向Activity添加片段的方式:
4. 管理片段
从Activity 调用 getSupportFragmentManager(),得到FragmentManager
5. 执行片段事务
从 FragmentManager 获取一个 FragmentTransaction 实例
可以使用 add()、remove() 和 replace() 等方法进行更改,然后必须调用执行commit()
A.概览
Android 架构组件其实就是一组库
B.项目添加组件的方式
打开项目的 build.gradle 文件(而不是应用或模块的该文件)并添加 google() 代码库:
allprojects {repositories {google()jcenter()}}
C.其他具体用法,参考文档即可,不做赘述
A.暂未学习,待定
A.Intent基本用例
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 definenotificationManager.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_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.一般使用子类:
2.使用 DialogFragment 作为对话框的容器
J.菜单Menu
1.三种基本的菜单
2.构建菜单的元素
<menu> <item> <group>
K.设置
1.在 XML 中定义 PreferenceCategory
<PreferenceScreenxmlns:app="http://schemas.android.com/apk/res-auto"><PreferenceCategoryapp:key="notifications_category"app:title="Notifications"><SwitchPreferenceCompatapp:key="notifications"app:title="Enable message notifications"/></PreferenceCategory><PreferenceCategoryapp:key="help_category"app:title="Help"><Preferenceapp: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() {@Overridepublic 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() {@Overridepublic void run() {callback.onComplete(result);}});}}
C.服务
D.广播
-------------------------------------------------------------------------
测试金字塔说明了应用应如何包含三类测试(即小型、中型和大型测试):