Android基礎(chǔ)相關(guān)面試題

一、Activity

①定義:Activity是安卓與用戶交互時提供的一個界面,用戶可以通過它來實現(xiàn)點擊、滑動操作。

②Activity四種狀態(tài):

Running (活動狀態(tài)。屏幕根據(jù)用戶操作做出反應(yīng)。處于棧頂);

paused? (失去焦點、非全屏界面占據(jù)、失去和用戶交互能力);

stopped (被另一個Activity完全覆蓋、不可見);

killed???? (被系統(tǒng)回收,保存信息成員變量不存在)。

③生命周期:

?Ⅰ Activity啟動:onCreate()(被創(chuàng)建時回調(diào)、處理一些預(yù)加載)->onStart()(表明Activity正在啟動,處于可見狀態(tài),但不能與用戶交互)->onResume()(表明已經(jīng)在前臺,可以交互)

?Ⅱ 點擊Home鍵回到主界面或被覆蓋(Activity不可見):onPause()->onStopped()(表明已被停止或覆蓋,內(nèi)存緊張時可能被回收)

?Ⅲ 再次回到原Activity時:onRestart()->onStart()->onResume()(可以交互了)

?Ⅳ 退出當(dāng)前Activity時:onPause()->onStop()->onDestroy()(表明當(dāng)前Activity正在被銷毀,回收工作,資源釋放)


①onCreate :Activity第一次被實例化的時候系統(tǒng)會調(diào)用,整個生命周期只調(diào)用1次該方法。

通常用于初始化設(shè)置: 1、為Activity設(shè)置所要使用的布局文件。2、為安卓控件綁定監(jiān)聽器等靜態(tài)的設(shè)置操作。

②onStart(可見不可交互):當(dāng)Activity可見未獲得用戶焦點不能交互時系統(tǒng)會調(diào)用。

③onResume(可見可交互) :當(dāng)Activity和用戶發(fā)生交互的時候,觸發(fā)該方法。

④onPause (有一點可見不能交互):當(dāng)一個正在前臺運(yùn)行的Activity因為其他的Activity需要前臺運(yùn)行而轉(zhuǎn)入后臺運(yùn)行的時候,觸發(fā)該方法。

⑤onStop(不可見不能交互):當(dāng)Activity被其他的Activity完全覆蓋不可見時,觸發(fā)該方法,如果內(nèi)存緊張,系統(tǒng)會直接結(jié)束這個Activity,而不會觸發(fā) onStop 方法。

⑥onRestart (由不可見到可見):當(dāng)處于停止?fàn)顟B(tài)的Activity需要再次展現(xiàn)給用戶的時候,觸發(fā)該方法。

⑦onDestroy :當(dāng)Activity(用戶調(diào)用finish()或系統(tǒng)由于內(nèi)存不足)被系統(tǒng)銷毀時調(diào)用,(整個生命周期只調(diào)用1次)用來釋放onCreate ()方法中創(chuàng)建的資源,如結(jié)束線程,清空數(shù)據(jù),注銷廣播等。和 onStop 方法一樣,如果內(nèi)存緊張,系統(tǒng)會直接結(jié)束這個Activity而不會觸發(fā)該方法。

具體區(qū)別:https://blog.csdn.net/superjunjin/article/details/44674917


④啟動模式:

1.??? standard

2.??? singletop(棧頂復(fù)用模式)

3.??? singletask

4.??? singleinstance

scheme跳轉(zhuǎn)協(xié)議(一種頁面內(nèi)跳轉(zhuǎn)協(xié)議,方便跳轉(zhuǎn)app各個頁面,可以通過通知欄消息定制化跳轉(zhuǎn)頁面,可以通過H5頁面跳轉(zhuǎn)頁面)


二、Fragment(第五大組件)

不屬于其他四大組件,有自己的生命周期,可以靈活加載到Activity上,并不完全獨立,必須依附Activity并加載到Activity上。

1、加載到Activity兩種方式:

①?? 靜態(tài)加載:把Fragment作為XML標(biāo)簽加載到Activity中;?????????????

②?? 動態(tài)加載:通過FragmentManager來管理所有要啟動的Fragment。

Step1:創(chuàng)建FragmentManager對象,通過FragmentManager創(chuàng)建FragmentTransaction;實體transaction

Step2:調(diào)用transaction里的add(R.id.)方法;

Step3:調(diào)用transaction.commit()

2、Fragment生命周期:


OnAttach(Fragment與Activity關(guān)聯(lián)后回調(diào))

