commit和commitAllowingStateLoss区别
是否检测宿主activity
是否调用过onSaveInstanceState()
-
commit
会去检测
如果onSaveInstanceState()
已经被调用,这时会抛出一个异常.
Can not perform this action after onSaveInstanceState");
-
commitAllowingStateLoss
则会忽略检测
那么为什么在commit
的过程中需要检测onSaveInstanceState()
的状态呢?
因为在onSaveInstanceState()
之后commit
的事务不会被系统所保存.这可能就会导致一些ui或者数据的偏差
Activity状态的保存和恢复
activity分正常销毁(返回键或者Home键)和非正常销毁(内存不足被回收)
非正常销毁的情况下,系统默认会保存Activity视图层次的状态信息,包括视图对象中的数据,比如(EditText中的输入值,或者listView当前滚动的位置),
-
保存的方式通过
Bundle
对象, -
保存的函数在
onSaveInstanceState()
下 (因此可以重载这个方法来保存更多的数据)@Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(key,value); super.onSaveInstanceState(outState); }
-
当Activity状态需要恢复时,会回调
onCreate()
(重建或者恢复),或者onRestoreInstanceState()
(只会在恢复时被回调),两者都会接受一个Bundle参数,其中保存着需要的数据.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
或者在 onStart()
之后调用 onRestoreInstanceState()
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
查看当前Activity
是否调用过onSaveInstanceState()
可以通过 isStateSaved()
方法来判断
注意:isStateSaved()
从support-26.0.0开始,并且只在Fragment
以及FragmentManager
中提供了
另外当Activity
调用过onSaveInstanceState()
之后,诸如Fragment
的事务或者Intent
的跳转之类的操作都是不被允许的。
Fragment调用setRetainInstance的原理
http和https的区别
- http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
- https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。
判断fragment是否可见 setUserVisibleHint和onHiddenChanged使用场景
网友评论