Android-系统开发_四大组件篇----探讨-Activity-的生命周期

<?xml version="1.0" encoding="utf-8"?>




// Look here

image.gif

接下来修改 activity_main.xml,重新定制主活动的布局:

<?xml version="1.0" encoding="utf-8"?>

image.gif

修改 MainActivity :

package com.example.marco.activitylifecycletest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

public static final String TAG = “MainActivity”;
private Button startNormalActivity = null;
private Button startDialogActivity = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startNormalActivity = findViewById(R.id.start_normal_activity);
startDialogActivity = findViewById(R.id.start_dialog_activity);
startNormalActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NormalActivity.class);
startActivity(intent);
}
});
startDialogActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DialogActivity.class);
startActivity(intent);
}
});
}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG, “onStart”);
}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG, “onResume”);
}

@Override
protected void onPause() {
super.onPause();
Log.d(TAG, “onPause”);
}

@Override
protected void onStop() {
super.onStop();
Log.d(TAG, “onStop”);
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, “onDestroy”);
}

@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, “onRestart”);
}
}

image.gif

Result

(1)当 MainActivity 第一次被创建时,如下方法被执行:

2018-10-18 04:31:29.071 2526-2526/? D/MainActivity: onCreate
2018-10-18 04:31:29.077 2526-2526/? D/MainActivity: onStart
2018-10-18 04:31:29.083 2526-2526/? D/MainActivity: onResume

image.gif

(2)点击 Start NormalActivity 按钮:

2018-10-18 04:33:02.159 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onPause
2018-10-18 04:33:02.745 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onStop

image.gif

因为 NormalActivity 已经把 MainActivity 完全遮挡住,因此 onPause() 和 onStop() 方法都会得到执行。

(3)点击 Back 键返回 MainActivity:

2018-10-18 04:35:00.010 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onRestart
2018-10-18 04:35:00.012 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onStart
2018-10-18 04:35:00.014 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onResume

image.gif

由于之前 MainActivity 已经进入了停止状态,所以 onRestart() 方法会得到执行,之后又会执行 onStart() 和 onResume() 方法。注意,此时 onCreate() 方法不会执行,因为 MainActivity 并没有重新创建。

(4)点击 Start DialogActivity 按钮:

2018-10-18 04:43:38.006 3555-3555/com.example.marco.activitylifecycletest D/MainActivity: onPause

image.gif

通过 Log 可以看到,只有 onPause() 方法得到了执行,onStop() 方法并没有执行,这是因为 DialogActivity 并没有完全遮挡住 MainActivity,此时 MainActivity 只是进入了暂停状态,并没有进入停止状态。

(5)点击 Back 键返回 MainActivity:

2018-10-18 04:50:12.222 3555-3555/com.example.marco.activitylifecycletest D/MainActivity: onResume

image.gif

按下 Back 键返回 MainActivity 也应该只有 onResume() 方法会得到执行。

(6)在 MainActivity 界面按下 Back 键退出程序:

2018-10-18 04:51:47.673 3555-3555/com.example.marco.activitylifecycletest D/MainActivity: onPause
2018-10-18 04:51:48.013 3555-3555/com.example.marco.activitylifecycletest D/MainActivity: onStop
2018-10-18 04:51:48.015 3555-3555/com.example.marco.activitylifecycletest D/MainActivity: onDestroy

image.gif

依次会执行 onPause()、onStop() 和 onDestroy 方法,最终销毁 MainActivity。

疑问

我们在之前分析 Activity 的生命周期的时候曾经提到过:如果一个活动进入了 onStop (停止)状态,是有可能被系统回收的!

场景

比如我们看以下的场景:

应用中有一个活动 A ,用户在活动 A 的基础上启动了活动 B ,活动 A 就进入了停止的状态,这个时候由于系统内存不足,将活动 A 回收掉了,然后用户按下 Back 键返回活动 A ,会出现什么情况呢?

其实还是会正常显示活动 A 的,但是此时并不会执行 onRestart() 方法了,而是会执行活动 A 的 onCreate() 方法,因为活动 A 在这种情况下会被重新创建一次。

可能这并不会影响正常的功能,但是存在一个特殊情况:如果活动 A 中存在临时数据和状态(比如 A 中有一个文本输入框,我们输入了一些文字,然后启动了 B 活动,如果 A 被 kill了,在重新回到 A 后,A 活动重新创建,那么数据都丢失了),此时会严重影响用户体验,该怎么办?

策略

其实官方文档给出了解决方案,Activity 中提供了一个 onSaveInstanceState() 回调方法,这个方法可以保证在活动被回收之前一定会被调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。

onSaveInstanceState() 方法会携带一个 Bundle 类型的参数,Bundle 提供了一系列的方法用于保存数据,比如可以使用 putString() 方法保存字符串,使用 putInt() 方法保存整型数据,依次类推。

每个保存方法需要传入两个参数,第一个参数是键,用于后面从 Bundle 中取值,第二个参数是真正要保存的内容。

Code

我们现在对上面的代码进行修改,在 MainActivity 中添加如下代码将临时数据进行保存:

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = “Something you just typed”;
outState.putString(“data_key”, tempData);
}

image.gif

Ok,数据保存好了,那我们应该在哪边进行恢复?

不知道你有没有发现,在 onCreate() 方法中有一个 Bundle 类型的参数。这个参数一般情况下是 null ,但是如果在活动被系统回收之前有通过 onSaveInstanceState() 方法来保存数据的话,这个参数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。

修改 MainActivity 的 onCreate() 方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, “onCreate”);

if (savedInstanceState != null) {
String tempData = savedInstanceState.getString(“data_key”);
Log.d(TAG, tempData);
}
… …
}

image.gif

通过上面的方法取出值之后再做相应的恢复操作就可以了,比如说将文本内容重新赋值到文本输入框上即可。

附加资料:

Android进阶

image

移动架构师
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

提升自己去挑战一下BAT面试难关吧

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值