Android 是一个开源的,基于 Linux 的移动设备操作系统。
Android 开发环境搭建(Mac)
- 带有英特尔芯片的 Mac OS X10.5.8或更高版本。
- 需要用到的软件列表
- Java JDK5 或 以后版本
- Android SDK
- Java运行时环境(JRE)
- Android Studio
快捷键
- Mac查看已安装JDK版本
/usr/libexec/java_home -V
Android 架构
Linux内核:提供了基本的系统功能,比如进程管理,内存管理,设备管理
程序库:包括开源的 Web 浏览器引擎 Webkit ,知名的 libc 库,用于仓库存储和应用数据共享的 SQLite 数据库,用于播放、录制音视频的库,用于网络安全的 SSL 库等
android.app - 提供应用程序模型的访问,是所有 Android 应用程序的基石。
android.content - 方便应用程序之间,应用程序组件之间的内容访问,发布,消息传递。
android.database - 用于访问内容提供者发布的数据,包含 SQLite 数据库管理类。
android.opengl - OpenGL ES 3D 图片渲染 API 的 Java 接口。
android.os - 提供应用程序访问标注操作系统服务的能力,包括消息,系统服务和进程间通信。
android.text - 在设备显示上渲染和操作文本。
android.view - 应用程序用户界面的基础构建块UI。
android.widget - 丰富的预置用户界面组件集合,包括按钮,标签,列表,布局管理,单选按钮等。
android.webkit - 一系列类的集合,允许为应用程序提供内建的 Web 浏览能力。
运行时:使得每一个 Android 应用程序运行在自己独立的虚拟机进程。
-
应用框架:
- 活动管理者 - 控制应用程序生命周期和活动栈的所有方面。
- 内容提供者 - 允许应用程序之间发布和分享数据。
- 资源管理器 - 提供对非代码嵌入资源的访问,如字符串,颜色设置和用户界面布局。
- 通知管理器 - 允许应用程序显示对话框或者通知给用户。
- 视图系统 - 一个可扩展的视图集合,用于创建应用程序用户界面。
应用程序组件
AndroidManifest.xml
描述了应用程序的每个组件,以及他们如何交互
应用程序中使用的四个主要组件
Activities-UI操作
描述UI,处理用户与屏幕的交互
public class MainActivity extends Activity {
}
Services-后台
-处理与应用程序关联的后台操作
运行在后台,执行长时间操作的组件,例如后台播放音乐,不阻塞用户交互
public class MyService extends Service {
}
BroadcastReceivers-消息接收
可以响应从其他应用程序或者系统发来的广播消息
public class MyReceiver extends BroadcastReceiver {
}
Content Providers-数据处理
处理数据和数据库管理
通过请求从一个应用程序到另一个应用程序提供数据。这些请求由ContentResolver类的方法来处理。这些数据可以是存储在文件系统、数据库或者其他其他地方。
public class MyContentProvider extends ContentProvider {
}
附件组件
Fragments
代表活动中的一个行为或者一部分用户界面
Views
绘制在屏幕上的UI元素,包括按钮,列表等。
Layouts
控制屏幕格式,展示视图外观的View的继承。
Intents
组件间的消息连线
Resources
外部元素,例如字符串资源、常量资源及图片资源
Manifest
应用程序的配置文件
Hello World 实例
- AndroidStudio 创建第一个HelloWorld项目
-
Android 应用程序剖析
Manifest文件
声明所有的组件,这个文件是Android操作系统与你的应用程序之间的接口(如果没有在这个文件中声明你的组件,将无法被操作系统所识别
)
例如:
- andnroid:icon属性指出位于res/drawable-hdpi下面的应用程序图标
- android:name属性指定一个Activity类子类的全名
- android:label属性指定用于活动名称的字符串
Layout 文件 布局文件
当应用程序构建它的界面时被引用。你将非常频繁的修改这个文件来改变应用程序的布局
主要活动文件在MainActivity.java的Java文件中
这是实际的应用程序文件,将被转化为Dalvik可执行文件并运行。
下面为Hello World应用生成的默认代码 (MainActivity.java)
package com.example.helloworld;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
- 方法解析
- R.layout.activity_main引用自res/layout目录下的activity_main.xml文件
- onCreate()是活动被加载之后众多被调用的方法之一
- 运行效果如下
- R 文件,即自动生成的文件
其他
1.资源访问
你用到的各种静态内容,如位图,颜色,布局定义,用户界面字符串,动画等等。这些资源一般放置在项目的 res/ 下独立子目录中。
组织应用程序资源,指定替代资源,并在应用程序中访问它们
在项目中 res/ 目录里面支持的资源
anim/ | 定义动画属性的XML文件。它们被保存在res/anim/文件夹下,通过R.anim类访问 |
---|---|
color/ | 定义颜色状态列表的XML文件。它们被保存在res/color/文件夹下,通过R.color类访问 |
drawable/ | 图片文件,如.png,.jpg,.gif或者XML文件,被编译为位图、状态列表、形状、动画图片。它们被保存在res/drawable/文件夹下,通过R.drawable类访问 |
layout/ | 定义用户界面布局的XML文件。它们被保存在res/layout/文件夹下,通过R.layout类访问 |
menu/ | 定义应用程序菜单的XML文件,如选项菜单,上下文菜单,子菜单等。它们被保存在res/menu/文件夹下,通过R.menu类访问 |
raw/ | 任意的文件以它们的原始形式保存。需要根据名为R.raw.filename的资源ID,通过调用Resource.openRawResource()来打开raw文件 |
values/ | 包含简单值(如字符串,整数,颜色等)的XML文件。这里有一些文件夹下的资源命名规范。arrays.xml代表数组资源,通过R.array类访问;integers.xml代表整数资源,通过R.integer类访问;bools.xml代表布尔值资源,通过R.bool类访问;colors.xml代表颜色资源,通过R.color类访问;dimens.xml代表维度值,通过R.dimen类访问;strings.xml代表字符串资源,通过R.string类访问;styles.xml代表样式资源,通过R.style类访问 |
xml/ | 可以通过调用Resources.getXML()来在运行时读取任意的XML文件。可以在这里保存运行时使用的各种配置文件 |
替代资源
需要为特定的设备配置提供替代的资源支持。比如说,你需要为不同的屏幕分辨率提供替代的图片资源.
在运行时,Android 检测当前设备配置,并为应用程序加载合适的资源。
下面是一个例子,指定默认屏幕的图片和高分辨率的替代图片。
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
layout/
activity_main.xml
info.xml
values/
strings.xml
访问资源
在代码访问资源
当 Android 应用程序被编译,生成一个 R 类,其中包含了所有 res/ 目录下资源的 ID。你可以使用 R 类,通过子类+资源名或者直接使用资源 ID 来访问资源。
访问 res/drawable/myimage.png,并将其设置到 ImageView 上,你将使用以下代码:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
- R.id.myimageview 来在布局文件中获取定义为 myimageview 的 ImageView
- R.drawable.myimage 来获取在 res/ 的 drawable 子目录下名为 myimage 的图片
案例2
res/values/strings.xml 有如下定义
Hello, World!
在 ID 为 msg 的 TextView 对象上使用资源 ID 来设置文本
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);
在XML中访问
资源文件 res/values/strings.xml
#f00
Hello!
在下面的布局文件中使用这些资源来设置文本颜色和文本内容
2.活动(Activity)
一个具有用户界面的单一屏幕(ViewController),Android 系统初始化它的程序是通过活动中的 onCreate() 回调的调用开始的
活动生命周期图如下:
方法概述及详解
- onCreate()在活动第一次创建时调用
- onStart()在活动为用户可见时被调用
- onResume()在应用程序与用户开始可交互的时候调用
- onPause()被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用
- onStop()当活动不在可见时调用
- onDestroy()当活动被系统销毁之前调用
- onRestart()当活动被停止以后重新打开时调用
代码
package com.example.helloworld;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
String msg = "Android : ";
/** 当活动第一次被创建时调用 */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
/** 当活动即将可见时调用 */
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "The onStart() event");
}
/** 当活动可见时调用 */
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "The onResume() event");
}
/** 当其他活动获得焦点时调用 */
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "The onPause() event");
}
/** 当活动不再可见时调用 */
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "The onStop() event");
}
/** 当活动将被销毁时调用 */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "The onDestroy() event");
}
}
点击 Android 模拟器上的红色按钮
,它将在窗口中产生如下的事件消息:
07-19 15:01:10.995: D/Android :(866): The onPause() event
07-19 15:01:12.705: D/Android :(866): The onStop() event
点击 Android 模拟器上的菜单按钮
,它将在 窗口中产生如下的事件消息
07-19 15:01:13.995: D/Android :(866): The onStart() event
07-19 15:01:14.705: D/Android :(866): The onResume() event
击Android模拟器上的返回按钮
,它将在窗口中产生如下的事件消息
07-19 15:33:15.687: D/Android :(992): The onPause() event
07-19 15:33:15.525: D/Android :(992): The onStop() event
07-19 15:33:15.525: D/Android :(992): The onDestroy() event