前言
前面写过一篇关于 Activity 生命周期的文章,链接放这里:图解Activity的生命周期,我用一分钟就明白了但现在看来那篇文章是非常浅显的。这篇文章关于生命周期的解析,是我看《Android 开发艺术探索》的笔记,其中也有我自己的理解。文章从以下三个方面来写,希望大家看完后能有所收获。
- Activity 正常情况下的生命周期
- Activity 异常情况下的生命周期
- 关于 IntentFilter 的匹配规则
Activity 正常情况下的生命周期
先上一张 Google 给开发者的一张图,这是一张 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 日志如下:
从日志可以看出,这是我图中的第一条分支。
这一次,我的操作是这样的:运行程序,按 Home 或者切换到 查看任务状态 ,打印的Log日志如下:
显然,这次是第四条分支。
至于第二条分支和第五条分支,是在内存吃紧的情况下,Android 系统杀死了 Activity,这算是异常情况下的Activity的生命周期了,待会再讲。
还有一个情况值得注意,从一个Activity 启动另一个 Activity ,只有当前一个 Activity 调用 onPause() 方法后 第二个 Activity 才会创建。这就是再提醒我们不应该在 onPause() 方法中执行耗时的操作,否则会造成用户体验下降。
请看下面的Log,我点击了 MainActivity 中按钮,界面跳转到 MainActivity2,这里先调用了MainActivity 的 onPause() 方法,随后才调用了 MainActivity2 的 onCreate() 方法,等到 MainActivity2 可以与用户进行交互之后,才调用 MainActivity 的 onStop() 方法。
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,这里就不贴代码了。然后运行程序,通过操作,使得手机屏幕发生一次旋转,打印日志如下图所示:
这里简单分析一下代码,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