1, 移动设备操作系统
iOS
Windows Phone
Android
2, 安卓平台的技术架构
Linux 内核层
中间层: 程序库, Android 运行时环境
应用程序框架
应用层: 应用程序
3, Activity 通常就是一个单独的屏幕
4, 简述 Android 的优势
1, 系统的开放性和免费性
2, 移动互联网的发展
3, 相关厂商的大力支持
Activity 具有生命周期, 在生命周期的过程中共有四种状态:
1, 激活或者运行状态: 此时 Activity 运行在屏幕的前台
2, 暂停状态: 此时 Activity 失去了焦点, 但是仍然对用户可见, 例如在该 Activity 上遮挡了一个透明的或者非全屏的 Activity
3, 停止状态: 此时 Activity 被其他 Activity 完全覆盖
4, 终止状态: 此时 Activity 会被系统清理出内存
处于暂停状态和停止状态的 Activity 仍然保存了其所有的状态和成员信息, 直到被系统终止, 当被系统终止的 Activity 需要重新显示的时候, 它必须重新启动, 并且将关闭之前的状态全部恢复回来
Activity 从一个状态运行到另一个状态, 状态改变时会执行相应的生命周期方法
方法 | 功能描述 | 下一个方法 |
---|---|---|
onCreate( ) | Activity 初次创建时被调用, 在该方法中一般进行一些静态设置, 如创建 view 视图, 进行数据绑定等. 如果 Activity 是首次创建, 本方法执行完以后将会调用 onStart( )方法, 如果 Activity 是停止后重新显示泽调用 onRestart( ) 方法 | onStart()或onRestart() |
onStart( ) | 当 Activity 即将对用户可见时调用 | onRestart()或onResume() |
onRestart() | 当 Activity 从停止状态重新启动时调用 | onResume() |
onResume() | 当 Activity 将要与用户交互时调用此方法, 此时 Activity 在 Activity 栈的栈顶, 用户输入的信息可以传递给它. 如果其他的 Activity 在它的上方恢复显示, 则调用 onPause()方法 | onPause( ) |
onPause( ) | 当系统要启动一个其他的 Activity 之前, 这个方法将调用, 用于提交持久数据的改变, 停止动画等待 | onResume()或onStop() |
onStop( ) | 当另外一个 Activity 恢复并遮挡住当前的 Activity, 导致其对用户不可见时, 该方法被调用 | onStart()或onDestroy() |
onDestroy() | 在 Activity 被销毁前调用的最后一个方法 | 无 |
Activity 的生命周期还可以根据不同的标准分为:
完整生命周期:
从Activity 最初调用 onCreate()方法到最终调用 onDestroy()方法的这个过程称为完整生命周期
可见生命周期:
从 Activity 调用 onStart()方法开始, 到调用对应的 onStop()方法为止的这个过程称为可见生命周期
前台生命周期:
从 Activity 调用 onResume()方法开始, 到调用对应的 onPause()方法为止的这个过程称为前台生命周期
使用图片资源设置 Activity 的背景
新建 Android 项目, 复制图片到res/drawable-mdpi
目录下, 编辑布局文件 res/layout/activity_main.xml
代码如下:
android:background="@drawable/td"
其中 td 为图片名称
1, Activity 生命周期中的 onStart( )
方法用于 Activity 初次创建时被调用
2, 暂停状态
下的 Activity 失去了焦点, 但是依然对用户可见
3, Activity 的可见生命周期是 从 onStart() 到 onStop() 的这个过程
4, Android 程序不能直接访问的资源(原生文件)存放在 assets 目录
5, 简述 Activity 的生命周期的各个方法
onCreate(): Activity 初次创建时被调用, 在该方法中一般进行一些静态设置, 例如: 创建 View 视图, 进行数据绑定等
onStart(): 当 Activity 对用户即将可见时被调用
onRestart: 当 Activity 从停止状态重新启动时被调用
onResume(): 当 Activity 将要与用户交互时调用此方法
onPause(): 当系统要启动一个其他的 Activity 时被调用
onStop(): 当一个 Activity 恢复并遮盖住当前的 Activity, 导致其对用户不可见时被调用
onDestroy(): 在 Activity 被销毁前调用的最后一个方法
Android 系统中引用 Java 的事件处理机制, 包括事件, 事件源和事件监听器三个事件模型
1, 事件(Event):
是一个描述事件源状态改变的对象, 事件不是通过 new 运算符创建的, 而是由用户操作触发的. 事件可以是键盘事件, 触摸事件等. 事件一般作为事件处理方法的参数, 以便从中获取事件的相关信息
2, 事件源(Event Source):
产生事件的对象, 事件源通常是 UI 组件, 例如单机按钮, 则按钮就是事件源
3, 事件监听器(Event Listener):
当事件产生时, 事件监听器用于对该事件进行响应和处理. 监听器需要实现监听接口中定义的事件处理方法
Android 中常用的事件监听器如下所示, 这些事件都定义在 android.view.View
中
事件监听器接口 | 事件 | 说明 |
---|---|---|
OnClickListener | 单击事件 | 当用户单击某个组件或者方向键 |
OnFocusChangeListener | 焦点事件 | 组件获得或失去焦点时产生的事件 |
OnKeyListener | 按键事件 | 用户按下或者释放设备上的某个按键 |
OnTouchListener | 触碰事件 | 设备具有触摸功能时, 触碰屏幕时产生 |
OnCreateContextMenuListener | 创建上下文菜单事件 | 创建上下文菜单时产生该事件 |
OnCheckedChangeListener | 选项事件 | 选择改变时触发该事件 |
实现事件处理的步骤如下:
1, 创建事件监听器
2, 在事件处理方法中编写事件处理代码
3, 在相应的组件上注册监听器
提示信息(Toast)
提示信息(Toast)是 android 中用来显示提示信息的一种机制, 与对话框不同, Toast 时没有焦点的, 而且 Toast 显示时间有限, 过一定时间就会自动消失. Toast 类定义在 android.widget 包中, 常用方法如下:
方法 | 功能说明 |
---|---|
Toast(Context context) | 构造函数 |
setDuration(int duration) | 设置提示信息显示的时长, 可以设置两种值: Toast.LENGTH_LONG 和 Toast.LENGTH_SHORT |
setText(CharSequence s) | 设置显示的文本 |
cancel() | 关闭提示信息, 即不显示 |
makeText(Context context, CharSequence text, int duration) | 该方法是静态方法, 用于直接创建一个带文本的提示信息, 并指明时长 |
show() | 显示提示信息 |
创建 Toast 的步骤如下:
1, 调用 Toast 的静态方法 makeText() 创建一个指定文本和时长的提示信息
2, 调用 Toast 的 show() 方法显示提示信息
演示 Toast 的创建和显示
package com.example.toastactivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class ToastActivity extends Activity {
private Button b1, b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_toast);
b1 = (Button)findViewById(R.id.button01);
b2 = (Button)findViewById(R.id.button02);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Toast t1 = Toast.makeText(getApplicationContext(),
"我多显示一会儿", Toast.LENGTH_LONG);
t1.show();
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Toast t2 = Toast.makeText(getApplicationContext(),
"我少显示一会儿", Toast.LENGTH_SHORT);
t2.show();
}
});
}
}
Android 菜单分为两种类型
- 选项菜单
- 上下文菜单
一般通过手机上的 Menu 键来显示菜单
创建选项菜单的步骤
1, 覆盖 Activity 的 onCreateOptionsMenu( ) 方法, 当第一次打开菜单时该方法被自动调用
2, 调用 Menu 的 add( ) 方法添加菜单项(MenuItem)
3, 当菜单项被选择时, 覆盖 Activity 的 onOptionsItemSelected( ) 方法来响应事件
演示选项菜单的使用
OptionMenuActivity.java
package com.example.optionmenuactivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class OptionMenuActivity extends Activity {
private final static int ITEM = Menu.FIRST;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_option_menu);
}
// 重写 onCreateOptionsMenu() 方法添加选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 添加菜单项
menu.add(0, ITEM, 0, "开始");
menu.add(0, ITEM + 1, 0, "退出");
return true;
}
// 重写 onOptionsItemSelected() 方法, 响应选项菜单被单击事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM:
// 设置 Activity 标题
setTitle("开始游戏");
break;
case ITEM + 1:
// 设置 Activity 标题
setTitle("退出游戏");
break;
}
return true;
}
}
ContextMenu 上下文菜单是 android.view.Menu 的子类, 提供了用于创建和添加菜单的接口, 其常用方法如下:
方法 | 功能描述 |
---|---|
setHeaderIcon(int iconRes) | 设置上下文菜单的图标 |
setHeaderIcon(Drawable icon) | 设置上下文菜单的图标 |
setHeaderTitle(CharSequence title) | 设置上下文菜单的标题 |
setHeaderTitle(int titleRes) | 设置上下文菜单的标题 |
add(int groupId, int itemId, int order, CharSequence title) | 添加子菜单 |
创建上下文菜单的步骤:
- 重写 Activity 的 onCreateContextMenu( ) 方法, 调用 Menu 的 add( ) 方法添加菜单项(MenuItem)
- 重写 onCreateItemSelected( ) 方法, 响应菜单单击事件
- 在 Activity 的 onCreate( ) 方法中, 调用 registerForContextMenu( ) 方法, 为视图注册上下文菜单
演示上下文菜单的使用
ContextMenuActivity.java
package com.example.contextmenuactivity;
import org.w3c.dom.Text;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
public class ContextMenuActivity extends Activity {
// 菜单 ID 常量
private static final int ITEM0 = Menu.FIRST;
private static final int ITEM1 = Menu.FIRST + 1;
private static final int ITEM2 = Menu.FIRST + 2;
private static final int ITEM3 = Menu.FIRST + 3;
private static final int ITEM4 = Menu.FIRST + 4;
// 声明文本视图
private TextView myTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 根据 ID 获取文本视图
myTV = (TextView) findViewById(R.id.TextView01);
// 在文本视图上注册上下文菜单
registerForContextMenu(myTV);
}
// 重写 onCreateOptionsMenu() 方法添加选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 添加菜单项
menu.add(0, ITEM0, 0, "开始");
menu.add(0, ITEM1, 0, "退出");
return true;
}
// 重写 onOptionsItemSelected() 方法, 响应选项菜单被单击事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM0:
// 设置 Activity 标题
setTitle("开始游戏");
break;
case ITEM1:
// 设置 Activity 标题
setTitle("退出游戏");
break;
}
return true;
}
// 重写 onCreateContextMenu() 方法添加上下文菜单
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// 添加菜单项
menu.add(0, ITEM2, 0, "红色背景");
menu.add(0, ITEM3, 0, "黄色背景");
menu.add(0, ITEM4, 0, "蓝色背景");
}
// 重写 onCreateItemSelected() 方法, 响应上下文菜单被单击事件
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM2:
// 设置文本视图的背景颜色
myTV.setBackgroundColor(Color.RED);
break;
case ITEM3:
// 设置文本视图的背景颜色
myTV.setBackgroundColor(Color.YELLOW);
break;
case ITEM4:
// 设置文本视图的背景颜色
myTV.setBackgroundColor(Color.BLUE);
break;
}
return true;
}
}
1, 不属于 Android 用户界面元素的是 资源引用
2, 监听器
不是通过 new 运算符创建的, 而是由用户操作触发的
3, Spinner 是 下拉列表
组件
4, 简述创建选项菜单和上下文菜单的步骤
选项菜单创建步骤
- 覆盖 Activity 的 onCreateOptionsMenu( ) 方法, 当第一次打开菜单时该方法被自动调用
- 调用 Menu 的 add( ) 方法添加菜单项(MenuItem)
- 当菜单项被选择时, 覆盖 Activity 的 onOptionsItemSelected( ) 方法来响应事件
上下文菜单创建步骤
- 重写 Activity 的 onCreateContextMenu( ) 方法, 调用 Menu 的 add( ) 方法添加菜单项(MenuItem)
- 重写 onCreateItemSelected( ) 方法, 响应菜单单击事件
- 在 Activity 的 onCreate( ) 方法中, 调用 registerForContextMenu( ) 方法, 为视图注册上下文菜单
Android 应用程序的三个核心组件:
活动(Activity)
广播接收器(Broadcast Receiver)
服务(Service)
都可以通过 Intent
来启动或激活, Intent
启动不同组件的方法如下
核心组件 | 调用方法 | 作用 |
---|---|---|
Activity | Context.startActivity( ) 和 Activity.startActivityForRestult( ) | 启动一个 Activity 或使一个已经存在的 Activity 去做新的工作 |
Services | Context.startService( ) 和 Context.bindService( ) | 初始化一个 Service 或传递一个新的操作给当前正在运行的 Service 绑定一个已经存在的Service |
Broadcast Receiver | Context.sendBroadcast( ) Context.sendOrderedBroadcast() Context.sendStickyBroadcast( ) | 对所有想接受消息的 Broadcast Receiver 传递消息 |
多 Activity 的 Android 应用程序可通过 startActivity( )
方法指定相应的 Intent
对象来启动另外一个 Activity
通过 Intent 实现多 Activity 的 Android 应用的启动
首先创建两个 xml 页面
Activity01.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="第一个Activity" />
<RadioGroup
android:id="@+id/RG_OS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:text="选择操作系统类型" >
<RadioButton
android:id="@+id/RG_OS_RB1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="安卓" />
<RadioButton
android:id="@+id/RG_OS_RB2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="塞班" />
<RadioButton
android:id="@+id/RG_OS_RB3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="其他" />
<Button
android:id="@+id/button_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交" />
RadioGroup>
LinearLayout>
Activity02.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="第二个 Avtivity" />
<Button
android:id="@+id/button_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回" />
LinearLayout>
然后创建两个 Activity
Activity01.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
public class Activity01 extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
RadioGroup RG_OS;
RadioButton RG_OS_RB1, RG_OS_RB2, RG_OS_RB3;
Button button_submit, button_back;
super.onCreate(savedInstanceState);
//根据布局文件activity1.xml生成界面
setContentView(R.layout.activity_activity01);
//根据XML定义生成取得 RadioGroup, RadioButton, Button 对象
RG_OS = (RadioGroup)findViewById(R.id.RG_OS);
RG_OS_RB1 = (RadioButton)findViewById(R.id.RG_OS_RB1);
RG_OS_RB2 = (RadioButton)findViewById(R.id.RG_OS_RB2);
RG_OS_RB3 = (RadioButton)findViewById(R.id.RG_OS_RB3);
button_submit = (Button)findViewById(R.id.button_submit);
//使用 setOnclickListener注册按钮单击事件监听器
button_submit.setOnClickListener((OnClickListener) new ButtonClickListener());
}
//定义按钮button_submit单击监听器, 当单击button_submit按钮时
//onClick方法被调用
class ButtonClickListener implements OnClickListener
{
public void onClick(View arg0)
{
//新建一个Intent对象
Intent myintent = new Intent();
//指定Intent对象的目标组件是Activity02
myintent.setClass(Activity01.this, Activity02.class);
//利用 startActivity()启动新的Activity,即Activity02
Activity01.this.startActivity(myintent);
//关闭当前的Activity
Activity01.this.finish();
}
}
}
Activity02.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Activity02 extends Activity
{
Button button_back;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//根据布局文件 avtivity02.xml 生成界面
setContentView(R.layout.activity_activity02);
button_back = (Button)findViewById(R.id.button_back);
button_back.setOnClickListener((OnClickListener)
new ButtonClickListener());
}
class ButtonClickListener implements OnClickListener
{
public void onClick(View arg0)
{
//新建一个Intent对象, 并指定启动应用程序Activity01
Intent myintent = new Intent();
myintent.setClass(Activity02.this, Activity01.class);
Activity02.this.startActivity(myintent);
Activity02.this.finish();
}
}
}
最后要在 AndroidMainifest.xml 中添加 Activity02
<activity android:name="com.dh.Activity02"
android:label="@string/app_name"/>
1, Intent 的 Action 属性中, 用来标识应用程序入口的是 ACTION_MAIN
2, Android 系统提供了终端用户用于开发应用程序交互功能的组件, 这些组件包括
- 广播接收器
- 意图
- 适配器
- 内容提供器
3, Context.startActivity( )
用于启动 Activity
4, Intent
由以下各个组成部分:
- component (组件):目的组件
- action(动作):用来表现意图的行动
- category(类别):用来表现动作的类别
- data(数据):表示与动作要操纵的数据
- type(数据类型):对于data范例的描写
- extras(扩展信息):扩展信息
- Flags(标志位):期望这个意图的运行模式
Android 使用 SQLite 作为存储数据库, SQLite 数据库是一种免费开源的且底层无关的数据库. 是基于 C 语言设计开发的开源数据库, 最大支持 2048G 数据, 具有如下特征:
- 轻量级
- 独立性
- 便于管理维护
- 可移植性
- 语言无关
- 事务性
1, 适合结构化数据存储的是 SQLite
2, Android 的四种数据存储机制为
1. Share Preferences
存储key-value paries格式的数据, 轻量级的存储机制, 类似于保存配置文件
2. Files
通过
FileInputStream
和FileOutputStream
对文件进行操作。基于linux的安卓,文件属于应用私有,所以不能共享3. Network
访问网络存储数据
4. SQlite
一个轻量级数据库,支持SQL语句