onCreate(創(chuàng)建Fragment)

onCreateView(系統(tǒng)在Fragment首次繪制用戶界面時調(diào)用,返回的View必須是Fragment的根視圖)

onViewCreated(表明UI界面繪制好,初始化Fragment內(nèi)控件資源)

Activity-onCreate(初始化Activity布局及數(shù)據(jù))

Activity-onCreated(渲染繪制成功以后調(diào)用)

Activity-onStart(表示Activity可見了)

onStart(表明Fragment也可見了)

Activity-onResume(Activity和用戶可交互了)

onResume(Fragment與用戶也可交互了,用戶可進(jìn)行滑動、點擊等操作)

onPause(Fragment失去用戶交互)

Activity-onPause(Activity也不可交互)

onStop

Activity-onStop

onDestroyView(對應(yīng)創(chuàng)建時的onCreateView方法,表明Fragment即將結(jié)束)

onDestroy

onDetach

Activity-onDestroy(整個Activity被回收)

3、Fragment通信:

①?? 在Fragment中調(diào)用Activity中的方法getActivity

②?? 在Activity中調(diào)用Fragment中的方法,接口回調(diào)

③?? 在Fragment中調(diào)用Activity中g(shù)etActivity獲取到Activity方法,通過Fragment中的方法findFragmentById獲取到另一個

4、Fragment的方法

Fragment的replace、add、remove方法:

add:將Fragment實例添加到最上層

remove:將Fragment實例從Fragment隊列中刪除

replace(FragmentManager的方法):將Fragment目標(biāo)實例替換到最上層的實例



三、Service(一個可以在后臺執(zhí)行長時間運(yùn)行操作而沒有用戶界面的應(yīng)用組件、運(yùn)行在主線程,不能做耗時操作)

1、Service和Thread的區(qū)別:

A.定義

Thread:是程序執(zhí)行的最小單元,是分配CPU的基本單位,可執(zhí)行耗時的操作。

Service:一種輕量級的IPC通信,一個可以在后臺執(zhí)行長時間運(yùn)行操作而沒有用戶界面的應(yīng)用組件、運(yùn)行在主線程,不能做耗時操作。

B.實際開發(fā)

Thread一般指工作線程,即后臺線程,做耗時操作,而主線程負(fù)責(zé)處理UI線程的繪制;

Service運(yùn)行在主線程中,如果要執(zhí)行耗時操作一定要開啟單獨線程。

C.應(yīng)用場景

當(dāng)需要執(zhí)行網(wǎng)絡(luò)請求、文件數(shù)據(jù)查詢以及其他阻塞UI線程的操作時,都需要開啟工作線程,

而Service應(yīng)用于需要長時間在后臺運(yùn)行且不需要交互的情況下,如播放音樂,天氣預(yù)報統(tǒng)計及數(shù)據(jù)統(tǒng)計等。

2、開啟Service的兩種啟動方法

①stratservice:

啟動的服務(wù):主要用于啟動一個服務(wù)執(zhí)行后臺任務(wù),不進(jìn)行通信。停止服務(wù)使用stopService;

step1:定義一個類繼承Service

step2:在Mainfest.Xml文件中配置該Service

step3:使用Context的startService(Intent)方法啟動該Service

step4:不再使用時,調(diào)用stopService(Intent)方法停止該服務(wù)

②bindService:

啟動的服務(wù):該方法啟動的服務(wù)可以進(jìn)行通信。停止服務(wù)使用unbindService;

step1:創(chuàng)建bindService服務(wù)端,繼承自Service并在類中,創(chuàng)建一個實現(xiàn)IBinder接口的實例對象并提供公共方法給客戶端調(diào)用

step2:從onBind()回調(diào)方法返回此Binder實例

step3:在客戶端中,從onServiceConnected()回調(diào)方法接受Binder,并使用提供的方法調(diào)用綁定服務(wù)


四、Broadcast Receiver

1、廣播:

①?? 廣播的定義:在Android中,Broadcast是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制,Android中我們要發(fā)送的廣播內(nèi)容是一個Intent,這個Intent中可以攜帶我們要傳送的數(shù)據(jù)。

①?? 廣播的使用場景:

?? A.?? 同一APP具有多個進(jìn)程的不同組件之間的消息通信(定位地圖進(jìn)程與主進(jìn)程間通信)

?? B.?? 不同APP之間的組件之間消息通信

②?? 廣播的種類:

