两种销毁。第一种是正常销毁,比如用户按下返回键或者activity自己调用finish()方法;另一个是因为活动处于停止状态。而且已经很久没有使用了,或者前台的activity需要更多的资源。在这些情况下,系统将关闭后台进程以恢复一些内存。需要注意的是,其中一种情况是屏幕旋转的问题。当用户旋转手机屏幕时,每次都会销毁并重新建立Activity。在第二种情况下,虽然实际的活动实例已经被销毁,但系统仍然记得它的存在。当用户返回它时,系统将创建一个新实例来替换它。这里我们需要使用旧实例进行销毁。销毁时保存的数据。这些数据称为“实例状态”,它是存储在Bundle对象中的键值对的集合。默认情况下,系统会保存每一个View对象(比如EditText对象中的文本,ListView中滚动条的位置等),也就是说,如果activity实例被销毁重建,那么你不需要编码,布局状态会恢复到之前的状态。但是如果你的activity需要恢复更多的信息,比如成员变量信息,就需要自己写了。onSaveInstanceState()如果要存储额外的数据,必须重写回调函数onSaveInstanceState()。当用户离开Activity并传递一个Bundle对象时,系统将调用此函数。如果稍后系统需要重建活动实例,它会将同一个Bundle对象传递给onRestoreInstanceState()和onCreate()方法。当系统停止活动时,它会调用onSaveInstanceState()(流程1)。如果Activity被销毁,但需要创建相同的实例,系统会将进程1中的状态数据传递给onCreate()和onRestoreInstanceState()(图2和3中标记的)。存储Activity状态当系统停止Activity时,系统会调用onSaveInstanceState(),状态信息会以键值对的形式存储。默认实现存储活动视图系列的状态,例如文本和滚动条位置。要存储额外的信息,您必须自己实现onSaveInstanceState(),并将键值对添加到Bundle对象中。staticfinalStringSTATE_SCORE="playerScore";staticfinalStringSTATE_LEVEL="playerLevel";...@OverridepublicvoidonSaveInstanceState(BundlesavedInstanceState){//保存用户的当前游戏状态savedInstanceState.putInt(STATE_SCORE,mCurrentScore);savedInstanceState.putInt(STATE_LEVEL,mCurrentLevel);//总是调用超类视图(state_level,mCurrentLevel));}记得调用基类的实现实现默认实现。恢复Activity状态重建Activity时,需要根据Bundle中的状态信息数据恢复Activity。onCreate()和onRestoreInstanceState()回调函数都会收到这个Bundle。因为每次新建activity实例或者重建实例都会调用onCreate()方法,所以必须先检查Bundle是否为null。如果为null,则意味着您要创建一个全新的对象,而不是重建以前的对象。被销毁的对象。比如onCreate()方法可以这样写:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//Alwayscallthesuperclassfirst//Checkwhetherwe'rerecreatingapreviouslydestroyedinstanceif(savedInstanceState!=null){//RestorevalueofmembersfromsavedstateemCurrentScore=savedInstanceState.Level_Score=savedInstanceState.savedInstanceState.getInt(STATE_LEVEL);}else{//Probablyinitializememberswithdefaultvaluesforanewinstance}...}除了在onCreate()中恢复状态,也可以选择在onRestoreInstanceState()中实现,在onStart()之后调用。onRestoreInstanceState()只有在有数据要恢复的时候才会调用,所以不需要检查Bundle是否为null。publicvoidonRestoreInstanceState(BundlesavedInstanceState){//Alwayscallthesuperclasssoitcanrestoretheviewhierarchysuper.onRestoreInstanceState(savedInstanceState);//RestorestatemembersfromsavedinstancemCurrentScore=savedInstanceState.getInt(STATE_SCORE);mCurrentLevel=savedInstanceState.getInt(STATE_LEVEL);}此处也要注意,不要忘记调用基类实现。Originallink:http://www.w2bc.com/Article/4848
