第四章:程序活动单元 Activity
Activity 的生命周期
生命周期状态
状态 | 特点 |
---|---|
启动状态 | 当 Activity 启动之后便会进入下一状态 |
运行状态 | Activity 处于屏幕最前端,可与用户进行交互 |
暂停状态 | Activity 仍然可见,但无法获取焦点,用户对他操作没有响应 |
停止状态 | Activity 完全不可见,系统内存不足时会销毁该 Activity |
销毁状态 | Activity 将被清理出内存 |
生命周期方法
- 第一次运行程序时调用的生命周期方法为:
onCreate()
->onStart()
->onResume()
- 退出程序时调用的生命周期方法为:
onPause()
->onStop()
->onDestory()
Activity 的创建配置和关闭
Intent
被称为意图,是程序中各组件进行交互的一种重要方式,他不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递- 一般用于启动
Activity
、Service
以及发送广播等。根据开启目标组件的方式不同,Intent
被分为两种类型显示意图和隐式意图
Intent 与 IntentFilter
显示意图
- 显式意图可以直接通过名称开启指定的目标组件
// 显示意图的使用方法实现页面的跳转
Intent intent = new Intent(myActivity.this, MainActivity.class);
// 执行意图
startActivity(intent);
startActivity(new Intent(MainActivity.this, myActivity.class));
隐式意图
- 隐式意图通过指定
action
和category
等属性,系统根据这些信息进行分析后寻找目标Activity
首先在 AndroidManifest.xml
中为跳转之后 Activity
设置如下的 intent-filter
<intent-filter>
<action android:name="hello.myActivity"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
其次在跳转页面的 .java
文件中输入如下代码:
// 隐式意图:根据 action 属性到清单文件中进行匹配,然后执行匹配上的对应 activity
Intent intent = new Intent("hello.myActivity");
startActivity(intent);
注意
在清单文件中为 Activity
添加 <intent-filter>
标签时,必须添加 action
属性,否则隐式 Intent
无法开启该 Activity
Activity 之间的跳转
数据传递
方式一:.put.Extra
方法
使用
.putExtra
方法Intent intent = new Intent(MainActivity.this, myrecyclerview.class) // intent 传递数据 intent.putExtra("userName", "jack123"); intent.putExtra("age", 23); intent.putExtra("gender", true); intent.putExtra("hobby", new String[]{"学习", "做饭", "看电影"}); startActivity(intent);
接收
intent
意图传递的数据// 接收 intent 意图对象 Intent intent = this.getIntent(); String name = intent.getStringExtra("UserName"); int age = intent.getIntExtra("age", -1); boolean gender = intent.getBooleanExtra("gender", false); String[] hobby = intent.getStringArrayExtra("hobby"); Toast.makeText(myrecyclerview.this, "用户名: " + name + "\n性别: " + gender + " 爱好: " + hobby[1], Toast.LENGTH_LONG).show();
方式二:Bundle
类
使用
Bundle
类Bundle bundle = new Bundle(); bundle.putString("userName", "jeny"); bundle.putInt("age", 23); bundle.putBoolean("gender", true); bundle.putStringArray("hobby", new String[]{"学习", "做饭", "看电影"}); intent.putExtras(bundle); startActivity(intent);
从
intent
意图对象中获取bundle
对象Intent intent = this.getIntent(); Bundle bundle = intent.getExtras(); String name = bundle.getString("userName"); int age = bundle.getInt("age", -1); boolean gender = bundle.getBoolean("gender", false); String[] hobby = bundle.getStringArray("hobby"); Toast.makeText(myrecyclerview.this, "用户名: " + name + "\n性别: " + gender + " 爱好: " + hobby[1], Toast.LENGTH_LONG).show();
注意
数据量多的情况下选择用 Bundle
类进行传值
数据回传
- 页面 2 将数据回传给上一个
Activity
页面 1
页面 1 代码
设置数据回传意图
// 数据回传按钮的意图 Intent intent1 = new Intent(MainActivity.this, myActivity.class); // 此时 intent1 就变为了寻求 result 的一个意图,同时这个意图的请求编码是 666 startActivityForResult(intent1, 666);
接收回传数据
@Override // requestCode 接收请求编码,resultCode 接收结果编码,data 接收回传的 intent 对象 // 此方法是在有回传数据产生时自动执行 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 666 && resultCode == 999){ String acquiredData= data.getStringExtra("userName"); //获取回传的数据 Toast.makeText(MainActivity.this, acquiredData, Toast.LENGTH_SHORT).show(); } }
页面 2 代码
// 数据回传
// 创建回传用的意图
Intent intent2 = new Intent();
intent2.putExtra("userName", "tom");
// 将 intent2 意图作为回传数据的载体,将它设置为 result,结果编码是 999
setResult(999, intent2);
// 关闭当前 activity,即关闭当前页面
finish();
Activity 的任务栈和启动模式
任务栈
概念:一种用来存放
Activity
实例的容器特点:“先进后出”
操作:压栈和出栈
启动模式
standard
模式:Activity
的默认启动方式,每启动一个Activity
就会在栈顶创建一个新的实例singleTop
模式:会判断要启动的Activity
实例是否位于栈顶,如果位于栈顶则直接复用,否则创建新的实例singleTask
模式:下每次启动该Activity
时,系统首先会检查栈中是否存在当前Activity
实例,如果存在则直接使用,并把当前Activity
之上的所有实例全部出栈singleInstance
模式:会启动一个新的任务栈来管理Activity
实例,无论从哪个任务栈中启动该Activity
,该实例在整个系统中只有一个
使用 Fragment
Fragment 概念
Fragment
(碎片)是一种可以嵌入在Activity
中的UI
片段,它可以描述Activity
中的一部分布局
Fragment 特点
Fragment
不能独立存在,必须嵌入到Activity
中使用,所以Fragment
生命周期直接受所在的Activity
影响。- 当在
Activity
中创建Fragment
时,Fragment
处于启动状态,当Activity
被暂停时,其中的所有Fragment
也被暂停,当Activity
被销毁时,所有在该Activity
中的Fragment
也被销毁。当一个Activity
处于运行状态时,可以单独地对每一个Fragment
进行操作,如添加或删除,当添加时,Fragment
处于启动状态。当删除时,Fragment
处于销毁状态
Fragment 生命周期
创建 Fragment
静态加载:
动态加载:
注意
推荐使用动态加载 Fragment