一、学习目标及要求
课程内容(必须讲的内容,就是讲课的知识点的顺序) * 掌握Activity 配置
* 掌握 Intent 显示意图
* 掌握 Intent 隐式意图
* 掌握两种意图的使用场景
* 掌握 activity 开启的数据传递
* 掌握activity的生命周期
* 掌握横竖屏切换的生命周期
* 掌握不同android版本 生命周期的细微差别
* 掌握开启activity获取返回值
* 掌握请求码 结果码的作用
* 掌握程序入口activity配置参数
* 掌握显示意图 显示意图开启新的activity
* 掌握隐式意图 隐式意图开启新的activity 隐式意图的intent filter
* 掌握两种意图的使用场景
* 掌握activity开启的数据传递
传递基本类型数据
传递对象数据
* 掌握activity的生命周期
* 掌握横竖屏切换的生命周期 生命周期的控制
* 掌握不同android版本 生命周期的细微差别
* 掌握开启activity获取返回值
案例: 选择联系人 短信群发器
* 掌握请求码 结果码的作用
区分请求的类型 区分返回的类型
二、学习要点
1.☆Activity参数配置
1.1 应用程序的入口activity需要配置两个参数
<!-- 程序的入口activity需要配置两个参数 -->
<intent-filter>
<!-- 当前activity是应用程序的入口 -->
<action android:name="android.intent.action.MAIN" />
<!-- 当前activity会在桌面应用创建一个快捷方式 -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
1.2 一个应用程序可以创建多个入口的activity,快捷图标
<!-- 只要配置了,就会在桌面上创建一个新的快捷图标 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
1.3 Activity 清单文件中的配置
属性 | 作用 | 说明 | 举例 |
action | activity对应的动作 | 可以用任意一个字符串描述(最好,顾名思义) | <action android:name="android.intent.action.MAIN" /> |
category | 额外的类别参数 | 指定工作的设备(车载电脑,机顶盒,默认的手机) | <category android:name="android.intent.category.CAR_DOCK"> |
data |
指定数据和数据的类型 |
scheme 数据前缀 host 主机名 port 端口号 path 路径 前面加上 / mimeType 数据类型 |
<data android:scheme="calc" /> |
1.4 Activity的重要作用
>应用程序之间的解耦。
不用应用程序的界面可以互相调用。
>应用程序开放的,不是封闭的。
2. ☆☆Intent 意图
2.1 Intent 显式意图
显式意图. 直接指定要激活的activity。效率高 直接指定。
//显式意图
//第一种写法
intent.setClassName(this, "com.itheima.rpcalc.SecondActivity");
startActivity(intent);
//第二种写法
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
2.2 Intent 隐式意图
动作,数据,category)开启新的activity。
主要应用场景:激活别的应用程序的activity。查询系统里面满足条件的activity,再把activity激活,效率较低,比较慢。
//隐式意图
intent.setAction("com.itheima.rpcalc.view");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("calc://张三"));
startActivity(intent);
2.3 两种意图的使用场景
如果激活的是应用程序内部的activity,推荐使用显示意图,直接指定包名类名。效率高。
如果激活的是其他应用程序的activity,推荐使用隐式意图,通过action和data指定。
3. ☆intent传递数据
3.1 大基本类型数据 以及数据的数组都是可以通过intnet传递
intent.putExtra(name,values)
3.2 intent传递对象
要求对象一定是实现Serializable接口的 可序列化的对象。
要求对象一定是实现Parcelable 接口
Javase序列化是把对象序列化文件里面。
Parcelable序列化到内存里面。
3.3 传递一组数据
Bundle extras = new Bundle();
intent.putExtras(extras);
4. ☆开启新的activity获取返回值
4.1 调用者activity开启新的界面的时候
startActivityForResult(intent, 0);
4.2 在新的开启的activity里面如果想设置返回值。
设置结果数据
setResult(0, data);
4.3 新开启的activity如果操作完毕,关闭
finish();
4.4 数据会返回给调用者(开启者)activity
onActivityResult(int requestCode, int resultCode, Intent data) {}
data 参数就是返回的结果数据 从里面把数据取出来 requestCode 请求码 区分请求来自于哪个按钮 resultCode 结果码 区分请求来自于哪个结果
5. ☆☆Activity生命周期
5.1 什么是生命周期
人的生命周期 幼儿园-->小学-->中学--->大学-->找工作-->结婚-->生小孩-->退休-->翘辫子
java代码. 对象的生命周期
activity生命周期 对象从new出来到被dailvik虚拟机回收的过程中执行的方法。
5.2 生命周期的重要方法
oncreate -->activity被创建的时候调用。 适合做界面的初始化操作。
onDestroy -->activity被销毁的时候调用。 适合做扫尾的操作。数据保存的操作。 短信内容的保存onstart --->activity界面用户可见。 适合更新界面。 继续播放视频
onresume -->获取焦点 按钮可以被点击
onstop --->activity界面用户不可见。 界面不可见适合清理操作。暂停视频。 视频播放器
onpause -->失去焦点 按钮可以看到,但是不可以被点击。 游戏使用
5.3 常见的生命周期
完整生命周期 oncreate-->onstart-->onresume-->onpause-->onstop-->ondestory
可视生命周期 onstart-->onresume-->onpause—>onstop
如果界面不可见 onstop方法,下一次界面重新可见,先调用onRestart(),再调用onstart();
前台生命周期 onresume-->onpause
5.4 横竖屏切换的生命周期
默认情况下 横竖屏切换 activity销毁 --> 重新创建
把屏幕朝向写死
android:screenOrientation="landscape" 横屏
android:screenOrientation="portrait" 竖屏
设置横竖屏切换不敏感
android:configChanges="orientation|keyboardHidden|screenSize"
6 进程、线程、应用程序、任务栈、启动模式
6.1 进程
android中进程
android系统 ,应用程序退出和进程退出是两个不同的概念。
android系统为了让应用程序可以被快速的开启。所有的应用程序退出后,进程是不会退出的。
只有系统的内存空间严重不足的时候,才会把进程给回收。
点击图标-->linux创建进程-->dalvik虚拟机-->读取清单文件,加载activity
android理解应用程序退出: 任务栈清空。
6.2 线程
进程是操作系统分配内存空间的单位,每个进程的内存空间都是独立的。
线程是运行在进程里面。线程cpu执行的最小单位。如果进程挂了,线程也挂了。
6.3 应用程序 application
android应用程序每个应用程序都是运行在自己的sandbox(沙箱)。
理解成一组activity,service,content priovder broadcastreceiver的组合。
6.4 任务栈的细节
每个应用程序运行,系统都会分配一个新的任务栈。
问题:问系统里面有多少个任务栈存在?
有多少个应用程序正在运行(activity没有都被销毁,回桌面),就有几个任务栈。
任务栈的id是一个int类型的整数,自增长的id。
6.5 启动模式
有四种启动模式
standard 标准的启动模式。一个activity默认就是标准的启动模式。开启新的activity,activity就会被创建出来,加入到任务栈的栈顶。适用于绝大多数的应用场景。
singleTop 单一顶部启动模式。如果发现,这个activity已经被启动了,并且在任务栈的栈顶,activity就不会别重新创建。
解决一个用户体验的问题。避免已经打开的界面重复的被打开多次。
for(int i = 0;i<100;i++){
弹出收藏夹
}
浏览器添加到书签,singletop
在同一个任务栈里面可以有多个实例存在。
singleTask 单一任务栈启动模式。 开启新的activity的时候,会去检查任务栈里面是否有这个activity的实例存在,如果有实例存在,就直接清空这个实例上面的所有的activity,复用这个已经存在的activity实例。
在同一个任务栈里面只有一个实例存在。
在什么时候使用singletask模式?
BrowserActivity 浏览器
开销(内存占用,cpu占用)非常大,singletask。保证在一个任务栈里面只有一个实例存在。
webkit 内核 页面。
html解析器
html渲染器
css 渲染器
javascript 执行引擎
如果一个activity的资源开销非常大,建议使用singletask的启动模式。
浏览器的activity使用的就是singletask的启动模式。
singleinstance 单一实例。类似于java中的单例模式,单态模式。在整个android手机操作系统里面只有一个activity的实例存在。
singleinstance启动模式的activity会运行在自己单独的任务栈里面。
>如果你希望一个activity,在整个手机操作系统里面只有一个实例存在。配置singleinstance。
>InCallScreen 通话的activity配置模式是singleinstance的。在整个手机操作系统里面只有他一个实例存在。
6. 重要示例