Android基礎(chǔ)部分填坑

五種布局

Android中的五種布局分別為 FrameLayout 、 LinearLayout 想际、 AbsoluteLayout 划栓、 RelativeLayout 、 TableLayout 全都繼承自ViewGroup损姜。在整體繪制效率沒(méi)有絕對(duì)的最小饰剥,最好結(jié)合ui進(jìn)行調(diào)整開(kāi)發(fā)。從代碼的上看摧阅,個(gè)人感覺(jué)繪制效率是:
FrameLayout>RelativeLayout>LinearLayout>TableLayout>AbsoluteLayout汰蓉。


Activity生命周期
  • 啟動(dòng)Activity: onCreate()->onStart()->onResume()
    其中需要注意的是真正的visble的時(shí)間節(jié)點(diǎn)并不是以上三個(gè)生命周期方法而是onWindowFocusChanged()方法,這個(gè)方法在界面visble時(shí)調(diào)用棒卷,很多App在做閃屏頁(yè)動(dòng)畫(huà)會(huì)在這里調(diào)用方法執(zhí)行顾孽,當(dāng)然也可以在這里調(diào)用getHeight()或getWidth方法獲取高度及控件寬度祝钢。(hint: 這里的onWindowFocusChanged()會(huì)在執(zhí)行生命周期時(shí)多次調(diào)用,使用時(shí)需要注意調(diào)用次數(shù)問(wèn)題)
  • 其他狀態(tài):
    1.當(dāng)Activity從前臺(tái)切換到后臺(tái)時(shí):onPause()->onStop;
    2.當(dāng)Activity從后臺(tái)切換到前臺(tái)時(shí):onRestart()->onStart()->onResume;
    3.當(dāng)Activity在后臺(tái)運(yùn)行時(shí)若厚,由于內(nèi)存不足被殺死后拦英,由于在棧內(nèi)存中依舊存有Activity的引用,所以會(huì)重新創(chuàng)建Activity并啟動(dòng)Activity测秸;
    4.鎖屏onPause()->onStop();
    5.解鎖onStart()->onResume(); (hint:沒(méi)有重走onRestart())

Acitvity的啟動(dòng)模式設(shè)置(即通過(guò)xml的標(biāo)簽來(lái)改變?nèi)蝿?wù)棧的默認(rèn)行為)

我們都知道棧的數(shù)據(jù)結(jié)構(gòu)是FILO即先進(jìn)后出疤估,所以Android中Activity中的任務(wù)棧的默認(rèn)行為也是如此,但是我們可以通過(guò)修改其啟動(dòng)時(shí)模式來(lái)進(jìn)行修改他的規(guī)則來(lái)適應(yīng)我們的需求霎冯。

  • standard:標(biāo)準(zhǔn)模式铃拇,就是默認(rèn)的模式無(wú)需設(shè)置即為此模式,走onCreate()->onStart()->onResume() 沈撞;
  • singleTop:棧頂復(fù)用模式慷荔,這個(gè)模式指當(dāng)已經(jīng)設(shè)置了singleTop的Activity在棧頂了,那么我們新啟動(dòng)這個(gè)Activity時(shí)关串,不會(huì)重走創(chuàng)建這個(gè)Activity的生命周期方法拧廊,而是重新調(diào)用原Activity進(jìn)行啟動(dòng),且執(zhí)行onNewIntent()方法晋修,如果這個(gè)Activity不再棧頂那么他的就和standard模式一樣吧碾;
  • singTask:棧內(nèi)復(fù)用模式,在這個(gè)模式下的Activity墓卦,當(dāng)啟動(dòng)他的時(shí)候會(huì)清空任務(wù)棧倦春,并執(zhí)行onNewIntent()方法,保持singTask模式下的Activity在棧頂落剪;
  • singInstance:簡(jiǎn)單的說(shuō)是新建一個(gè)任務(wù)棧來(lái)存放新的被singTask修飾的Activity與之前的不在同一個(gè)任務(wù)棧中睁本,所以在這個(gè)任務(wù)棧中,所有的創(chuàng)建該Activity的請(qǐng)求皆無(wú)法創(chuàng)建新的Activity忠怖,除非該任務(wù)棧銷毀(加強(qiáng)版singTask模式)呢堰;

