saveHierarchyState问题

来源:互联网 发布:人事管理数据流程图 编辑:程序博客网 时间:2024/04/25 15:42

http://blog.csdn.net/desiringm/article/details/7607338

大家都知道,android系统的资源ID的分配是在编译完成之后就确定了的,而资源的搜索是根据包进行搜索的,这就说明不同包下的资源ID是有可能相同的。那么,小插件View的ID就有可能与小插件的宿主(一般是Launcher)中的某个View的ID相同。如果真是这样,那么错误就有可能发生了。
Activity中有两个对称的函数onSaveInstanceState和onRestoreInstanceState,这两个函数的主要作用是在Activity被无故Kill掉的时候保存Activity所处Window下的所有View的状态和Activity被重新启动后,利用已经保存的状态,还原所有View。我们来看看源码:
首先看看Activity中的onSaveInstanceState过程。
1、Activity的onSaveInstanceState函数


2、PhoneWindow的saveHierarchyState函数


3、ViewGroup的saveHierarchyState函数(由于ViewGroup继承自View,但是没有实现View中的saveHierarchyState函数,所以ViewGroup中的saveHierarchyState函数体是View中saveHierarchyState函数体)


4、ViewGroup中的dispatchSaveInstaceState函数


5、View中的dispatchSaveInstaceState函数


6、View中的onSaveInstanceState函数


至此Activity的onSaveInstanceState就已经完成,下面看看Activity 的onRestoreInstanceState的过程。
1、Activity中的onRestoreInstanceState函数


2、PhoneWindow中的restoreHierarchyState函数


3、ViewGroup中的restoreHierarchyState函数(由于ViewGroup继承自View,但是没有实现View中的restoreHierarchyState函数,所以ViewGroup中的restoreHierarchyState函数体是View中restoreHierarchyState函数体)


4、ViewGroup中的dispatchRestoreInstanceState函数


5、View中的dispatchRestoreInstanceState函数


6、View中的onRestoreInstanceState函数


至此Activity中的onRestoreInstanceState已经完成。
从上面的源码中,我们可以看出,如果在同一个View的层级下有多个View的mID(mID是View的layout中的android:id所分配的值)相同,那么最后调用到View的onRestoreInstanceState的时候就会抛出一个IllegalArgumentException。
上面说过,不同包中的View的layout中的android:id所分配的值是有可能相同的,而对于小插件来说,小插件的View在编译的时候是在小插件包中的,但是小插件最终被使用显示在用户面前,是处在宿主的View层级中,所以就有可能出错了。
避免这种错误的一个方法就是不要在小插件的layout中使用android:id属性。



0 0
原创粉丝点击