zoukankan      html  css  js  c++  java
  • Activity组件的生命周期

    一.Activiy组件的三个状态:

    1.前台状态(active) : 在屏幕的最上层,页面获得焦点,可以响应用户的操作
    2.可视状态(paused) : 不能与用户交互,但是还存在于可视区域内,它依然存在内存中,保存着所持有的数据
    3.后台状态(stoped) : 已经不在可视区域内,完全被其他Actiivy覆盖,它依然存在内存中,保存着所持有的数据

    当Activity处于可视状态(paused)和后台状态(stoped)时,当系统内存不足时候,会被系统销毁其内存,其中保留的数据全部释放清空,只保留一个基本记录在
    导航栈中,当再次回到此Activity时,系统会重新从onCreate事件重新运行一遍,以便创建(或者回复)必要的数据


    二.Activity7个回调事件
    onCreate
    onStart
    onRestart
    onResume
    onPause
    onStop
    onDestroy

    三.3个生命周期循环
    完整生命周期:onCreate -> onDestroy
    可视生命周期:onStart -> onStop
    前台生命周期:onResume -> onPause

    四.基于生命周期的数据管理
    当系统内存不足时,处于【可回收状态】(可视状态和后台状态)下的Activity会被系统回收,其中的数据全部清空,所以基于Activity的生命周期
    管理数据,保证数据安全是非常重要的

    当系统主动回收Activity所占的内存时,不会照常回调Activity的生命周期事件。
    即onStop,onDestroy事件不会被执行

    所以为了保证数据安全,需要在onPause时进行数据的保存

    protected void onPause()
    {
        writeData(data);
    }


    五.基于生命周期的状态管理
    每一个用户控件都有属于自己的状态,比如EditText的Text就是最典型的一个,妥善管理控件状态信息,能够提高用户体验

    当程序以外中断(电话呼入),onSaveInstanceState事件会被触发,在此事件中可以保存Activity的一些状态信息,事件提供Bundle,以键值对的形式保存状态
    这里的Bundle实例不会持久化保存,只是缓存,如果杀掉程序,则无法再被恢复

    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        Log.d("test","onSaveInstanceState");
    }

    与之对应的是

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onRestoreInstanceState(savedInstanceState);
        Log.d("test", "onRestoreInstanceState");
    }

    需要注意的是这个两个事件何时回被触发.

    onSaveInstanceState事件触发时机:
    当activity非用户意愿(比如电话呼入而非Back或finish)被置为可视状态(pause)时候,将会在onPause事件之后调用onSaveInstanceState事件

    onRestoreInstanceState事件触发时机:
    非用户意愿使得Activity变为可视状态或者后台状态后,又让Activity回到前台状态,是不会触发onRestoreInstanceState事件的,只有
    当前Activity真正被系统销毁了,才会发出onRestoreInstanceState事件
    将会在onCreate之后触发onRestoreInstanceState事件

    六.如何判断一个Activity是新创建的还是被系统回收后再次创建?
    1.检测onCreate事件的savedInstanceState字段是否为空

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(savedInstanceState!=null) // 被系统回收,再次创建
        {
            status = savedInstanceState.getInt(statusStr);
            Log.d("test", "status:" + status);
        }
        else // 首次创建
        {
    
        }
    }        

    2.判断onRestoreInstanceState事件是否被触发

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onRestoreInstanceState(savedInstanceState);
        // 此activity被系统回收,再次创建
    }

    七.页面跳转与外部事件对Activity生命周期的影响

    导航到新Activity ,按下Home按钮 ,关闭手机屏幕,都会依次触发: onPause -> onSaveInstanceState -> onStop

    当按下Back按钮回退时候,主动执行finish()时候,会依次触发:     onPause -> onSaveInstanceState -> onStop -> onDestroy

    
    
  • 相关阅读:
    提高Java程序性能的技巧
    HBASE学习d端口master:16010(java操作hbase)https://www.cnblogs.com/junrong624/p/7323483.html
    log4j.properties加入内容
    zookeeper学习及安装
    flume学习以及ganglia(若是要监控hive日志,hive存放在/tmp/hadoop/hive.log里,只要运行过hive就会有)
    Hadoop各个启动流
    crontab基本操作部分
    pig(数据流语言和编译器)学习https://www.w3cschool.cn/apache_pig/apache_pig_execution.html
    pig配置
    hive(在大数据集合上的类SQL查询和表)学习
  • 原文地址:https://www.cnblogs.com/hellenism/p/3766035.html
Copyright © 2011-2022 走看看