Activity 生命周期全解析

Activity 生命周期全解析前面写过一篇关于 Activity 生命周期的文章,链接放这里:图解Activity的生命周期,我用一分钟就明白了但现在看来那篇文章是非常浅显的。这篇文章关于生命周期的解析,是我看《Android 开发艺术探索》的笔记,其中也有我自己的理解。文章从以下三个方面来写,希望大家看完…

前言

前面写过一篇关于 Activity 生命周期的文章,链接放这里:图解Activity的生命周期,我用一分钟就明白了但现在看来那篇文章是非常浅显的。这篇文章关于生命周期的解析,是我看《Android 开发艺术探索》的笔记,其中也有我自己的理解。文章从以下三个方面来写,希望大家看完后能有所收获。

  • Activity 正常情况下的生命周期
  • Activity 异常情况下的生命周期
  • 关于 IntentFilter 的匹配规则

Activity 正常情况下的生命周期

先上一张 Google 给开发者的一张图,这是一张 Activity 的正常情况下的生命周期流程图。

Activity 生命周期全解析

Activity 的生命周期方法是成对出现的,onCreate() 和 onDestory(), onStart() 和 onStop(),onResume() 和 onPause()。可以从图中看到,Activity 从创建到 销毁可以有五条不同的分支。Activity 调用 onStart() 方法后就变得对用户可见了,但此时 Activity 还运行在后台,无法与用户进行交互,打开手机的设置就可以当此时正在运行的进程。

下面看demo,代码很简单,这里只有两个Activity,分别是 MainActivity 和 MainActivity2,这两个Activity的代码差不多,下面就只贴一个:

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "MainActivity create...");
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MainActivity2.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "MainActivity start...");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "MainActivity Resume...");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "MainActivity pause...");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "MainActivity stop...");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "MainActivity destroy...");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "MainActivity restart...");
    }

}

运行程序,然后再按 back 键返回到桌面,打印的 Log 日志如下:

Activity 生命周期全解析

从日志可以看出,这是我图中的第一条分支。

这一次,我的操作是这样的:运行程序,按 Home 或者切换到 查看任务状态 ,打印的Log日志如下:

Activity 生命周期全解析

显然,这次是第四条分支。

至于第二条分支和第五条分支,是在内存吃紧的情况下,Android 系统杀死了 Activity,这算是异常情况下的Activity的生命周期了,待会再讲。

还有一个情况值得注意,从一个Activity 启动另一个 Activity ,只有当前一个 Activity 调用 onPause() 方法后 第二个 Activity 才会创建。这就是再提醒我们不应该在 onPause() 方法中执行耗时的操作,否则会造成用户体验下降。

请看下面的Log,我点击了 MainActivity 中按钮,界面跳转到 MainActivity2,这里先调用了MainActivity 的 onPause() 方法,随后才调用了 MainActivity2 的 onCreate() 方法,等到 MainActivity2 可以与用户进行交互之后,才调用 MainActivity 的 onStop() 方法。

Activity 生命周期全解析

Activity 异常情况下的生命周期

接下来看异常情况下的生命周期,异常情况下的生命周期可以分为以下两种不同的情况:

  • 系统资源配置发生改变(一般指手机发生横竖屏切换)。
  • 内存不足导致低优先级的Activity被杀死。

我在MainActivity中加了两个方法,代码如下:

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG,"onSaveInstanceState...");
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG,"onRestoreInstanceState...");
    }

在 activity_main.xml 中把按钮替换成 EditText,这里就不贴代码了。然后运行程序,通过操作,使得手机屏幕发生一次旋转,打印日志如下图所示:

Activity 生命周期全解析

这里简单分析一下代码,onSaveInstanceState()onRestoreInstanceState() 是在Activity发生异常情况下才会调用的方法。可以看到,当手机屏幕发生旋转之后,Activity 就会重建。onSaveInstanceState() 是在Activity 调用 onStop() 方法之后 onDestroy() 之前 发生了调用。该方法保存Activity 销毁之前的状态,等到该Activity 再一次创建的时候,就又会调用 onRestoreInstanceState() 来恢复 Activity 销毁之前的状态。

比如,我在文本框中输入了一些内容,旋转屏幕之后发现 Activity 销毁之前的文本框的内容并没有发生改变,这就是这两个方法的作用。

关于内存不足,低优先级的 Activity 被杀死之后,再次进入Activity也是调用这两个方法保存数据,原理都是一样的。

关于 IntentFilter 的匹配规则

一、action 的匹配规则

action 可以理解为一个组件具备功能、可以进行什么操作。系统为我们提供了很多内置的 action,当然也可以自定义。一个 Intent-filter 中可以有多个 action,Intent 中的 action 至少与一个过滤器进行匹配。

二、category 的匹配规则

category 即分类,和 action 一样,一个过滤器可以包含多个分类。 和 action 匹配规则(有一个匹配即可)不同的是,category 匹配时,要求你的 Intent 中的 category 必须和过滤器中声明的完全匹配。

二、data 的匹配规则

data 表示该组件可以支持的数据格式与类型。

一个data由两部分组成:

  • mineType
  • scheme

mimeType 指的是支持的数据类型与格式,常见的有:

  • text/plain
  • image/jpeg
  • video/*
  • audio/*

今天的文章Activity 生命周期全解析分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/19052.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注