MS(2):Android之基礎(chǔ)知識篇

二、組件

1葱她、Activity----------1?

MS思考:Android面試一天一題(3 Day):Activity生命周期

MS思考:Android面試一天一題(4 Day):Activity相關(guān)

分析篇:全面了解Activity

問題:Activity生命周期及流程圖吨些;

問題:介紹Activity的幾種啟動模式,并簡單說說自己的理解或者使用場景黔寇;

MS思考Android面試一天一題(Day 19:程序員何苦為難程序員(上))

MS思考:Android面試一天一題(Day 20:程序員何苦為難程序員(下))

1.standard:默認(rèn)標(biāo)準(zhǔn)模式屏轰,每啟動一個都會創(chuàng)建一個實(shí)例霎苗,

2.singleTop:棧頂復(fù)用唁盏,如果在棧頂就調(diào)用onNewIntent復(fù)用厘擂,從onResume()開始

3.singleTask:棧內(nèi)復(fù)用驴党,本棧內(nèi)只要用該類型Activity就會調(diào)到棧頂復(fù)用港庄,從onResume()開始

4.singleInstance:單例模式鹏氧,除了3中特性把还,系統(tǒng)會單獨(dú)給該Activity創(chuàng)建一個棧吊履,

問題:Activity傳遞參數(shù)

MS思考:Android面試一天一題(9 Day):Activity傳遞參數(shù)

問題:Activity中如何動態(tài)的添加Fragment

FragmentManager mFragmentManager = getSupportFragmentManager(); //獲取支持包中的FragmentManager();

ExampleFragment mExampleFragment =newmExampleFragment(); //動態(tài)添加的Fragment

FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); //通過beginTransaction()獲取fragmentTransaction

fragmentTransaction.add(R.id.new_panel, mExampleFragment); //向view中添加指定的Fragment

fragmentTransaction.commit(); //更新完成后不要忘記了commit()哦;

知識點(diǎn):鎖定屏與解鎖屏幕只會調(diào)用onPause()艇炎,而不會調(diào)用onStop方法缀踪,開屏后則調(diào)用onResume()(經(jīng)自己實(shí)際測試小米上會調(diào)用onStop)驴娃;

問題:內(nèi)存不足時系統(tǒng)會殺掉后臺的Activity唇敞,若需要進(jìn)行一些臨時狀態(tài)的保存厚棵,在哪個方法進(jìn)行

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法向楼,它們不同于 onCreate()灭返、onPause()等生命周期方法黔衡,它們并不一定會被觸發(fā)硝岗。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足仓坞、用戶直接按Home鍵)由系統(tǒng)銷毀一個Activity,onSaveInstanceState() 會被調(diào)用伍派。但是當(dāng)用戶主動去銷毀一個Activity時,例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會被調(diào)用碉纺。除非該activity是被用戶主動銷毀的骨田,通常onSaveInstanceState()只適合用于保存一些臨時性的狀態(tài)态贤,而onPause()適合用于數(shù)據(jù)的持久化保存抵卫。

問題:onSaveInstanceState()被執(zhí)行的場景有哪些介粘;

MS思考:Android面試一天一題(6 Day):onSaveStateInstance

系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序姻采,自然也不知道activity A是否會被銷毀婚瓜,因此系統(tǒng)都會調(diào)用onSaveInstanceState()巴刻,讓用戶有機(jī)會保存某些非永久性的數(shù)據(jù)胡陪。以下幾種情況的分析都遵循該原則

1.當(dāng)用戶按下HOME鍵時柠座;2.長按HOME鍵妈经,選擇運(yùn)行其他的程序時吹泡;3.鎖屏?xí)r荞胡;4.從activity A中啟動一個新的activity時泪漂;5.屏幕方向切換時萝勤。

問題:Activity場景記錄及恢復(fù)的原理

Android后臺殺死系列

問題:Activity緩存方法:

1.配置改變導(dǎo)致Activity被殺死,橫屏變豎屏:在onStop之前會調(diào)用onSaveInstanceState()保存數(shù)據(jù)在重建Activity之后趟径,會在onStart()之后調(diào)用onRestoreInstanceState(),并把保存下來的Bundle傳給onCreate()和它會默認(rèn)重建Activity當(dāng)前的視圖蜗巧,我們可以在onCreate()中幕屹,回復(fù)自己的數(shù)據(jù)望拖。

2.內(nèi)存不足殺掉Activity鸥跟,優(yōu)先級分別是:前臺可見医咨,可見非前臺,后臺侈贷。

問題:同一個應(yīng)用程序的不同Activity可以運(yùn)行在不同的進(jìn)程中么俏蛮?如果可以,舉例說明辣恋;

問題:Activity怎樣加速啟動