?? A.?? Normal Broadcast:Context.sendBroadcast (普通廣播)

?? B.?? System Broadcast:Context.sendOrderdBroadcast (有序廣播)

?? C.?? Local Broadcast:只在自身APP內(nèi)傳播 (本地廣播)

2、實現(xiàn)廣播-receiver

①??? 靜態(tài)注冊:注冊完成就一直運(yùn)行(寫在AndroidMainfest.xml里,進(jìn)程殺死仍能收到廣播)

②??? 動態(tài)注冊:跟隨Activity的生命周期(在代碼中調(diào)用registerReceiver()進(jìn)行注冊,在onDestroy方法里調(diào)用unregisterReceiver()方法注銷,注銷后應(yīng)將receiver設(shè)為null,避免引起內(nèi)存泄漏)

3、內(nèi)部實現(xiàn)機(jī)制

①?? 自定義廣播接受者BroadcastReceiver,并復(fù)寫onReceive()方法;

②?? 通過Binder機(jī)制向AMS(Activity Manager Service,負(fù)責(zé)四大組件的啟動,切換和調(diào)度,以及應(yīng)用程序的管理和調(diào)度工作)進(jìn)行注冊;

③?? 廣播發(fā)送者通過Binder機(jī)制向AMS發(fā)送廣播;

④?? AMS查找符合相應(yīng)條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發(fā)送到BroadcastReceiver(一般情況下是Activity)相應(yīng)的消息循環(huán)隊列中;

⑤?? 消息循環(huán)執(zhí)行拿到此廣播,回調(diào)BroadcastReceiver中的onReceive()方法。

4、LocalBroadcastManager詳解(本地廣播)

優(yōu)點:

①?? 使用它發(fā)送的廣播將只在自身APP內(nèi)傳播,因此你不必?fù)?dān)心泄露隱私數(shù)據(jù)。

②?? 其他APP無法對你的APP發(fā)送該廣播,因為你的APP根本就不可能接受到非自身應(yīng)用發(fā)送的該廣播,因此你不必?fù)?dān)心有安全漏洞可以利用。

③?? 比系統(tǒng)的全局廣播更加高效。

內(nèi)部實現(xiàn):

①?? LocalBroadcastManager高效的原因主要是因為它內(nèi)部是通過Handler實現(xiàn)的,它的sendBroadcast()方法含義并非和我們平時所用的一樣,它的sendBroadcast()方法其實是通過Handler發(fā)送一個message實現(xiàn)的;

②?? 既然是它內(nèi)部是通過Handler來實現(xiàn)廣播發(fā)送的,那么相比與系統(tǒng)廣播通過Binder實現(xiàn)那肯定是更高效了,同時使用Handler來實現(xiàn),別的應(yīng)用無法向我們的應(yīng)用發(fā)送該廣播,而我們應(yīng)用內(nèi)發(fā)送的廣播也不會離開我們的應(yīng)用;

③?? LocalBroadcastManager內(nèi)部協(xié)作主要是靠這兩個Map集合:mReceivers和mActions,當(dāng)然還有一個List集合mPendingBroadcasts,這個主要就是存儲待接收的廣播對象。


五、WebView安全漏洞問題

1、Webview常見的一些坑

①??? Android API level 16以及之前的版本存在遠(yuǎn)程代碼執(zhí)行安全漏洞,該漏洞源于程序沒有正確限制使用WebView.addJavascriptInterface方法,遠(yuǎn)程攻擊者可以通過Java

Reflection API利用該漏洞執(zhí)行任意Java對象的方法

②??? WebView在布局文件中的使用:WebView寫在其他容器中時(需要先把WebView在這個容器中銷毀再調(diào)用WebView的onDestroy方法)

③??? Jsbridge:構(gòu)建橋,一端是本地,一端是web端,讓本地native端可以調(diào)用遠(yuǎn)端web js代碼,同時讓遠(yuǎn)端web可以調(diào)用本地native的代碼(不是坑)

④??? webviewClient.onPageFinished(頁面加載完回調(diào),若正在加載的網(wǎng)頁出現(xiàn)跳轉(zhuǎn),方法會被調(diào)用無數(shù)次)àwebChromeClient.onProgressChanged(當(dāng)webView需要加載各種網(wǎng)頁且完成一些操作時最好使用該方法)

⑤??? 后臺耗電:WebView加載網(wǎng)頁時會自己開啟線程,如果沒有將WebView很好的銷毀,殘余線程就會一直在后臺運(yùn)行,使后臺耗電量居高不下(css.exit)

