第四章:程序活动单元 Activity

木婉清2023/11/26

Activity 的生命周期

生命周期状态

状态特点
启动状态Activity 启动之后便会进入下一状态
运行状态Activity 处于屏幕最前端,可与用户进行交互
暂停状态Activity 仍然可见,但无法获取焦点,用户对他操作没有响应
停止状态Activity 完全不可见,系统内存不足时会销毁该 Activity
销毁状态Activity 将被清理出内存

生命周期方法

  • 第一次运行程序时调用的生命周期方法为:onCreate() -> onStart() -> onResume()
  • 退出程序时调用的生命周期方法为:onPause() -> onStop() -> onDestory()

image-20231126190824151

Activity 的创建配置和关闭

  • Intent 被称为意图,是程序中各组件进行交互的一种重要方式,他不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递
  • 一般用于启动 ActivityService 以及发送广播等。根据开启目标组件的方式不同,Intent 被分为两种类型显示意图和隐式意图

Intent 与 IntentFilter

显示意图

  • 显式意图可以直接通过名称开启指定的目标组件
// 显示意图的使用方法实现页面的跳转
Intent intent = new Intent(myActivity.this, MainActivity.class);
// 执行意图
startActivity(intent);
startActivity(new Intent(MainActivity.this, myActivity.class));

隐式意图

  • 隐式意图通过指定 actioncategory 等属性,系统根据这些信息进行分析后寻找目标 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 方法

  1. 使用 .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);
    
  2. 接收 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

  1. 使用 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);
    
  2. 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 实例的容器

  • 特点:“先进后出”

  • 操作:压栈和出栈

启动模式

  1. standard 模式:Activity 的默认启动方式,每启动一个 Activity 就会在栈顶创建一个新的实例
  2. singleTop 模式:会判断要启动的 Activity 实例是否位于栈顶,如果位于栈顶则直接复用,否则创建新的实例
  3. singleTask 模式:下每次启动该 Activity 时,系统首先会检查栈中是否存在当前 Activity 实例,如果存在则直接使用,并把当前 Activity 之上的所有实例全部出栈
  4. 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 生命周期

image-20231126220001922

创建 Fragment

静态加载:

image-20231127094618413

动态加载:

image-20231127094635154

注意

推荐使用动态加载 Fragment

编辑于 2023/11/27 10:27:35