zoukankan      html  css  js  c++  java
  • 关于onsaveinstancestate和 onRestoreInstanceState()

    之所以有这个话题,是因为工作遇到过两个问题。
    一个问题是页面空白,fragment重复创建。
    另一个问题是登录页用到了AutoCompleteTextView,调用showDropDown()方法导致crash。

    1. onSaveInstanceState() 和 onRestoreInstanceState()并不配对

    2.触发时机

    onSaveInstanceState()
    (1)、当用户按下HOME键时。
    (2)、长按HOME键,选择运行其他的程序时。 
    (3)、按下电源按键(关闭屏幕显示)时。
    (4)、从activity A中启动一个新的activity时。
    (5)、屏幕方向切换时,例如从竖屏切换到横屏时。

    onRestoreInstanceState()
    onRestoreInstanceState()被调用的前提是,activity A“确实”被系统销毁了。

    3.默认实现

    android应用框架中定义的几乎所有UI控件都恰当的实现了onSaveInstanceState()方法,因此当activity被摧毁和重建时, 这些UI控件会自动保存和恢复状态数据。

    比如EditText控件会自动保存和恢复输入的数据,而CheckBox控件会自动保存和恢复选中状态

    开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可), 剩余的事情就可以自动完成了.如果没有为控件指定ID, 则这个控件就不会进行自动的数据保存和恢复操作。

    4.如何测试

     android:screenOrientation="portrait"
    

    去掉,支持转屏。然后就一定会触发onSaveInstanceState()和onRestoreInstanceState()。

    5.实践说明

    1.空白页问题,
    oncreate时创建了一个新的fragment。
    然后onRestoreInstanceState()时,把旧的fragment重新加载了进来。
    解决办法:
    onSaveInstanceState()时。把fragment存到fragmentmanager里。
    在oncreate时,判断下savedInstanceState是否为空。如果不为空,说明会调用onRestoreInstanceState(),直接拿旧的fragment即可,为空的话才创建新的。
    具体代码请参考天天WiFi的项目。MainActivity?.java
    2.AutoCompleteTextView导致crash的问题。
    原因很简单。在onRestoreInstanceState()时,会调用AutoCompleteTextView的setText()方法,然后调用showDropDown()时crash。
    因为这个时候activity还没有attach到window上去。
    解决办法:
    增加条件判断。如果此时activity还没有attach到window上去,则return.
    具体代码参考天天WiFi项目。UserLoginActivity?.java
    参考

    天生我才必有用,千金散去还复来!
  • 相关阅读:
    写给大家看的设计书(第3版)
    C#总结2012
    python 网络编程学习 1
    深入 聚集索引与非聚集索引(一)
    深研TCP/IP详解卷1开篇
    在实际项目中如何应用门面模式(Facade)
    MVC系列_权限管理之权限控制
    gae上部署了一个定时往手机发送天气预报的小python程序
    ASP.NET开发工具整理第二季
    python 实现文件的递归拷贝
  • 原文地址:https://www.cnblogs.com/Jack-Lu/p/4383883.html
Copyright © 2011-2022 走看看