⑥??? WebView硬件加速導(dǎo)致頁面渲染問題:容易出現(xiàn)頁面加載白塊、閃爍(設(shè)置WebView暫時關(guān)閉硬件加速)

2、關(guān)于WebView的內(nèi)存泄漏問題

①??? 獨立進(jìn)程,簡單粗暴,不過可能涉及到進(jìn)程間通信。

②??? 動態(tài)添加WebView,對傳入WebView中使用的Context使用弱引用。動態(tài)添加WebView意思在布局創(chuàng)建個ViewGroup用來放置WebView,Activity創(chuàng)建時add進(jìn)來,在Activity停止時在容器中remove掉再調(diào)用onDestroy。


六、Binder

1、Linux內(nèi)核的基礎(chǔ)知識

①??? 進(jìn)程隔離/虛擬地址空間不同,數(shù)據(jù)不共享

②??? 系統(tǒng)調(diào)用(只可訪問許可的資源,將內(nèi)核層和用戶空間分隔開,通過系統(tǒng)調(diào)用在用戶空間訪問內(nèi)核資源)

③??? Binder驅(qū)動(運(yùn)行在內(nèi)核空間當(dāng)中,各個用戶進(jìn)程通過Binder通信內(nèi)核進(jìn)行交互)

2、Binder通信機(jī)制介紹

①??? 為什么使用Binder

?? A.? ? Android使用的Linux內(nèi)核擁有非常多的跨進(jìn)程通信機(jī)制

?? B.??? 性能(相比傳統(tǒng)socket更加高效)

?? C.? ? 安全(協(xié)議本身支持雙方身份校驗)

②??? Binder通信模型

?? A.???? 電話基站:Binder驅(qū)動(內(nèi)核)

?? B.???? 通信錄:serviceManager

③???? Binder通信機(jī)制原理

?? A.???? Service在ServiceManager表中注冊它的方法;

?? B.???? Client到ServiceManager表中查詢是否有目標(biāo)調(diào)用方法,ServiceManager返回給Client一個代理對象的方法(空方法),Client調(diào)用該代理對象方法時返回給內(nèi)核驅(qū)動,內(nèi)核驅(qū)動接收到代理對象的方法后調(diào)用Service端的對應(yīng)方法,Service端把結(jié)果返回給ServiceManager,ServiceManager再把結(jié)果返回給Client端。

④??? 什么是Binder

?? A.???? 通常意義下,Binder指的是一種通信機(jī)制;

?? B.???? 對于Service進(jìn)程來說,Binder指的是Binder本地對象/對于Client來說,Binder指的是Binder代理對象;

?? C.???? 對于傳輸過程而言,Binder是可以進(jìn)行跨進(jìn)程傳遞的對象。

3、AIDL(Android Interface Definition Language)

AIDL是一種接口定義語言,借助它,你可以定義接口,使得客戶端和服務(wù)端之間實現(xiàn)進(jìn)程間通信。對android來說, 一個進(jìn)程無法通過正常的方法來訪問另一個進(jìn)程的內(nèi)存空間??梢哉f,他們需要把對象分解成操作系統(tǒng)可以理解的原子類型,然后使對象突破限制在不同進(jìn)程之間進(jìn)行傳輸。具體實現(xiàn)這種機(jī)制的代碼寫起來非常枯燥,所以android為你提供了AIDL語言來進(jìn)行處理。

①??? asInterface方法里表明,如果A和B屬于同一進(jìn)程則不會走跨進(jìn)程,如果是非同一線程,則會返回一個代理類,然后通過代理對象來獲取遠(yuǎn)端的數(shù)據(jù);

②??? onTransact方法:根據(jù)AIDL函數(shù)返回的編號來進(jìn)行相應(yīng)的方法調(diào)用。

注意:

a.只有當(dāng)你需要來自不同應(yīng)用的客戶端通過IPC通信來訪問你的服務(wù)時,并且想在服務(wù)里處理多線程的業(yè)務(wù),這時就需要使用AIDL。

b.如果你不需要同時對幾個應(yīng)用進(jìn)程IPC操作,你最好通過實現(xiàn)Binder接口來創(chuàng)建你的接口。

c.如果你仍需要執(zhí)行IPC操作,但不需要處理多線程,使用Messenger來實現(xiàn)接口即可。

d.無論如何,在實現(xiàn)AIDL之前確保你完全理解Bound Service相關(guān)知識。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容