1伟骨、要顯示的activity的onCreate()方法中不要進(jìn)行耗時操作携狭,減小主線程的阻塞時間逛腿。初始化的一次性操作可以放到onresume中碘举。

2殴俱、前一個activity的onpause不要做耗時操作

3线欲、優(yōu)化布局文件李丰, 如果我們的布局層次嵌套過多,那么view繪制的時間和findViewById的時間必然會變多。

4嗜憔、使用多線程異步逐漸顯示view

問題:怎樣退出終止APP

怎樣退出終止App

問題:Activity切換動畫

activity切換動畫

1吉捶、在android:theme 主題里設(shè)置android:windowAnimationStyle

2、使用overridePendingTransition函數(shù)

2珊拼、Service----------1

MS思考:Android面試一天一題(1 Day):Service相關(guān)

分析篇:Service全面總結(jié)

Android中的Service:默默的奉獻(xiàn)者 (1)

Android中的Service:Binder,Messenger昔头,AIDL(2)

問題:Service的生命周期揭斧,兩種啟動方法讹开,有什么區(qū)別:

1.context.startService() ->onCreate()- >onStart()->Service running-->(如果調(diào)用context.stopService() )->onDestroy() ->Service shut down

1.如果Service還沒有運(yùn)行闹击,則調(diào)用onCreate()然后調(diào)用onStart()赏半;

2.如果Service已經(jīng)運(yùn)行断箫,則只調(diào)用onStart(),所以一個Service的onStart方法可能會重復(fù)調(diào)用多次埃撵。

3.調(diào)用stopService的時候直接onDestroy暂刘,

4.如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運(yùn)行捂刺。該Service的調(diào)用者再啟動起來后可以通過stopService關(guān)閉Service谣拣。

2.context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ->Service stop

1.onBind將返回給客戶端一個IBind接口實(shí)例,IBind允許客戶端回調(diào)服務(wù)的方法叠萍,比如得到Service運(yùn)行的狀態(tài)或其他操作芝发。

2.這個時候會把調(diào)用者和Service綁定在一起苛谷,Context退出了,Service就會調(diào)用onUnbind->onDestroy相應(yīng)退出。

3.所以調(diào)用bindService的生命周期為:onCreate --> onBind(只一次格郁,不可多次綁定) --> onUnbind --> onDestory腹殿。

問題:onStartCommand()的返回值是一個很奇怪的值START_STICKY,這是個什么呢例书?或者說這個方法的返回值是用來干嘛的呢锣尉?

事實(shí)上,它的返回值是用來指定系統(tǒng)對當(dāng)前線程的行為的决采。它的返回值必須是以下常量之一:

START_NOT_STICKY : 如果系統(tǒng)在 onStartCommand() 返回后終止服務(wù)自沧,則除非有掛起 Intent 要傳遞,否則系統(tǒng)不會重建服務(wù)。這是最安全的選項(xiàng)拇厢,可以避免在不必要時以及應(yīng)用能夠輕松重啟所有未完成的作業(yè)時運(yùn)行服務(wù)爱谁。

START_STICKY : 如果系統(tǒng)在 onStartCommand() 返回后終止服務(wù),則會重建服務(wù)并調(diào)用 onStartCommand()孝偎,但絕對不會重新傳遞最后一個 Intent访敌。相反,除非有掛起 Intent 要啟動服務(wù)(在這種情況下衣盾,將傳遞這些 Intent )寺旺,否則系統(tǒng)會通過空 Intent 調(diào)用 onStartCommand()。這適用于不執(zhí)行命令势决、但無限期運(yùn)行并等待作業(yè)的媒體播放器(或類似服務(wù))阻塑。

START_REDELIVER_INTENT : 如果系統(tǒng)在 onStartCommand() 返回后終止服務(wù),則會重建服務(wù)徽龟,并通過傳遞給服務(wù)的最后一個 Intent 調(diào)用 onStartCommand()叮姑。任何掛起 Intent 均依次傳遞。這適用于主動執(zhí)行應(yīng)該立即恢復(fù)的作業(yè)(例如下載文件)的服務(wù)据悔。

注意點(diǎn):Android5.0后隱式啟動service會報Service Intent must be explicit

解決辦法:Android: Service Intent must be explicit 異常解決

問題:說下IntentService原理

IntentService使用詳解和實(shí)例介紹

IntentService已經(jīng)做了這些事:

創(chuàng)建默認(rèn)的工作線程传透,用于在應(yīng)用的主線程外執(zhí)行傳遞給 onStartCommand() 的所有 Intent

創(chuàng)建工作隊(duì)列,用于將一個 Intent 逐一傳遞給 onHandleIntent() 實(shí)現(xiàn)极颓,這樣的話就永遠(yuǎn)不必?fù)?dān)心多線程問題了

