学习笔记| (一) 组件篇之Activity

  • 前言:
    前几天 探探 面试中遇到了一个面试题,两个Activity A和B,A跳转至B后他们分别走了哪些方法,A的哪个方法在前,B的哪个方法在后。

一.Activity生命周期:

Activity生命周期.png

分析:

  • onCreate():Activity创建的会回调,在里面加载布局,初始化参数,注册广播等;
  • onStart():activity正在启动,这时Activity可见,但是还没有在前台(我们还看不到它),不能和用户进行交互;
  • onResume():这时Activity可见,在前台展示,可以与用户进行交互;
  • onPause():正在停止,准备启动另一个Activity或者是按home键回到主页会回调这个方法,接下来立马会走onStop();
  • onStop():activity即将停止
  • onDestroy():activity即将销毁,在这里可以释放资源,回收资源;
  • onRestart():从另一个activity又回到当前activity,activity从不可见到可见会调用这个方法;

这7个生命周期方法中都不能做耗时任务;

面试问题:
  • onStart()和onResume都表示Activity可见,他们有什么区别?
    onStart()表示activity在后台,还不能和用户进行交互;
    onResume()表示activity在前台展示,可以和用户进行交互了;

  • onStart(),onResume和onPause(),onStop他们的含义相近,为什么不选任意一组?比如选取onStart()和onStop()就行了?

onStart()和onStop()是从是否可见的角度来说的;
onResume()今儿onPause()是从是否在前台的角度来说的;

二.正常情况下activity的生命周期流程图:

  • activty创建:
onCreate()--->onStart()--->onResume()
  • activity准备启动另一个activity或者是按home键回到主页
onPause()-->onStop()
  • activity启动另一个弹出样式的activity
onPause()  因为这时候activity还可以看到一部分,onStop是在activity由可见到不可见的时候才会回调
  • activity按back键退出
onPause()-->onStop()--->onDestroy()
  • A启动B(A没有finish),B点击back键回到A


    A启动B.jpg
  • A启动B(A没有finish),B点击按钮回到A


    B点击按钮回到A.jpg
  • A启动B(A finish),B点击back键回直接退回到桌面


    A跳转B(A finish).jpg
  • A启动后,锁屏了,又开屏


    A锁屏后开屏.jpg
总结:
  • A启动B,就好比是“一份工作需要我们俩一起完成,我的工作做完了,后面的需要你来做”,那我就需要先停下我手里的活(onPause),然后去告诉你你要做什么,给你说清楚,看到你开始做之后,我才可以回家休息(onStop)。

  • 为什么A启动B后,A没有走onDestroy,而B回到A的时候,B走了onDestroy()?
    这里用到了栈,A启动B后,A并没有finish,这时候启动了B,B入栈了,这时候A就在B的下面。
    由于栈是后进先出,B重新启动A的时候,B就要出栈,就会调用onDestroy。

三.异常情况下activity的生命周期:

  1. 系统配置发生变化导致activity杀死后重建:
-->onSaveInstanceState()-->onStop-->onDestroy()
onSaveInstanceState()可能在onPause()之前或者之后执行
  • 比如屏幕旋转时会发生上面的情况
  • 测试:
    在activity中添加android:screenOrientation="sensor" ,这样只有当前activity可旋转屏幕,手机是不会旋转的,打印activity的生命周期
  • 如何保持数据:
    ①在这种情况下,activity的onSaveInstanceState和onRestoreInstanceState是会自动保存并恢复数据的,但是有一个地方要特别注意,比如要EditText在屏幕旋转后仍然保存数据,则必须给这个控件设置id,否则旋转屏幕后,EditText会为空。

②在onSaveInstanceState()中保存数据,只有在这个activity即将销毁并会再次展示的时候才会调用这个方法

protected void onSaveInstanceState(Bundle outState)
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)

outState.putString("key","value");

这两个都可以用于保存数据,要使用下面的这种形式,必须要在activity中添加android:persistableMode="persistAcrossReboots",这两种onSaveInstanceState同时存在时,会执行onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)

③在onRestoreInstanceState()中恢复数据

 String value = savedInstanceState.getString("key");

④也可以在onCreate中获取保存的值

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState != null){
            String value = savedInstanceState.getString("key");
        }
    }

2.由于内存不够导致activity被回收,回收的顺序是后台-->可见(被弹窗样式的activity挡住)-->前台

3.1和2中分析了activity异常情况下的生命周期,那怎么才能让activity不重新创建呢?
在activity中添加:

android:configChanges="orientation"

其他值:
orientation:屏幕方法发生变化
screenSize:屏幕尺寸发生变化(加了orientation就一定要加它,中间用|),minSdkVersion和targetSdkVersion大于13才起作用
locale:系统语言发生变化

测试:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
      //1是横屏,2是竖屏
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 【Android Activity】 什么是 Activity? 四大组件之一,通常一个用户交互界面对应一个 ac...
    Rtia阅读 3,950评论 3 18
  • 转载注明出处:http://www.jianshu.com/p/c2c2ee4eb48a 1. 简介 本篇不针对于...
    王三的猫阿德阅读 2,778评论 2 5
  • Android 的活动是可以包含用户界面的组件,主要用于与用户进行交互。 1 手动创建活动 手动创建活动可以加深对...
    deniro阅读 3,814评论 0 10
  • 恐惧是因为缺乏爱 为了让我处于恐惧 爱 我的源头 必须缺席 由于我的源头 从来没有在任何 时间 地点 状态 或情况...
    梦影3阅读 469评论 0 2
  • 2018.6.11 星期一,晴 放学回来,女儿正在写作业,我准备做饭吃,刚好中午还有一些菜没吃,热一下就可...
    赵楷轩妈妈阅读 185评论 0 0

友情链接更多精彩内容