官网:https://developer.android.google.cn/guide/components/fundamentals
Common Android Views :
http://cn-static.udacity.com/nd801/Common_Android_Views_Cheat_Sheet.pdf
XML可视化工具连接:
https://labs.udacity.com/android-visualizer/#/android/xml-syntax-errors
各种颜色十六进制值:
https://material.io/design/color/#tools-for-picking-colors
-
应用组件
应用组件是Android应用的基本构建基块。四种应用组件分别为 Activity、服务、内容提供程序、广播接收器。
Activity的生命周期如下:
Snip20180719_1.png
服务(service)
服务是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。服务基本上包含两种状态:
- Started : Android的应用程序组件,如活动,通过startService()启动了服务,则服务是Started状态。一旦启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。
Bound : 当Android的应用程序组件通过bindService()绑定了服务,则服务是Bound状态。Bound状态的服务提供了一个客户服务器接口来允许组件与服务进行交互,如发送请求,获取结果,甚至通过IPC来进行跨进程通信。
Snip20180720_1.png
项目中的每一个Service都必须在AndroidManifest.xml中注册才行
广播接收器
广播接收器用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。例如,应用程序可以初始化广播来让其他的应用程序知道一些数据已经被下载到设备,并可以为他们所用。这样广播接收器可以定义适当的动作来拦截这些通信。
Snip20180725_1.png注册广播接收器
- 应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。
- 动态注册
//注册广播接收器 myReceiver = new MyReceiver(); IntentFilter intentFilter = new IntentFilter(); >intentFilter.addAction("com.nangch.broadcasereceiver.MYRECEIVER"); registerReceiver(myReceiver, intentFilter); //因为这里需要注入Message,所以不能在>AndroidManifest文件中静态注册广播接收器 myReceiver.setMessage(this);
内容提供者
内容提供者组件通过请求从一个应用程序向其他的应用程序提供数据。这些请求由类 ContentResolver 的方法来处理。内容提供者可以使用不同的方式来存储数据。数据可以被存放在数据库,文件,甚至是网络。
内容提供者可以让内容集中,必要时可以有多个不同的应用程序来访问。内容提供者的行为和数据库很像。你可以查询,编辑它的内容,使用 insert(), update(), delete() 和 query() 来添加或者删除内容。
- 碎片Fragment
碎片是活动的一部分,是的活动更加的模块化设计。我们可以任务碎片是一种子活动。
下面是关于碎片的重要知识点:
- 碎片拥有自己的布局,自己的行为及自己的生命周期回调。
- 当活动在运行的时候,你可以在活动中添加或者移除碎片。
- 你可以合并多个碎片在一个单一的活动中来构建多栏的UI。
- 碎片可以被用在多个活动中。
- 碎片的生命周期和它的宿主活动紧密关联。这意味着活动被暂停,所有活动中的碎片被停止。
- 碎片可以实现行为而没有用户界面组件。
- 碎片是 Android API 版本11中被加入到 Android API。
Fragment是依赖于Activity的,不能独立存在的。
Snip20180726_1.png
- 清单文件
在Android系统启动应用组件之前,系统必须通过读取应用的AndroidManifest.xml 文件(“清单文件”)确认组件存在。应用必须在此文件中声明其所有组件,且该文件必须位于应用项目目录的根目录中。
除了声明应用的组件外,清单文件还有许多其他作用:
- 确定应用需要的任何用户权限,如互联网访问权限或对用户联系人的读取权限
- 根据应用使用的API,声明应用所需的最低API等级
- 声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务或多点触摸屏幕
- 应用需要连接的API库(Android框架API除外),如Google地图库
- 其他功能
包含在源代码中,但未在清单文件中声明的Activity、服务和内容提供程序对系统不可见,因此也永远不会运行。不过广播接收器可以在清单文件中声明或在代码中动态创建。
-
声明组件功能
我们可以通过在Intent中显示命名目标组件(使用组件类名),以便用Intent来启动Activity、服务和广播接收器。不过Intent的真正强大之处在于隐式Intent概念。隐式Intent的作用无非是描述要执行的操作类型(还可以描述你想执行的操作所针对的数据),让系统能够在设备上找到可以执行该操作的组件,并启动该组件。如果有多个组件可以执行Intent所描述的操作,则有用户选择使用哪一个组件。 -
声明应用要求
基于Android系统的设备多种多样,并非所有设备都提供相同的特性和功能。为防止将您的应用安装在缺少应用所需特性的设备上,必须通过清单文件声明设备和软件要求,为应用支持的设备类型明确定义一个配置文件。其中大多数声明只是为了提供信息,系统不会读取它们,但Google Play等外部服务会读取它们,以便当用户在其设备中搜索应用时为用户提供过滤功能。 -
应用资源
Android应用并非只包含代码,它还需要与源代码分离的资源,如图喜庆、音频文件以及任何与应用的视觉呈现相关的内容。
对于Android项目中包含的每一项资源,SDK构建工具都会定义一个唯一的整形ID,您可以利用它来引用应用代码或XML中定义的其他资源中的资源。 -
UI界面构成
Snip20180712_1.png
Android 应用的界面使用布局(ViewGroup
对象)和微件([View
] 对象)层次结构构建。布局是一种不可见的容器,用于控制其子视图在屏幕上的位置。微件是界面组件,例如按钮和文本框。
Android 为 ViewGroup 和 View 类提供了一个 XML 词汇,因此您的大多数界面都在 XML 文件中定义。此外也可以使用Android Studio Layout Editor 创建布局。 -
密度独立性
应用显示在密度不同的屏幕上时,如果它保持用户界面元素的无力尺寸(从用户视觉)相同,便可实现“密度独立性”。
Android系统通过以下两种方式实现密度独立性:
- 系统更具当前屏幕密度扩展dp单位数
- 系统在必要时可根据当前屏幕密度将可绘制对象资源扩展到适当大小
大多数情况下,确保应用中的屏幕独立性很简单,只需要以适当的密度独立像素(dp为单位)或“wrap_content”
指定所有布局尺寸值。系统然后根据适用于当前屏幕密度的缩放比例适当地缩放位图可绘制对象,以适当的大小显示。
- 屏幕兼容的最佳做法:
- 在XML布局文件中指定尺寸时使用wrap_content、match_parent或dp单位
- 不要在应用代码中使用硬编码的像素值
- 不要使用AbsoluteLayout(已弃用)
- 为不同屏幕密度提供替代位图可绘制对象
下文将提供更详细的信息。
- 对布局尺寸使用 wrap_content、match_parent 或 dp 单位
为 XML 布局文件中的视图定义
android:layout_width
和android:layout_height
时,使用"wrap_content"
、"match_parent"
或dp
单位可确保在当前设备屏幕上为 视图提供适当的尺寸。例如,
layout_width="100dp"
的视图在 中密度屏幕上测出宽度为 100 像素,在高密度屏幕上系统会将其扩展至 150 像素宽, 因此视图在屏幕上占用的物理空间大约相同。类似地,您应选择
sp
(缩放独立的像素)来定义文本 大小。sp
缩放系数取决于用户设置,系统 会像处理dp
一样缩放大小。
- 不要在应用代码中使用硬编码的像素值
由于性能的原因和简化代码的需要,Android 系统使用像素作为 表示尺寸或坐标值的标准单位。这意味着, 视图的尺寸在代码中始终以像素表示,但始终基于当前的屏幕密度。 例如,如果 myView.getWidth() 返回 10,则表示视图在 当前屏幕上为 10 像素宽,但在更高密度的屏幕上,返回的值可能是 15。如果 在应用代码中使用像素值来处理预先未针对 当前屏幕密度缩放的位图,您可能需要缩放代码中使用的像素值,以与 未缩放的位图来源匹配。
-
在内部类中使用外部类方法需要使用外部类名.this引用外部类的实例。
-
屏幕间的跳转和事件传递
Snip20180731_1.png -
布局(Layout)
Snip20180806_1.png
Snip20180806_2.png -
Log的使用
Snip20180810_1.png -
本地化中<xliff:g>标签的使用
要标记不应翻译的文本,请使用<xliff:g> 占位符标记。这是一个示例标记,确保在翻译期间不会更改文本“%1 $ s”(否则它可能会破坏消息):
//xmlns的作用是声明标签xliff
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">BasicKnowledge</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="knowledge_title">Name:<xliff:g id="name" example="Amy">%1$s</xliff:g></string>
</resources>
-
Array和ArrayList的区别
Snip20180816_1.png - List和ArrayList
ArrayList一种动态的数组,可以动态的添加和删除数据
是一个接口,继承自Collection,是不能直接拿来被构造的。而ArrayList则是一个对象,ArrayList向上追溯,最终也会实现Collection这个接口。
经常看到这种写法List list = new ArrayList();
因为List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了
-
三种常见数据持久化存储
image.png
网友评论