这是我参与「第四届青训营」笔记创作的第 2 天
此篇笔记是 Android 基础中 Activity 的第二部分 —— Activity 启停活动页面
本篇笔记分为 3 部分
- Activity 的启动
- Activity 的结束
- Activity 的生命周期
一、Avtivity 活动
Activity 的启动
如何启动并跳转到下一个活动?
我们通过 startActivity 方法可以从当前页面跳到新页面,具体格式如 startActivity(new Intent(源页面.this, 目标页面.class)); 之后利用按钮的点击事件去触发页面的跳转,譬如以下代码便在重写后的点击方法onClick中执行页面跳转动作。
java
// 活动类直接实现点击监听器的接口View.OnClickListener
public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_start);
// setOnClickListener来自于View,故而允许直接给View对象注册点击监听器
findViewById(R.id.btn_act_next).setOnClickListener(this);
}
@Override
public void onClick(View v) { // 点击事件的处理方法
if (v.getId() == R.id.btn_act_next) {
// 从当前页面跳到指定的新页面
//startActivity(new Intent(ActStartActivity.this, ActFinishActivity.class));
startActivity(new Intent(this, ActFinishActivity.class));
}
}
}
以上代码中的 startActivity 方法,清楚标明了从当前页面跳到新的 ActFinishActivity 页面。之所以给新页面取名 ActFinishActivity,是为了在新页面中演示如何关闭页面。
Activity 的结束
如何结束并返回上一个活动?
众所周知,若要从当前页面回到上一个页面,点击屏幕底部的返回键即可实现,但不是所有场景都使用返回键。比如页面左上角的箭头图标经常代表着返回动作,况且有时页面上会出现“完成”按钮,无论点击箭头图标还是点击完成按钮,都要求马上回到上一个页面。
既然点击某个图标或者点击某个按钮均可能触发返回动作,就需要 App 支持在某个事件发生时主动返回上一页。回到上一个页面其实相当于关闭当前页面,因为最开始由 A 页面跳到 B 页面,一旦关闭了 B 页面, App 应该展示哪个页面呢?当然是展示跳转之前的A页面了。在 Java 代码中,调用 finish 方法即可关闭当前页面,前述场景要求点击箭头图标或完成按钮都返回上一页面,则需给箭头图标和完成按钮分别 注册点击监听器,然后在 onClick 方法中调用 finish 方法。
public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_finish);
// 给箭头图标注册点击监听器,ImageView由View类派生而来
findViewById(R.id.iv_back).setOnClickListener(this);
// 给完成按钮注册点击监听器,Button也由View类派生而来
findViewById(R.id.btn_finish).setOnClickListener(this);
}
@Override
public void onClick(View v) {
// 判断点击的是否是返回和完成按钮
if (v.getId() == R.id.iv_back || v.getId() == R.id.btn_finish) {
// 结束当前活动页面
finish();
}
}
}
另外,所谓“打开页面”或“关闭页面”沿用了浏览网页的叫法,对于 App 而言,页面的真实名称是“活动”— Activity 。打开某个页面其实是启动某个活动,所以有 startActivity 方法却无 openActivity 方法;关闭某个 页面其实是结束某个活动,所以有 finish 方法却无 close 方法。
Activity 的生命周期
如何理解生命周期的概念?
App 引入活动的概念而非传统的页面概念,这是有原因的,单从字面意思理解,页面更像是静态的,而 活动更像是动态的。犹如花开花落那般,活动也有从含苞待放到盛开再到凋零的生命过程。每次创建新的活动页面,自动生成的 Java 代码都给出了 onCreate 方法,该方法用于执行活动创建的相关操作,包括 加载 XML 布局、设置文本视图的初始文字、注册按钮控件的点击监听,等等。onCreate方法所代表的创建动作,正是一个活动最开始的行为,除了 onCreate ,活动还有其他几种生命周期行为,它们对应的方法说明如下:
- onCreate :创建活动。此时会把页面布局加载进内存,进入了初始状态。
- onStart :开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。
- onResume :恢复活动。此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等。
- onPause:暂停活动。此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交互。
- onStop :停止活动。此时活动页面将不在屏幕上显示。
- onDestroy :销毁活动。此时回收活动占用的系统资源,把页面从内存中清除掉。
- onRestart :重启活动。处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建 过程,而是走onRestart的重启过程。
- onNewIntent :重用已有的活动实例。上述的生命周期方法,涉及复杂的App运行状态,更直观的活动状态切换过程如下图所示
graph LR
A([不存在]) -- onCreate --> B([初始状态])
B([初始状态]) -- onDestroy --> A([不存在])
B([初始状态]) -- onStart --> C([就绪状态])
C([就绪状态]) -- onPause --> B([初始状态])
C([就绪状态]) -- onResume --> D([活跃状态])
D([活跃状态]) -- onPause --> C([就绪状态])