在處理完所有啟動請求后停止服務(wù)朱盐,從此媽媽再也不用擔(dān)心我忘記調(diào)用 stopSelf() 了

提供 onBind() 的默認(rèn)實(shí)現(xiàn)(返回 null)

提供 onStartCommand() 的默認(rèn)實(shí)現(xiàn),可將 Intent 依次發(fā)送到工作隊(duì)列和 onHandleIntent() 實(shí)現(xiàn)

問題:IntentService與Service的區(qū)別

IntentService是Service的子類菠隆,是一個異步的兵琳,會自動停止的服務(wù),很好解決了傳統(tǒng)的Service中處理完耗時操作忘記停止并銷毀Service的問題

會創(chuàng)建獨(dú)立的worker線程來處理所有的Intent請求骇径;

會創(chuàng)建獨(dú)立的worker線程來處理onHandleIntent()方法實(shí)現(xiàn)的代碼躯肌,無需處理多線程問題;

所有請求處理完成后破衔,IntentService會自動停止清女,無需調(diào)用stopSelf()方法停止Service;

為Service的onBind()提供默認(rèn)實(shí)現(xiàn)晰筛,返回null嫡丙;

為Service的onStartCommand提供默認(rèn)實(shí)現(xiàn),將請求Intent添加到隊(duì)列中读第;

IntentService不會阻塞UI線程曙博,而普通Serveice會導(dǎo)致ANR異常

Intentservice若未執(zhí)行完成上一次的任務(wù),將不會新開一個線程怜瞒,是等待之前的任務(wù)完成后父泳,再執(zhí)行新的任務(wù),等任務(wù)完成后再次調(diào)用stopSelf()

問題:如何保證一個后臺服務(wù)不被殺死;比較省電的方式是什么

分析篇:保證service不被殺死

終極解決方案:Android應(yīng)對進(jìn)程被殺死--Service(二)

使用Jni,在 c端 fork進(jìn)程惠窄,檢測Service是否存活逝她,若Service已被殺死,則進(jìn)行重啟Service.

至于檢測方式睬捶,可以輪詢獲取子進(jìn)程Pid,若為1, 則說明子進(jìn)程被Init進(jìn)程所領(lǐng)養(yǎng),已經(jīng)成為了孤兒進(jìn)程.

但是這種方式比較消耗電量黔宛,并且由于不同手機(jī)系統(tǒng)定制的改變,當(dāng)應(yīng)用被強(qiáng)制停止時擒贸,父進(jìn)程并不一定被真正殺死臀晃,因此在一些特定機(jī)型上是無法通過此方式進(jìn)行判斷.這里推薦使用liunx socket的方式進(jìn)行類似心跳包的檢測,并且當(dāng)觸發(fā)檢測Service是否被殺死之前介劫,需要判斷應(yīng)用是否已經(jīng)被卸載徽惋,如果應(yīng)用已經(jīng)被卸載,則不再進(jìn)行檢測Service行為座韵,直接調(diào)用exit(0)退出子進(jìn)程险绘,避免浪費(fèi)系統(tǒng)資源和消耗電量.

注意: 目前在Android5.0系統(tǒng)上會把fork出來的進(jìn)程放到一個進(jìn)程組里, 當(dāng)程序主進(jìn)程掛掉后誉碴,也會把整個進(jìn)程組殺掉,因此用fork的方式也無法在Android5.0及以上系統(tǒng)實(shí)現(xiàn)守護(hù)進(jìn)程. 這個是系統(tǒng)層面的限制宦棺,當(dāng)然也是為了優(yōu)化整個的系統(tǒng)環(huán)境,守護(hù)進(jìn)程給手機(jī)帶來的體驗(yàn)并不好

1、利用service自己的機(jī)制.在onStartCommand中設(shè)置參數(shù)為START_STICKY黔帕,內(nèi)存不足被殺死內(nèi)存有的時候會重新創(chuàng)建代咸,短時間5次限制。

2成黄、設(shè)置Android:persistent="true"呐芥。

3、提升service優(yōu)先級android:priority奋岁。

4思瘟、提升service進(jìn)程優(yōu)先級,可以綁定通知欄成為前臺服務(wù),在service中創(chuàng)建一個notification闻伶,startForeground滨攻;nDestory方法中需要通過stopForeground(true)來取消前臺運(yùn)行狀態(tài)。

5虾攻、 android:process=”com.xxx.xxxservice”配置到單獨(dú)的進(jìn)程中

6铡买、onDestroy方法里重啟service更鲁。

7霎箍、監(jiān)聽系統(tǒng)廣播判斷Service狀態(tài),手機(jī)重啟澡为、界面喚醒漂坏、應(yīng)用狀態(tài)改變等等監(jiān)聽并捕獲到,然后判斷我們的Service是否還存活去啟動。

