1.LeetCode10
遞歸的基本要義:要有嚴(yán)格遞歸出口,通常情況下是if(特殊情況)return;if(各種情況)return ,else return
注:階乘的遞歸寫法,要加溢出判斷!
int jiecheng(int n)
{
int result;
if(n==0)
return 1;
if(n>0)
{
result=n*jiecheng(n-1);;
if(result>0&&result<=INT_MAX)
{
return result;
}
else{
return 0;
}
}
}
2.《Android開發(fā)藝術(shù)探索》第1章
- onStart()和onResume()對比
onStart和onResume都表示Activity已經(jīng)可見,但onStart時(shí)候Activity在后臺,onResume時(shí)候Activity在前臺 - onPause()必須先執(zhí)行完,新Activity的onResume才會(huì)執(zhí)行(為什么不是onStop執(zhí)行完再執(zhí)行?)
答:onStop表示Activity退居后臺,但有些新Activity執(zhí)行不需要舊Activity退出前臺 - 如果打開新的Activity使用的是透明主題,則當(dāng)前Activity不會(huì)回調(diào)onStop
- 當(dāng)Activity被系統(tǒng)回收后再次打開,生命周期方法的回調(diào)過程從開始一樣,但不是所有過程都一樣??
- 不能在onPause中做重量級的操作,因?yàn)楸仨歰nPause執(zhí)行完成以后新的Activity才能Resume
- Activity被異常結(jié)束的兩種情況:“資源相關(guān)的配置文件發(fā)生改變”以及“系統(tǒng)內(nèi)存不足”
- 只有在Activity被異常結(jié)束的情況下,onSaveInstanceState才會(huì)執(zhí)行,且在onStop之前調(diào)用,他和onPause沒有既定的時(shí)序關(guān)系
- onRestoreInstanceState在新啟動(dòng)Activity的onStart之后執(zhí)行(為什么不再onCreat之前執(zhí)行?)
答:因?yàn)橹亟ㄔ瑼ctivity,初始化工作相同,且系統(tǒng)通過判斷onRestoreInstanceState和onCreate來判斷Activity是否應(yīng)該重建 - 系統(tǒng)異常退出后,如何人工恢復(fù)一些數(shù)據(jù)?(是用onCreat方法還是onRestoreInstanceState?)
答:理論上都可以,但官方推薦onRestoreInstanceState。因?yàn)槿绻鹢nRestoreInstanceState一旦被調(diào)用,代表Bundle里值不為null,不用做非空性判斷。而onCreat需要判斷 - minSdkVersion和targetSdkVersion的區(qū)別
答:minSdkVersion在編譯期間和運(yùn)行期間都起作用。在編譯期間:低于minSdkVersion的API不能使用,在運(yùn)行期間:低于minSdkVersion的手機(jī)不能安裝應(yīng)用
targetSdkVersion在運(yùn)行期間作用,表示APP測試運(yùn)行的Version。決定程序是否以兼容模式運(yùn)行(版本低的手機(jī)將自動(dòng)使用兼容包來實(shí)現(xiàn)一些效果),targetSdkVersion如果太低,程序運(yùn)行在高版本手機(jī)上則可能出錯(cuò)(違背向下兼容原理),所以一般取最新版本 - 每個(gè)Activity都有自己的任務(wù)棧,Activity A啟動(dòng)B,則B就加入A的任務(wù)棧中
- 一個(gè)Activity啟動(dòng)時(shí)需要指定自己的任務(wù)棧和啟動(dòng)方式,如果任務(wù)棧不存在,則需要先創(chuàng)建任務(wù)棧,再把活動(dòng)放入棧中
- 給Activity設(shè)定啟動(dòng)模式有兩種方法:1.在AndroidMenifest中指定(但無法設(shè)定FLAG_ACTIVITY_CLEAR_TOP) 2.在Intent中設(shè)置標(biāo)志位(優(yōu)先級更高但不能設(shè)定singleInstance模式)
- 隱式調(diào)用Intent(只有一個(gè)Intent同時(shí)匹配action,category和data才算匹配成功)
- 為Intent設(shè)定data,必須調(diào)用setDataAndType方法,不能先setData再setType,根據(jù)源碼,兩個(gè)方法會(huì)彼此消除對方的值
- 對于Service,盡量使用顯示調(diào)用方式啟動(dòng)服務(wù)
- 隱式啟動(dòng)Activity可以先判斷是否有符合條件的Intent。方法有兩種:1.PackageManager的resolveActivity方法 2.Intent的resolveActivity方法
問題:
- onStop-->onRestart 數(shù)據(jù)如何恢復(fù)??
答:這時(shí)候上一個(gè)Activity并沒有被銷毀,onCreate過程依然存在,所以直接onStart重啟即可 - singleTop和singleTak的onNewIntent方法是如何回調(diào)的??
答:當(dāng)其他Activity啟動(dòng)singleTop或singleTak的Activity時(shí),不會(huì)調(diào)用Activity的onCreate方法,而會(huì)調(diào)用onNewIntent方法,此時(shí)要重新setIntent,才能用getIntent獲取到
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent); //必須重新設(shè)置Intent才能被getIntent方法獲取到
processExtraData()
}
系統(tǒng)可能會(huì)隨時(shí)殺掉后臺運(yùn)行的Activity,如果這一切發(fā)生,那么系統(tǒng)就會(huì)調(diào)用onCreate方法,而不調(diào)用onNewIntent方法,一個(gè)好的解決方法就是在onCreate和onNewIntent方法中調(diào)用同一個(gè)處理數(shù)據(jù)的方法,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
processExtraData();
}
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//必須重新設(shè)置Intent才能被getIntent方法獲取到
processExtraData()
}
private void processExtraData(){
Intent intent = getIntent();
//使用Intent獲取的數(shù)據(jù)進(jìn)行相應(yīng)操作
}
- singleInstance中的A如果啟動(dòng)B,B會(huì)不會(huì)啟動(dòng)??
答:會(huì)啟動(dòng),這時(shí)候B會(huì)在ActivityMain的任務(wù)棧中入棧