在這四種啟動(dòng)模式中,有很多時(shí)候沒(méi)法完全適應(yīng)需求凡泣,或者多個(gè)Activity的啟動(dòng)模式有所沖突枉疼,所以有時(shí)候可以封裝Activity的啟動(dòng)方法,在代碼中設(shè)置啟動(dòng)模式(hint:代碼設(shè)置中沒(méi)有singTask模式的設(shè)置鞋拟,可以使用intent的flag設(shè)置:

    intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    


Activity數(shù)據(jù)恢復(fù)方案

當(dāng)一個(gè)不在棧頂?shù)腁ctivity長(zhǎng)時(shí)間沒(méi)有重新回到棧頂骂维,那么可能就會(huì)被系統(tǒng)回收,當(dāng)我們需要他重新回到棧頂時(shí)贺纲,執(zhí)行的就不是onRestart()方法而是onCreate()方法了航闺,這時(shí)候我們需要進(jìn)行數(shù)據(jù)的恢復(fù)使用onSaveInstanceState()這個(gè)方法進(jìn)行恢復(fù),這個(gè)方法可以存放Bundle,可以在onCreate恢復(fù)數(shù)據(jù)潦刃。
需要注意的是每個(gè)Activity的銷毀不一定都會(huì)執(zhí)行onSaveInstanceState方法侮措,但是onSaveInstanceState的調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity福铅,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用萝毛,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)滑黔。另外笆包,需要注意的幾點(diǎn):

  1. 每個(gè)View都默認(rèn)實(shí)現(xiàn)了onSaveInstanceState()方法,用來(lái)恢復(fù)View的狀態(tài)略荡,但是我們需要給View一個(gè)唯一的ID庵佣,如果沒(méi)有唯一的ID是沒(méi)有辦法存儲(chǔ)他的狀態(tài)的;
  2. 我們?cè)谥貙?xiě)View的onSaveInstanceState()時(shí)需要執(zhí)行父類View的onSaveInstanceState()方法在執(zhí)行我們的自定義方法汛兜,一般很少去重寫(xiě)這個(gè)方法巴粪,但是在某些特定需求時(shí)也需要去進(jìn)行重寫(xiě);
  3. 這個(gè)方法中不要試圖去存儲(chǔ)永久性數(shù)據(jù)粥谬,因?yàn)槟悴⒉恢浪麍?zhí)不執(zhí)行肛根,同時(shí)他的執(zhí)行時(shí)間點(diǎn)可能在onPause之前也可能在onPause之后,但是肯定在onStop之前漏策;

Fragment的生命周期

Fragment的生命周期只提出注意事項(xiàng)派哲,在執(zhí)行Activity的onCreate()方法時(shí),F(xiàn)ragment執(zhí)行了onAttach()->onCreate()->onCreateView()->onViewCreated方法掺喻,當(dāng)Activity的onCreate方法執(zhí)行完成后回調(diào)執(zhí)行了Fragment的onActivityCreated()方法芭届,后面就是與Activity對(duì)應(yīng)的生命周期方法了。


Service的兩種啟動(dòng)方法感耙,有什么區(qū)別

1.在Context中通過(guò)public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法來(lái)進(jìn)行Service與Context的關(guān)聯(lián)并啟動(dòng)褂乍,并且Service的生命周期依附于Context,如果與Context關(guān)聯(lián)的對(duì)象被銷毀了,那么這個(gè)Service也會(huì)被銷毀即硼。

2.通過(guò)public ComponentName startService(Intent service)方法去啟動(dòng)一個(gè)Service逃片,此時(shí)Service的生命周期與啟動(dòng)它的Context無(wú)關(guān)。

在這里我們需要注意的事只酥,一般后臺(tái)下載等創(chuàng)建子線程的任務(wù)都需要使用非綁定的Service褥实,因?yàn)樵揝erive可以一直存在,所以可以獲取線程的引用层皱,可以隨時(shí)進(jìn)行暫停,開(kāi)始赠潦,終止等操作叫胖。


如何服務(wù)如何常駐后臺(tái)

我們不做流氓軟件,這里不做討論她奥。


動(dòng)畫(huà)

動(dòng)畫(huà)主要是Api的調(diào)用及每個(gè)動(dòng)畫(huà)的回調(diào)進(jìn)行連續(xù)的動(dòng)畫(huà)實(shí)現(xiàn)瓮增,有tween動(dòng)畫(huà)怎棱,frame動(dòng)畫(huà)及PropertyAnimation動(dòng)畫(huà)。其中需要注意的事绷跑,動(dòng)畫(huà)執(zhí)行的速率問(wèn)題拳恋,即interpolator屬性,有默認(rèn)的實(shí)現(xiàn)調(diào)用即可砸捏,也可以自定義執(zhí)行速率谬运,這里不做詳細(xì)論述。