8顶别、雙進(jìn)程Service: 讓2個進(jìn)程互相保護(hù)**谷徙,其中一個Service被清理后,另外沒被清理的進(jìn)程可以立即重啟進(jìn)程

9驯绎、加上兩個類似于守護(hù)進(jìn)程的Service完慧, 分別檢查Service的運(yùn)行狀態(tài),注冊響應(yīng)的廣播剩失,對其進(jìn)行守護(hù),一旦發(fā)現(xiàn)沒有運(yùn)行就將其啟動.我利用的系統(tǒng)廣播是Intent.ACTION_TIME_TICK屈尼,這個廣播每分鐘發(fā)送一次,我們可以每分鐘檢查一次Service的運(yùn)行狀態(tài)拴孤,如果已經(jīng)被結(jié)束了脾歧,就重新啟動Service。它的優(yōu)點(diǎn)就是間隔時間短而且非常穩(wěn)定, 而其他的廣播并不能保證這一點(diǎn),當(dāng)然演熟,在具體的應(yīng)用中還是要根據(jù)需求使用, 結(jié)合其他廣播來保證自己的service一定會被重啟.

10鞭执、通過jni調(diào)用,在c層啟動多進(jìn)程 fork 機(jī)制創(chuàng)建 Native 進(jìn)程監(jiān)聽主進(jìn)程芒粹,為純Linux進(jìn)程生命周期不受android的控制兄纺,適用于5.0以下。

(要在 Native 進(jìn)程中感知主進(jìn)程是否存活有兩種實(shí)現(xiàn)方式:

10.1化漆、在 Native 進(jìn)程中通過死循環(huán)或定時器囤热,輪訓(xùn)判斷主進(jìn)程是否存活,檔主進(jìn)程不存活時進(jìn)行拉活获三。該方案的很大缺點(diǎn)是不停的輪詢執(zhí)行判斷邏輯旁蔼,非常耗電。

10.2疙教、在主進(jìn)程中創(chuàng)建一個監(jiān)控文件棺聊,并且在主進(jìn)程中持有文件鎖。在拉活進(jìn)程啟動后申請文件鎖將會被堵塞贞谓,一旦可以成功獲取到鎖限佩,說明主進(jìn)程掛掉,即可進(jìn)行拉活裸弦。由于 Android 中的應(yīng)用都運(yùn)行于虛擬機(jī)之上祟同,Java層的文件鎖與 Linux 層的文件鎖是不同的,要實(shí)現(xiàn)該功能需要封裝 Linux 層的文件鎖供上層調(diào)用理疙。)

11晕城、5.0以上利用 JobScheduler 機(jī)制拉活,系統(tǒng)會定時調(diào)用該進(jìn)程以使應(yīng)用進(jìn)行一些邏輯操作窖贤。

12砖顷、利用賬號同步機(jī)制拉活贰锁,Android 系統(tǒng)的賬號同步機(jī)制會定期同步賬號進(jìn)行

13、QQ黑科技: 在應(yīng)用退到后臺后滤蝠,另起一個只有 1 像素的頁面停留在桌面上豌熄,讓自己保持前臺狀態(tài),保護(hù)自己不被后臺清理工具殺死

14物咳、在已經(jīng)root的設(shè)備下锣险,修改相應(yīng)的權(quán)限文件,將App偽裝成系統(tǒng)級的應(yīng)用Android4.0系列的一個漏洞,已經(jīng)確認(rèn)可行

15览闰、在NDK環(huán)境中將1中編寫的C代碼編譯打包成可執(zhí)行文件(BUILD_EXECUTABLE)囱持。主進(jìn)程啟動時將守護(hù)進(jìn)程放入私有目錄下,賦予可執(zhí)行權(quán)限焕济,啟動它即可纷妆。

16、聯(lián)系廠商晴弃,加入白名單

問題:注冊Service需要注意什么

Service還是運(yùn)行在主線程當(dāng)中的掩幢,所以如果需要執(zhí)行一些復(fù)雜的邏輯操作,最好在服務(wù)的內(nèi)部手動創(chuàng)建子線程進(jìn)行處理上鞠,否則會出現(xiàn)UI線程被阻塞的問題

問題:Service與Activity怎么實(shí)現(xiàn)通信

方法一:

1际邻、添加一個繼承Binder的內(nèi)部類,并添加相應(yīng)的邏輯方法

2芍阎、Messager

3世曾、AIDL

方法二:

通過BroadCast(廣播)的形式 當(dāng)我們的進(jìn)度發(fā)生變化的時候我們發(fā)送一條廣播,然后在Activity的注冊廣播接收器谴咸,接收到廣播之后更新視圖

