Android 重点知识回顾
安卓复习
基础知识
1, 移动设备操作系统
iOS
Windows Phone
Android
2, 安卓平台的技术架构
Linux 内核层
中间层: 程序库, Android 运行时环境
应用程序框架
应用层: 应用程序
3, Activity 通常就是一个单独的屏幕
4, 简述 Android 的优势
1, 系统的开放性和免费性
2, 移动互联网的发展
3, 相关厂商的大力支持
Activity 的生命周期
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)
提示信息(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( ) 方法, 为视图注册上下文菜单
Intent 启动
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
<?xml version="1.0" encoding="utf-8"?><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
<?xml version="1.0" encoding="UTF-8"?><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(标志位):期望这个意图的运行模式
SQLite 数据库
SQLite 简介
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语句
更多相关文章
- 转:[Android]实现静默安装APK的两种方法
- [Android]去除程序中广告的好方法:告诉广告没有网络连接
- Android菜单操作之创建并响应菜单
- Android 中自定义控件和属性(attr.xml,declare-styleable,TypedA
- Android - 常见错误的解决方法
- Android 应用初始化及窗体事件的分发
- Android入门教程 AsyncTask的使用及execute和executeOnExecutor
- android菜单详解六:快捷键和菜单intent