• 关于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
    参考

    天生我才必有用,千金散去还复来!
  • 相关阅读:
    laravel tymon/jwt-auth header 发送token
    laravel migrate时报错:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
    laravel 报错 class not exist
    HTTP 状态码详解大全 | HTTP Status Codes
    JS,jquery 无法获取到动态插入的元素
    关键字
    PHP 配置默认SSL CA证书
    phpunit 配置
    plantuml 手册
    Windows使用RunHiddenConsole一键启动nginx,php-cgi服务
  • 原文地址:https://www.cnblogs.com/Jack-Lu/p/4383883.html
Copyright © 2020-2023  润新知