3轮听、BroadcastReceiver----------1

MS思考:Android面試一天一題(2 Day):廣播相關(guān)

分析篇:BroadcastReceiver使用總結(jié)

問題:注冊廣播接收器有哪幾種方式,有什么區(qū)別

靜態(tài)注冊:在AndroidManifest.xml文件中進(jìn)行注冊,當(dāng)App退出后岭佳,Receiver仍然可以接收到廣播并且進(jìn)行相應(yīng)的處理

動態(tài)注冊:在代碼中動態(tài)注冊血巍,當(dāng)App退出后,也就沒辦法再接受廣播了

問題:如何通過廣播攔截和abort一條短信珊随;

要攔截首先設(shè)置權(quán)限:android.permission.SEND_SMS述寡,android.permission.RECEIVE_SMS,設(shè)置receiver的優(yōu)先級為最高1000叶洞,acticion為android.provider.Telephony.SMS_RECEIVED鲫凶。

在4.4前,短信攔截都是通過動態(tài)注冊高優(yōu)先級BroadcastReceiver的方式進(jìn)行攔截的衩辟,主要是用于跟競品進(jìn)行短信搶占螟炫。而現(xiàn)在ContenetObserver是并行通知的情況下,如果過濾邏輯不夠快惭婿,依然有可能會被競品搶先把短信先刪除掉不恭,導(dǎo)致拿到的最后一次短信是舊的短信。建議結(jié)合BroadcastReceiver和ContenetObserver進(jìn)行攔截财饥,BroadcastReceiver做內(nèi)容校正和后備數(shù)據(jù)换吧,以防拿到的最后一條短信是舊的時候,依然可以進(jìn)行正常的攔截流程钥星;

4.4以上引入了default sms機(jī)制沾瓦,我們可以在不成為default sms的前提下實(shí)現(xiàn)短信攔截,利用App Ops權(quán)限管理功能谦炒,

但由于App Ops從4.3出現(xiàn)到4.4一直牌隱藏的狀態(tài)贯莺,猜想google還在不斷調(diào)整中;

Write SMS/MMS的權(quán)限開關(guān)的存在跟defaultsms本身是一個矛盾宁改,之所以出現(xiàn)Write SMS/MMS的權(quán)限開關(guān)缕探,完全是因?yàn)锳pp Ops出現(xiàn)在前,而defaultsms出現(xiàn)在后所致还蹲。

6.0以上引入了新的動態(tài)權(quán)限管理爹耗,類似于iOS中的權(quán)限。6.0以前是在安裝時一次性獲取權(quán)限谜喊,6.0之后是在運(yùn)行的時候選擇潭兽。

問題:廣播是否可以請求網(wǎng)絡(luò);

網(wǎng)絡(luò)狀態(tài)發(fā)生變化的時候斗遏,系統(tǒng)會發(fā)出 android.NET.conn.CONNECTIVITY_CHANGE山卦,在onreceiver中使用ConnectivityManager監(jiān)聽網(wǎng)絡(luò)狀態(tài),從4.0 開始所有的網(wǎng)絡(luò)請求都需要在線程中诵次,廣播請求網(wǎng)絡(luò)同理 開啟線程在線程中請求網(wǎng)絡(luò)

問題:廣播引起anr的時間限制

10秒鐘账蓉,所以在Onceive中耗時的操作一般新開線程處理

4、ContentProvider ----------1

MS思考:Android面試一天一題(15 Day:ContentProvider)

分析篇:ContentProvider實(shí)例詳解

Android ContentProvider啟動流程完全解密

問題:權(quán)限管理

