Activity界面跳转、数据传递和生命周期
Activity的创建和跳转
1 AndroidManifest清单文件详解
- Application节点的label标签表示,应用程序列表显示的应用名称
- Activity的label标签表示应用程序的桌面图标名称,他和Application的label标签不是一回事。
-
创建桌面图标:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
- 一个应用程序可以有多个桌面图表
- 常见的类别category android:name="android.intent.category.LAUNCHER" DEFAULT默认的,不写就是默认的 LAUNCHER启动器
2 隐式意图和显式意图(重点)
-
显示意图:开启目标Activity,直接指定目标Activity的字节码
编写步骤: // 1. 创建意图对象,指定要目标Activity的字节码 Intent intent = new Intent(this, SecondActivity.class); // 2. 开启Activity界面 startActivity(intent); 应用场景:打开同一个应用程序中的Activity界面 优点:效率高,速度快,代码书写简单
-
隐式意图:开启目标Activity,去清单文件匹配意图过滤器,如果匹配成功,打开目标Activity;如果匹配失败,就抛出异常,没有找个这个Activity
编写步骤: //初始化意图 Intent intent = new Intent(); //设置动作 intent.setAction("tian.wang.gai.di.hu"); //data可选 intent.setData(Uri.parse("suibian:hahah")); //不写类别,默认添加一个default类别 intent.addCategory("android.intent.category.DEFAULT"); //开启目标Activity startActivity(intent); 应用场景:打开其他应用程序的Activity界面 缺点:效率低,速度慢
3 意图设置动作激活一个新的界面
//初始化意图
Intent intent = new Intent();
//设置动作
intent.setAction("tian.wang.gai.di.hu");
//data可选
intent.setData(Uri.parse("suibian:hahah"));
//不写类别,默认添加一个default类别
intent.addCategory("android.intent.category.DEFAULT");
//开启目标Activity
startActivity(intent);
清单文件:
<activity
android:name="cn.itcast.secondactivity.SecondActivity"
android:label="@string/app_name" >
<intent-filter >
<action android:name="tian.wang.gai.di.hu"/>
<data android:scheme="suibian"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
4 设计意图的目的
- 目的:组件之间解耦,传递数据
- 耦合:两个类之间即相互联系,又相互独立
Activity跳转时传递数据
5 意图传递数据(重点)
- java中的八大基本数据类型及其数组
- Parcelable :把对象序列化到内存中
- Serializable :把对象序列化到硬盘上
- bundle :数据捆,类似于map
- intent :意图
6 URI介绍
<!-- http://www.baidu.com:80/img/logo.png -->
Uri的组成:
1. scheme :简单理解为约束 http ftp
2. host :主机或者域名
3. port :端口号
4. path :资源的路径
Activity销毁时传递数据
7 开启activity获取返回值(重点)
打开第二个Activity界面,等待第二个Activity关闭,返回数据
-
开启目标Activity
startActivityForResult(intent, 0);
-
返回数据
Intent intent = new Intent(); intent.putExtra("name", tvFeng.getText()); setResult(1, intent);
-
关闭目标Activity
finish();
-
重写onActivityResult,获取返回的数据
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); String name = data.getStringExtra("name"); etName.setText(name); }
8 请求码和结果码的作用(重点)
- 请求码:区分数据是从哪一个Activity界面返回的
- 返回码:判断传递过来的数据属于什么类型
Activity生命周期
9 activity的生命周期(重点)
人:被出生 --> 哭()--> 少年()--> 青年()--> 老年()--> 翘辫子()
恋爱:暗恋()--> 表白()--> 恋爱()--> 热恋()--> 失恋()
开启Activity调用的生命周期方法:onCreate()-->onStart()-->onResume()
关闭Activity调用的生命周期方法:onPause()-->onStop()-->onDestory()
最小化Activity调用生命周期方法:onPause()-->onStop()
最大化Activity调用生命周期方法:onRestart()-->onStart()-->onResume()
10 读文档查看activity的生命周期的分类
-
完整的生命周期entire lifetime:
onCreate()--> onRestart()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestory()
-
可视生命周期visible lifetime:
onStart()-->onResume()-->onPause()-->onStop()
-
前台生命周期:
onResume()-->onPause()
11 横竖屏切换activity的生命周期
先销毁Activity,然后在创建Activity
-
固定Activity的朝向
android:screenOrientation="landscape" portrait:竖向,默认的方式 landscape:横向 sensor:旋转屏幕
-
是Activity不敏感屏幕朝向的变化
android:configChanges="screenSize|keyboardHidden|orientation"
任务栈和Activity的启动模式
12 任务栈的概念
- 任务:做一件事情,开启的Activity界面
- 栈: 后进先出(吃进去吐出来) ,队列:先进先出(吃进去拉出来)
- 应用场景:维护已经打开的Activity界面,管理内存中的Activity实例对象
13 Activity的启动模式
1. 标准启动模式:standard
打开应用程序,系统给应用程序创建一个任务栈。开启目标Activity,把目标Activity压入任务栈,使其处于任务栈的栈顶。点击返回键,从任务栈的栈顶移除一个Activity。
应用场景:默认情况下的绝大多数
2. 单一顶部模式:singleTop
开启目标Activity,系统去任务栈的栈顶查找有没有目标Activity的实例,如果有就复用任务栈顶的Activity;如果任务栈的栈顶没有,就创建一个Activity实例对象,放在栈顶。
应用场景:系统的浏览器书签
3. 单一任务模式:singleTask
开启目标Activity,系统去整个任务栈查找有没有目标Activity实例对象,如果有,就清除目标Activity上面的所有Activity实例对象,使他位于任务栈的栈顶;如果没有,就创建一个Activity实例对象,加入到任务栈的栈顶。
应用场景:浏览器
4. 单一实例模式:singleInstance
开启目标Activity,系统给目标Activity单独创建一个任务栈。整个操作系统只有一个目标Activity的实例对象,并且他运行在一个单独的任务栈中
应用场景:电话拨号器的来电界面