情況一:資源相關(guān)的西涌配置發(fā)生改變導致 Activity 被殺死并重新創(chuàng)建
例如:系統(tǒng)橫豎屏切換時竟稳,默認情況下,activity 不做特殊處理裹粤,就會被銷毀并重新創(chuàng)建邑贴。
當activity在異常情況下終止,系統(tǒng)會調(diào)用 onSaveInstanceState 來保存當前的狀態(tài)铃在,這個方法的調(diào)用時機是在onStop之前阵具。并且該方法只會在異常終止情況下被調(diào)用。當Activity被重新創(chuàng)建后定铜,系統(tǒng)會調(diào)用onRestoreInstanceState阳液,并且把Activity銷毀時所報存的Bundle對象作為參數(shù)傳遞給onRestoreInstanceState 和onCreate方法。從時序上來講揣炕,onRestoreInstanceState 的調(diào)用時機在onStart之后帘皿。
代碼示例:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState !=null){
String state = savedInstanceState.getString("extra_state");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("extra_state", "state");
}
@TargetApi(21)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState,
PersistableBundle persistentState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState, persistentState);
String state = savedInstanceState.getString("extra_state");
}
如果系統(tǒng)配置發(fā)生改變時,不想系統(tǒng)重新創(chuàng)建Activity可以給Activity指定configChanges屬性畸陡。
android:configChanges = "orientation"
如果指定的minSdkVersion 和 targetSdkVersion有一個大于13鹰溜,除了orientation屬性虽填,還要加上screenSize。
android:configChanges = "orientation| screenSize"
這時系統(tǒng)將不會調(diào)用onSaveInstanceState 和 onRestoreInstanceState來存儲和恢復數(shù)據(jù)奉狈,而是調(diào)用了 onConfigurationChanged方法卤唉。
情況二:資源內(nèi)存不足發(fā)生導致低優(yōu)先級的 Activity 被殺死
Activity優(yōu)先級從高到低,可以分如下三種:
(1)前臺Activity -- 正在與用戶交互的Activity仁期,優(yōu)先級最高桑驱。
(2)可見但是非前臺Activity --比如 Activity 中彈出了一個對話框,導致Activity可見但是位于后臺無法直接和用戶交互跛蛋。
(3)后臺Activity -- 已經(jīng)被暫停的Activity 熬的,比如執(zhí)行了onStop,優(yōu)先級最低赊级。
當系統(tǒng)內(nèi)存不足時押框,系統(tǒng)就會按照上述優(yōu)先級去殺死目標Activity所在進程,并在后續(xù)通過onSaveInstanceState 和 onRestoreInstanceState來存儲和恢復數(shù)據(jù)理逊。