Activity的生命周期
onCreate
-
onStart
Activity正在被啟動(dòng) 此時(shí)Activity可見(jiàn)但還沒(méi)有出現(xiàn)在前臺(tái)不可和用戶交互
-
onResume
Actvity可見(jiàn)且出現(xiàn)在前臺(tái)可以和用戶交互
-
onPause
變?yōu)椴豢梢?jiàn) 因?yàn)樗菀妆挥|姚建,所以可以在此生命周期方法中保存數(shù)據(jù)诡宗,但是不宜做耗時(shí)操作,因?yàn)橹挥邢葓?zhí)行完舊Actvity的onPause后 新Actvity才會(huì)啟動(dòng)
onStop
onRestart
onDestory
幾種場(chǎng)景下的生命周期
-
ActivityA第一次啟動(dòng)執(zhí)行的生命周期方法:
onCrteate --> onStart --> onResume
-
打開(kāi)新的ActivityB或切換到桌面執(zhí)行的生命周期方法:
A.onPause --> B.onCreate --> B.onStart --> B.onRersume --> A.onStop
這里有幾個(gè)點(diǎn)需要注意下:
- 如果B是透明主題调违,那么A.onStop就不會(huì)被調(diào)用
- 如果B是對(duì)話框,那么A.stop也不會(huì)被調(diào)用
- 如果A 添加了
<item name="android:windowIsTranslucent">true</item>
主題屬性叉弦,那么A.stope也不會(huì)被調(diào)用 - 鎖定屏與解鎖屏幕 有點(diǎn)只會(huì)調(diào)用 onPause 有的會(huì)調(diào)用onPause和onStop茴扁;那么當(dāng)開(kāi)屏后的生命周期對(duì)應(yīng)的分別是 onResume 或者onStart-->onResume
Activity異常終止時(shí)系統(tǒng)會(huì)調(diào)用onSaveInstanceState和onRestoreInstanceState來(lái)存儲(chǔ)和恢復(fù)數(shù)據(jù)
-
橫豎屏切換時(shí)候activity的生命周期
- 不設(shè)置Activity的
android:configChanges
時(shí)凫岖,切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次返咱,切豎屏?xí)r會(huì)執(zhí)行兩次 - 設(shè)置Activity的
android:configChanges="orientation"
時(shí)氮帐,切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫洛姑、豎屏?xí)r只會(huì)執(zhí)行一次 - 設(shè)置Activity的
android:configChanges="orientation|keyboardHidden"
時(shí)上沐,切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
- 不設(shè)置Activity的
其他一些相關(guān)方法
startActivity startActivityForResult onActivityResult setResult
onSaveInstanceState / onRestoreInstanceState
-
onNewIntent
當(dāng)前通過(guò)Intent方式啟動(dòng)的Activity是復(fù)用之前已經(jīng)存在的實(shí)例時(shí)楞艾,此時(shí)都會(huì)執(zhí)行到onNewIntent参咙,onNewIntent調(diào)用后,將繼續(xù)回調(diào)onRestart硫眯,onResume.
-
onBackPressed
重寫按下Back鍵的回調(diào)函數(shù)onBackPressed蕴侧,轉(zhuǎn)成Home鍵的效果,這樣可以使應(yīng)用回到桌面两入,下次打開(kāi)無(wú)需重新create
@Override public void onBackPressed() { Intent home = new Intent(Intent.ACTION_MAIN); home.addCategory(Intent.CATEGORY_HOME); startActivity(home); }
-
moveTaskToBack(true)
直接將當(dāng)前Activity所在的Task移到后臺(tái)净宵,同時(shí)保留activity順序和狀態(tài)
7、Activity被回收數(shù)據(jù)保存和恢復(fù)代碼
public class AllAppActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//判斷是否有以前的保存狀態(tài)信息
if(savedInstanceState!=null){
savedInstanceState.get("key");
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
//可能被回收內(nèi)存前保存狀態(tài)和信息,
Bundle data = new Bundle();
data.putString("key", "value");
outState.putAll(data);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
//判斷是否有以前的保存狀態(tài)信息
if(savedInstanceState!=null){
savedInstanceState.get("key");
}
super.onRestoreInstanceState(savedInstanceState);
}
}
8择葡、如果Activity A的啟動(dòng)模式是SingleTask紧武,跳轉(zhuǎn)到Activity B 且返回值傳給A ,要怎么處理敏储?
- Activity A使用了SingleTask模式在執(zhí)行界面跳轉(zhuǎn)的時(shí)候阻星,多次啟動(dòng)此Activity都不會(huì)被重新創(chuàng)建,所以可能不會(huì)接收到傳過(guò)來(lái)的Bundle里面的值已添,這樣就導(dǎo)致傳統(tǒng)的方法是接受不到返回值的妥箕。
- singleTask模式下,系統(tǒng)會(huì)回調(diào)onNewIntent()方法更舞,在這個(gè)方法中可以調(diào)用 setIntent(intent); 這樣就可以拿到Activity B跳到Activity A使用的Intent畦幢,從而拿到返回?cái)?shù)據(jù)
8、你知道onNewIntent嗎缆蝉?
如果IntentActivity處于任務(wù)棧的頂端呛讲,也就是說(shuō)之前打開(kāi)過(guò)的Activity,現(xiàn)在處于onPause返奉、onStop 狀態(tài)的話贝搁,其他應(yīng)用再發(fā)送Intent的話,執(zhí)行順序?yàn)椋?onNewIntent芽偏,onRestart雷逆,onStart,onResume污尉。