美文网首页安卓安卓面试程序员
学习笔记| (一) 组件篇之Activity

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

作者: yanerly | 来源:发表于2018-09-11 22:03 被阅读28次
  • 前言:
    前几天 探探 面试中遇到了一个面试题,两个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是竖屏
    }

相关文章

网友评论

本文标题:学习笔记| (一) 组件篇之Activity

本文链接:https://www.haomeiwen.com/subject/jglpgftx.html