Android进阶 笔记1

Activity的生命周期全面分析(一)

《Android开发与探索》


一、典型情况下生命周期分析

1.七种典型

onCreate:表示活动正在被创建,常常在里面做一下初始化工作
onDestroy:表示活动即将被销毁,可以在里面做一下回收工作

onStart:表示活动正在被启动,即将开始,在后台了
onStop:表示活动即将停止,可以做一些轻的回收工作

onResume:表示活动已经可见了,在前台了
onPause:表示活动正在停止,正常情况下,后面紧跟onStop操作

onRestart:活动正在重写启动,一般下,当前活动从不可见重新变为可见时,就调用


onCreate和onDestroy配对,标识创建和销毁,并且只可能有一次调用
onStart和onStop配对,表示设备的后台操作
onResume和onPause配对,表示设备的前台操作


2.问题思考

Q1:onStart和onResume、onPause和onStop从描述上来看起来差不多,对我们来说有什么实质的不同呢?

onStart和onStop是从可见的角度去回调的
onResume和onPause是从是否位于前台的角度去回调的

Q2:假设当前Activity为A,如果这时用户打开一个新Activity B,那么B的onResume和A的onPause那个先执行?

结论:旧的Activity先onPause,然后新的Activity在启动
A------------onPause
B------------onCreate
B------------onStart
B------------onResume
A------------onStop
所以要求尽量在onStop里面去做逻辑

二、异常情况下的生命周期分析

1.资源相关的系统配置发生改变导致Activity被杀死并重新创建

例如:活动处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了变化,在默认情况下,活动就会被销毁并且重新创建,当然也可以阻止重新创建。我们按照默认的情况去分析。
在这里插入图片描述

异常情况下终止,Activity会去调用onSaveInstanceState来保存当前活动的状态,然后进行重写创建;重新创建的时候会调用onRestoreInstanceState和onCreate方法去恢复部分数据。

保存和恢复的流程:活动调用onSaveInstanceState去保存数据,然后Activity去委托window,window去委托它上面的顶级容器viewgroup/dectorview去保存,最后顶层容器再一一通知它的子元素去保存数据。

(1).保存状态

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String t = savedInstanceState.getString("restore_data");
        Log.d("MainActivity", "onRestore------" + t);
    }

(2).恢复状态

接受的位置可以选择onCreate或者onRestoreInstanceState.
两者的区别是onRestoreInstanceState一旦被调用,里面的bundle是有值的,不用去判空。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState != null) {
            String t = savedInstanceState.getString("restore_data");
            Log.d("MainActivity", "onCreate------" + t);
        }
    }

而onCreate必须要进行额外判断

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String t = savedInstanceState.getString("restore_data");
        Log.d("MainActivity", "onRestore------" + t);
    }

更详细的可见转向这个链接的文章:
https://www.jianshu.com/p/27181e2e32d2

2.资源内存不足导致低优先级的Activity被杀死

先描述一个Activity的优先级:

前台活动(正在和用户交互)—高>>>>可见非前台活动(被一个对话框挡住的Activity)—中 >>>>>后台活动----低

如果一个进程中没有四大组件在执行,那么很快就会被杀死,所以我们要将后台工作放在service中

3.不想让Activity在屏幕旋转的时候重新创建

android::configChanges="orientation"
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值