讀寫分離(exported=true讀設(shè)置Android:readPermission,寫設(shè)置android:writePermisson

問題:權(quán)限控制-精確到表級(匹配URI)逾一,URL控制

5剔猿、Fragment?----------1

MS思考:Android面試一天一題(Day 24: 悲催的Fragment)

分析篇:Fragment 全解析

問題:Fragment生命周期

onAttach綁定activity,oncreate,onActivitycreated:Activity的onCreate方法已經(jīng)執(zhí)行完成并返回,onstart,onresume,onpause,onstop,onDesdroyview,onDesdroy,ondettach解除綁定券膀;

問題:Fragment狀態(tài)保存

人為返回出棧不調(diào)用onSaveInstanceState淮摔,在ondesdroy中保存(保存在能和Fragment一起共存的Argument:Bundle b = getArguments();),恢復(fù)狀態(tài)在onActivityCreated中

問題:fragement里面可以再嵌套fragment硕勿?

getChildFragmentManager()

Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常見錯誤

6鄙早、Intent----------1

問題:顯示Intent與隱式Intent的區(qū)別

對明確指出了目標(biāo)組件名稱的Intent汪茧,我們稱之為“顯式Intent”。 對于沒有明確指出目標(biāo)組件名稱的Intent限番,則稱之為“隱式 Intent”舱污。

對于隱式意圖,在定義Activity時弥虐,指定一個intent-filter扩灯,當(dāng)一個隱式意圖對象被一個意圖過濾器進(jìn)行匹配時媚赖,將有三個方面會被參考到:

動作(Action)

類別(Category ['k?t?g(?)r?] )

數(shù)據(jù)(Data )

問題:Intent可以傳遞哪些數(shù)據(jù)類型

1.Serializable

2.charsequence: 主要用來傳遞String,char等

3.parcelable

4.Bundle

7珠插、動畫----------1

問題:Android中的動畫有哪些惧磺,區(qū)別是什么

逐幀動畫(Drawable Animation): 加載一系列Drawable資源來創(chuàng)建動畫,簡單來說就是播放一系列的圖片來實(shí)現(xiàn)動畫效果捻撑,可以自定義每張圖片的持續(xù)時間

補(bǔ)間動畫(Tween Animation): Tween可以對View對象實(shí)現(xiàn)一系列簡單的動畫效果磨隘,比如位移,縮放顾患,旋轉(zhuǎn)番捂,透明度等等。但是它并不會改變View屬性的值江解,只是改變了View的繪制的位置设预,比如,一個按鈕在動畫過后犁河,不在原來的位置絮缅,但是觸發(fā)點(diǎn)擊事件的仍然是原來的坐標(biāo)。

屬性動畫(Property Animation): 動畫的對象除了傳統(tǒng)的View對象呼股,還可以是Object對象耕魄,動畫結(jié)束后,Object對象的屬性值被實(shí)實(shí)在在的改變了

問題:動畫的原理:

1.動畫的基本原理:其實(shí)就是利用插值器和估值器彭谁,來計(jì)算出各個時刻View的屬性吸奴,然后通過改變View的屬性來,實(shí)現(xiàn)View的動畫效果缠局。

2.View動畫:只是影像變化则奥,view的實(shí)際位置還在原來的地方。

3.幀動畫是在xml中定義好一系列圖片之后狭园,使用AnimationDrawable來播放的動畫读处。

4.View的屬性動畫:

1.插值器:作用是根據(jù)時間的流逝的百分比來計(jì)算屬性改變的百分比

2.估值器:在1的基礎(chǔ)上由這個東西來計(jì)算出屬性到底變化了多少數(shù)值的類

問題:不使用動畫,怎么實(shí)現(xiàn)一個動態(tài)的 View唱矛?

1罚舱、利用線程改變view的位置大小等

2、自定義view重繪

問題:View的補(bǔ)間動畫有哪幾種绎谦?補(bǔ)間動畫效果的實(shí)現(xiàn)原理

8管闷、ListView----------1

MS思考:Android面試一天一題(11 Day):ListView相關(guān)

問題:怎么實(shí)現(xiàn)一個部分更新的 ListView?

intvisiblePosition = mListView.getFirstVisiblePosition();

//只有當(dāng)要更新的view在可見的位置時才更新窃肠,不可見時包个,跳過不更新

if(itemIndex?-?visiblePosition?>=0)?{

//得到要更新的item的view

View?view?=?mListView.getChildAt(itemIndex?-?visiblePosition);

問題:怎么實(shí)現(xiàn)ListView多種布局?

問題:ListView與數(shù)據(jù)庫綁定的實(shí)現(xiàn)

9冤留、View相關(guān)----------1

問題:Postvalidata與Validata有什么區(qū)別碧囊?

Validata只能在工作線程調(diào)用树灶,Postvalidata內(nèi)部使用了handler實(shí)現(xiàn),可在工作線程調(diào)用

10糯而、RecyclerView----------1

十秒鐘搞定RecyclerView數(shù)據(jù)綁定

封裝那些事-RecyclerView封裝實(shí)踐


11天通、Scrollview----------1

MS思考:Android面試一天一題(Day 26:ScrollView嵌套ListView的事件沖突)

問題:Scrollview怎么判斷是否滑倒底部

android:怎么判斷android中ScrollView滑動到了最底部?

ios:如何判斷Scrollview滑到底部

12、Context----------1

MS思考:Android面試一天一題(10 Day):如何理解Android中的Context

問題:Context與ApplicationContext的區(qū)別歧蒋,分別用在什么情況下

ApplicationContext的生命周期是與Application的生命周期相關(guān)的土砂,context隨著Application的銷毀而銷毀州既,伴隨application的一生谜洽,與activity的生命周期無關(guān).第二種中的context跟Activity的生命周期是相關(guān)的,但是對一個Application來說吴叶,Activity可以銷毀幾次阐虚,那么屬于Activity的context就會銷毀多次。

Application的Context是一個全局靜態(tài)變量蚌卤,SDK的說明是只有當(dāng)你引用這個context的生命周期超過了當(dāng)前activity的生命周期实束,而和整個應(yīng)用的生命周期掛鉤時,才去使用這個application的context逊彭。

在android中context可以作很多操作咸灿,但是最主要的功能是加載和訪問資源。在android中有兩種context侮叮,一種是 application context避矢,一種是activity context,通常我們在各種類和方法間傳遞的是activity context囊榜。

在使用context的時候审胸,小心內(nèi)存泄露,防止內(nèi)存泄露卸勺,注意一下幾個方面:

1. 不要讓生命周期長的對象引用activity context砂沛,即保證引用activity的對象要與activity本身生命周期是一樣的

2. 對于生命周期長的對象,可以使用application context

3. 避免非靜態(tài)的內(nèi)部類曙求,盡量使用靜態(tài)類碍庵,避免生命周期問題,注意內(nèi)部類對外部對象引用導(dǎo)致的生命周期變化

問題:Application(或者Service)和Activity都可以調(diào)用Context的startActivity方法悟狱,那么在這兩個地方調(diào)用startActivity有區(qū)別嗎怎抛?

Application(或者Service)需要給Intent設(shè)置Intent.FLAG_ACTIVITY_NEW_TASK才能正常啟動Activity,Application(或者Service)需要給Intent設(shè)置Intent.FLAG_ACTIVITY_NEW_TASK才能正常啟動Activity

問題:Context的實(shí)例是什么時候創(chuàng)建的芽淡?一個應(yīng)用里面會有幾個Context的實(shí)例马绝?

Context數(shù)量 = Activity數(shù)量 + Service數(shù)量 + 1(Application)

問題:為什么Dialog不能用Application的Context

為什么Dialog不能用Application的Context


13、布局相關(guān)----------1

五大布局易混淆知識

布局性能優(yōu)化:布局性能優(yōu)化(include, viewstub, merge)

實(shí)現(xiàn)InstaMaterial概念設(shè)計(jì) - 完結(jié)篇

三挣菲、進(jìn)程線程

MS思考:Android面試一天一題(Day 25:進(jìn)程和線程)

1富稻、進(jìn)程----------1

問題:多進(jìn)程開發(fā)以及多進(jìn)程應(yīng)用場景

點(diǎn)擊打開鏈接

例子:音樂播放服務(wù)掷邦,云平臺客戶端的同步服務(wù)

問題:多進(jìn)程的好處

(1)Android系統(tǒng)對每個應(yīng)用進(jìn)程的內(nèi)存占用是有限制的,占用內(nèi)存越大的進(jìn)程椭赋,通常被系統(tǒng)殺死的可能性越大抚岗。讓一個組件運(yùn)行在單獨(dú)的進(jìn)程中,可以減少主進(jìn)程所占用的內(nèi)存哪怔,降低被系統(tǒng)殺死的概率宣蔚;

(2)如果子進(jìn)程因?yàn)槟撤N原因崩潰了,不會直接導(dǎo)致主程序的崩潰认境,可以降低主程序崩潰的概率胚委;

(3)即使主進(jìn)程退出了,子進(jìn)程仍然可以繼續(xù)工作叉信,比如子進(jìn)程是推送服務(wù)亩冬,在主進(jìn)程退出的情況下,仍然能夠保證用戶可以收到推送消息硼身。

問題:多進(jìn)程使用場景

(1)BroadcastReceiver

一個程序發(fā)送廣播硅急,可以啟動其他程序的BroadcastReceiver。拿到清單文件中BroadcastReceiver的intentFilter中的action屬性值佳遂,可以在另一個應(yīng)用中發(fā)送廣播啟動當(dāng)前應(yīng)用里的BroadcastReceiver营袜。

(2)ContentProvider

一個應(yīng)用通過ContentProvider向其他的應(yīng)用暴露自己的數(shù)據(jù),供其他應(yīng)用訪問

(3)啟動其他應(yīng)用的activity或者service

2丑罪、線程----------1

MS思考:Android面試一天一題(16 Day: 線程同步)

問題:什么時候使用CountDownLatch

什么時候使用CountDownLatch

問題:HandlerThread荚板、Thread、Asynctask原理與區(qū)別

問題:生產(chǎn)者與消費(fèi)者巍糯,手寫代碼 ****(多線程同步的框架的實(shí)現(xiàn)原理啸驯,以及如何用生產(chǎn)者消費(fèi)者模型解決同步問題)

用Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的幾種方法

3、Socket編程

問題:socket短線重連怎么實(shí)現(xiàn)祟峦,心跳機(jī)制又是怎樣實(shí)現(xiàn)罚斗,四次握手步驟有哪些(網(wǎng)絡(luò)通訊原理)

4、ThreadLocal

由淺入深全面剖析ThreadLocal

ThreadLocal的使用規(guī)則和源碼分析




四宅楞、數(shù)據(jù)存儲

問題:數(shù)據(jù)持久化的四種方式有哪些针姿?

MS思考:Android面試一天一題(14 Day:SharedPreferences)

分析篇:Android 數(shù)據(jù)存儲五種方式使用與總結(jié)

文件存儲: 通過java.io.FileInputStream和java.io.FileOutputStream這兩個類來實(shí)現(xiàn)對文件的讀寫,java.io.File類則用來構(gòu)造一個具體指向某個文件或者文件夾的對象厌衙。

SharedPreferences: SharedPreferences是一種輕量級的數(shù)據(jù)存儲機(jī)制距淫,他將一些簡單的數(shù)據(jù)類型的數(shù)據(jù),包括boolean類型婶希,int類型榕暇,float類型,long類型以及String類型的數(shù)據(jù),以鍵值對的形式存儲在應(yīng)用程序的私有Preferences目錄(/data/data/<包名>/shared_prefs/)中彤枢,這種Preferences機(jī)制廣泛應(yīng)用于存儲應(yīng)用程序中的配置信息狰晚。

SQLite數(shù)據(jù)庫: 當(dāng)應(yīng)用程序需要處理的數(shù)據(jù)量比較大時,為了更加合理地存儲缴啡、管理壁晒、查詢數(shù)據(jù),我們往往使用關(guān)系數(shù)據(jù)庫來存儲數(shù)據(jù)业栅。Android系統(tǒng)的很多用戶數(shù)據(jù)秒咐,如聯(lián)系人信息,通話記錄碘裕,短信息等携取,都是存儲在SQLite數(shù)據(jù)庫當(dāng)中的,所以利用操作SQLite數(shù)據(jù)庫的API可以同樣方便的訪問和修改這些數(shù)據(jù)娘汞。

ContentProvider: 主要用于在不同的應(yīng)用程序之間實(shí)現(xiàn)數(shù)據(jù)共享的功能歹茶,不同于sharepreference和文件存儲中的兩種全局可讀寫操作模式夕玩,內(nèi)容提供其可以選擇只對哪一部分?jǐn)?shù)據(jù)進(jìn)行共享你弦,從而保證我們程序中的隱私數(shù)據(jù)不會有泄漏的風(fēng)險

解析xml:

DOM、SAX燎孟、Pull解析XML

問題:Json有什么優(yōu)劣勢

分析篇:Json優(yōu)劣勢

1.JSON的速度要遠(yuǎn)遠(yuǎn)快于XML

2.JSON相對于XML來講禽作,數(shù)據(jù)的體積小

3.JSON對數(shù)據(jù)的描述性比XML較差

問題:數(shù)據(jù)庫的知識,包括本地數(shù)據(jù)庫優(yōu)化點(diǎn)揩页。

MS思考:Android面試一天一題(Day 18:SQLite數(shù)據(jù)庫)

分析篇:Android SQLite的使用入門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旷偿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爆侣,更是在濱河造成了極大的恐慌萍程,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔仰,死亡現(xiàn)場離奇詭異茫负,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乎赴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門忍法,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榕吼,你說我怎么就攤上這事饿序。” “怎么了羹蚣?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵原探,是天一觀的道長。 經(jīng)常有香客問我,道長咽弦,這世上最難降的妖魔是什么告匠? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮离唬,結(jié)果婚禮上后专,老公的妹妹穿的比我還像新娘。我一直安慰自己输莺,他們只是感情好戚哎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫂用,像睡著了一般型凳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘱函,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天甘畅,我揣著相機(jī)與錄音,去河邊找鬼往弓。 笑死疏唾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的函似。 我是一名探鬼主播槐脏,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撇寞!你這毒婦竟也來了顿天?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蔑担,失蹤者是張志新(化名)和其女友劉穎牌废,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啤握,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟缕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恨统。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叁扫。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖畜埋,靈堂內(nèi)的尸體忽然破棺而出莫绣,到底是詐尸還是另有隱情,我是刑警寧澤悠鞍,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布对室,位于F島的核電站模燥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掩宜。R本人自食惡果不足惜蔫骂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牺汤。 院中可真熱鬧辽旋,春花似錦、人聲如沸檐迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽追迟。三九已至溶其,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敦间,已是汗流浹背瓶逃。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廓块,地道東北人厢绝。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像剿骨,于是被迫代替她去往敵國和親代芜。 傳聞我的和親對象是個殘疾皇子埠褪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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