Android进阶 笔记1

   日期:2020-11-10     浏览:95    评论:0    
核心提示:Activity的生命周期全面分析(一)目录一、典型情况下生命周期分析1.七种典型2.问题思考二、异常情况下的生命周期分析1.资源相关的系统配置发生改变导致Activity被杀死并重新创建(1).保存状态(2).恢复状态2.资源内存不足导致低优先级的Activity被杀死3.不想让Activity在屏幕旋转的时候重新创建一、典型情况下生命周期分析1.七种典型onCreate:表示活动正在被创建,常常在里面做一下初始化工作onDestroy:表示活动即将被销毁,可以在里面做一下回收工作onSta

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

《Android开发与探索》

目录

    • Activity的生命周期全面分析(一)
  • 一、典型情况下生命周期分析
    • 1.七种典型
    • 2.问题思考
  • 二、异常情况下的生命周期分析
    • 1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
      • (1).保存状态
      • (2).恢复状态
    • 2.资源内存不足导致低优先级的Activity被杀死
    • 3.不想让Activity在屏幕旋转的时候重新创建

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

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"
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服