Android的數(shù)據(jù)存儲(chǔ)形式

Android存儲(chǔ)方式有5種垦藏,針對(duì)每一種說(shuō)說(shuō)注意事項(xiàng):

  1. SQLite:SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)梆暖,支持基本的SQL語(yǔ)法,Android中有SQLiteDatabase的類掂骏,封裝了一些操作數(shù)據(jù)庫(kù)的api轰驳。同時(shí)市面上也有很多SQLite的框架,ORMLite弟灼、GreenDao等级解,當(dāng)然也可以自行封裝數(shù)據(jù)庫(kù)框架。在ORMLite和GreenDao中田绑,ORMLite是基于ORM的映射實(shí)現(xiàn)的所以效率較低勤哗,但功能完善,易用性強(qiáng)辛馆。相對(duì)的GreenDao引入文件小俺陋,效率高,但是缺點(diǎn)也很明顯昙篙,功能不完善腊状,易用性差。個(gè)人推薦還是使用ORMLite苔可,GreenDao坑太多缴挖,或者自己封裝也是不錯(cuò)的選擇。
  2. SharedPreference:這個(gè)常常用來(lái)做一些標(biāo)記性的存儲(chǔ)或者簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)焚辅,諸如登錄狀態(tài)映屋,用戶號(hào)碼等,沒(méi)什么需要注意的點(diǎn)同蜻。
  3. File:即I/O存儲(chǔ)方式棚点,這里可以存儲(chǔ)大數(shù)據(jù)量文件。注意點(diǎn)是需要注意垃圾文件的清理湾蔓。諸如拍照后或者直接選取上傳經(jīng)過(guò)壓縮的圖片后產(chǎn)生的垃圾文件瘫析,需要清理掉(畢竟用戶不需要)徊哑,當(dāng)然數(shù)據(jù)更新也是難點(diǎn)熙兔;
  4. ContentProvider:內(nèi)容提供者但壮,Android四大組件之一浦译,很多人寫(xiě)的數(shù)據(jù)庫(kù)框架是通過(guò)ContentProvider來(lái)提供數(shù)據(jù)的,參考api也可以自己實(shí)現(xiàn)該功能≌认海現(xiàn)在主要是系統(tǒng)使用烂瘫,可以通過(guò)每個(gè)ContentProvider對(duì)外提供一個(gè)公共的URI獲取系統(tǒng)數(shù)據(jù)(例如音頻,視頻奇适,圖片和通訊錄)坟比。
基礎(chǔ)部分填坑到此為止,很多沒(méi)有考慮到的點(diǎn)以后遇到問(wèn)題滤愕,再做記錄温算。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市间影,隨后出現(xiàn)的幾起案子注竿,更是在濱河造成了極大的恐慌,老刑警劉巖魂贬,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巩割,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡付燥,警方通過(guò)查閱死者的電腦和手機(jī)宣谈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)键科,“玉大人闻丑,你說(shuō)我怎么就攤上這事⊙保” “怎么了嗦嗡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饭玲。 經(jīng)常有香客問(wèn)我侥祭,道長(zhǎng),這世上最難降的妖魔是什么茄厘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任矮冬,我火速辦了婚禮,結(jié)果婚禮上次哈,老公的妹妹穿的比我還像新娘胎署。我一直安慰自己,他們只是感情好窑滞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布琼牧。 她就那樣靜靜地躺著径筏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪障陶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天聊训,我揣著相機(jī)與錄音抱究,去河邊找鬼。 笑死带斑,一個(gè)胖子當(dāng)著我的面吹牛鼓寺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勋磕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妈候,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挂滓?” 一聲冷哼從身側(cè)響起苦银,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赶站,沒(méi)想到半個(gè)月后幔虏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贝椿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年想括,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烙博。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瑟蜈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渣窜,到底是詐尸還是另有隱情铺根,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布图毕,位于F島的核電站夷都,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏予颤。R本人自食惡果不足惜囤官,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛤虐。 院中可真熱鬧党饮,春花似錦、人聲如沸驳庭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蹲堂,卻和暖如春狼讨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柒竞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工政供, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朽基。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓布隔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稼虎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衅檀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容