Android 基礎(chǔ)
-
Android 系統(tǒng)架構(gòu)
- Applications:應(yīng)用程序
- Application Framework:組件和服務(wù)API
- Libraries琅关、Runtime:即 c/c++ 函數(shù)庫(kù)部分芙扎,大多數(shù)都是開放源代碼的函數(shù)庫(kù)啸澡,例如 webkit惰爬;android 的 runtime 負(fù)責(zé)解釋和執(zhí)行生成的dalvik格式的字節(jié)碼
- Linux Kernal:硬件驅(qū)動(dòng)程序:網(wǎng)絡(luò)毡咏、電源各谚、系統(tǒng)安全以及內(nèi)存管理等功能
- 簡(jiǎn)單介紹Android四大組件
- Activity:Activity 是 Android 程序與用戶交互的窗口固以,主要做界面展示和一些持久化的事情
- Service:后臺(tái)服務(wù)扰藕,定義好需要接受的 Intent 提供同步和異步的接口,常用于處理一些常駐校摩、耗時(shí)的操作
- Content Provider:是 Android 提供的第三方應(yīng)用數(shù)據(jù)的訪問(wèn)方案看峻,可以派生 Content Provider 類,對(duì)外提供數(shù)據(jù)衙吩,可以像數(shù)據(jù)庫(kù)一樣進(jìn)行選擇排序互妓,屏蔽內(nèi)部數(shù)據(jù)的存儲(chǔ)細(xì)節(jié),向外提供統(tǒng)一的接口模型
- BroadCast Receiver:廣播坤塞,接收一種或者多種 Intent 作觸發(fā)事件冯勉,接受相關(guān)消息,做一些簡(jiǎn)單處理摹芙,轉(zhuǎn)換成一條 Notification灼狰,統(tǒng)一了Android的事件廣播模型
- Android中常用的五種布局
- FrameLayout:框架布局,所有東西依次都放在左上角浮禾,會(huì)重疊
- LinearLayout:線性布局交胚,可垂直和水平布局
- AbsoluteLayout:絕對(duì)布局,絕對(duì)布局用X,Y坐標(biāo)來(lái)指定元素的位置
- RelativeLayout:相對(duì)布局盈电,按參照物布局
- TableLayout:表格布局蝴簇,每一個(gè)TableLayout里面有表格行TableRow
- Activity 生命周期
Fragment 生命周期
Service 如何使用?生命周期匆帚?
- 如何使用:
* 繼承熬词。 XXService extends Service
* 配置。在 AndroidManifest 文件中的<application>節(jié)點(diǎn)里對(duì) XXService 進(jìn)行配置
* 啟動(dòng)。Context.startService() 或者 Context.bindService()
-
生命周期:
- startService():生命周期直至stopService互拾;如果調(diào)用startService() 方法前服務(wù)已經(jīng)被創(chuàng)建歪今,多次調(diào)用startService() 方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù),但會(huì)導(dǎo)致多次調(diào)用 onStart() 方法
- bindService():生命周期直至unbindService()颜矿;調(diào)用者退出時(shí)會(huì)自動(dòng)調(diào)用unbindService()寄猩;如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說(shuō)onCreate()和onBind()方法并不會(huì)被多次調(diào)用)
BroadCast Receiver 注冊(cè)方式或衡、不同之處
- 注冊(cè)方式:XXXReceiver extends BroadcastReceiver
* 第一種:全局廣播:AndroidManifest 中注冊(cè)
<receive android:name=".XXXReceiver " >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
* 第二種:局部廣播:代碼注冊(cè)
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
XXXReceiver receiver = new XXXReceiver();
registerReceiver(receiver, filter);
-
優(yōu)缺點(diǎn)
- 第一種:全局有效
- 第二種:局部有效
-
Activity啟動(dòng)模式
可以通過(guò)AndroidManifest.xml中的android:launchMode屬性設(shè)置
- standard:默認(rèn)模式焦影。在這個(gè)模式下,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例封断。
singleTop:可以多個(gè)示例斯辰。如果Activity在棧頂?shù)臅r(shí)候,啟動(dòng)相同的Activity坡疼,不會(huì)創(chuàng)建新的實(shí)例彬呻,而會(huì)調(diào)用其onNewIntent方法。
singleTask:只有一個(gè)實(shí)例柄瑰。在同一個(gè)應(yīng)用程序中啟動(dòng)他的時(shí)候闸氮,若Activity不存在,則會(huì)在當(dāng)前task創(chuàng)建一個(gè)新的實(shí)例教沾,若存在蒲跨,則會(huì)把task中在其之上的其它Activity destory掉并調(diào)用它的onNewIntent方法。
singleInstance:只有一個(gè)實(shí)例授翻。并且這個(gè)實(shí)例獨(dú)立運(yùn)行在一個(gè)task中或悲,這個(gè)task只有這個(gè)實(shí)例,不允許有別的Activity存在堪唐。
- 橫豎屏切換時(shí)候Activity發(fā)生了什么巡语?
- 不設(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方法
- 如果后臺(tái)的Activity由于某原因被系統(tǒng)回收了糠爬,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?
- 保存:重寫onSaveInstanceState()方法举庶,在此方法中保存需要保存的數(shù)據(jù),該方法將會(huì)在activity被回收之前調(diào)用
- 獲瓤铡:通過(guò)重寫onRestoreInstanceState()方法可以從中提取保存好的數(shù)據(jù)
- Android 的數(shù)據(jù)存儲(chǔ)方式
使用 SharedPreferences 存儲(chǔ)數(shù)據(jù)户侥、文件存儲(chǔ)數(shù)據(jù)镀琉、SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)、使用 ContentProvider 存儲(chǔ)數(shù)據(jù)蕊唐、網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù)
SharedPreferences 存放目錄:/data/data/Package Name/Shared_Pref屋摔。以鍵值對(duì)形式存儲(chǔ)簡(jiǎn)單配置信息
文件存儲(chǔ)目錄:/data/data/Package Name/files。 I / O 讀寫
SQLite存儲(chǔ)目錄:/data/data/Package Name/database
CP:向其它應(yīng)用共享數(shù)據(jù)替梨,基于Uri
網(wǎng)絡(luò)存儲(chǔ):post钓试,get請(qǐng)求同步數(shù)據(jù)
Android 中的動(dòng)畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么
兩種副瀑,一種是 Tween 動(dòng)畫弓熏、還有一種是 Frame 動(dòng)畫
- Tween 動(dòng)畫:這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)、放大糠睡、縮小以及產(chǎn)生透明度的變化
- Frame 動(dòng)畫:傳統(tǒng)的動(dòng)畫方法挽鞠,通過(guò)順序的播放排列好的圖片來(lái)實(shí)現(xiàn),類似電影
Android 進(jìn)階
- 單線程模型中 Message狈孔、Handler信认、Message Queue、Looper 之間的關(guān)系
簡(jiǎn)單的說(shuō)均抽,Handler 獲取當(dāng)前線程中的 Looper 對(duì)象嫁赏,Looper 用來(lái)從存放 Message 的 MessageQueue 中取出 Message,交由 Handler 進(jìn)行 Message 的分發(fā)和處理
- Handler 獲取當(dāng)前線程中的 Looper 對(duì)象油挥,調(diào)用 Looper.prepare() 方法
- Handler sendMessage() 到 MessageQueue
- Handler 調(diào)用 Looper.loop()不斷遍歷 Message Queue潦蝇,取出Message
- Handler 回調(diào) handleMessage() 處理這個(gè)Message
- Handler 處理完該 Message 后,Looper 則設(shè)置該 Message 為NULL喘漏,以便回
![Uploading MVC 模式_824399.png . . .]
收 - 備注:當(dāng) Handler 對(duì)象的構(gòu)造函數(shù)的參數(shù)為空护蝶,則為當(dāng)前所在線程的 Looper; Looper.getMainLooper() 得到的是主線程的 Looper 對(duì)象翩迈,Looper.myLooper() 得到的是當(dāng)前線程的 Looper 對(duì)象
- Activity 是如何生成一個(gè) view 的持灰?
- Activity在attch方法的時(shí)候,會(huì)創(chuàng)建一個(gè)phonewindow(window的子類)
onCreate中的setContentView方法负饲,會(huì)創(chuàng)建DecorView
DecorView 的 addview() 方法堤魁,會(huì)把 layout 中的布局加載進(jìn)來(lái)
Android 中如何捕獲未捕獲的異常
- 關(guān)鍵是實(shí)現(xiàn)Thread.UncaughtExceptionHandler
- MVC、MVP返十、MVVM差異
- MVC(環(huán)形通信)
MVC 是 Model妥泉,View,Controller的縮寫洞坑,MVC包含三個(gè)部分
- M:數(shù)據(jù)加工盲链,耗時(shí)操作、網(wǎng)絡(luò)操作等,eg:util
- V:用戶界面刽沾,接收用戶的輸入本慕,顯示處理結(jié)果,eg:xml
- C:橋梁作用侧漓,接收V層數(shù)據(jù)锅尘,交由M層處理,eg:activity
![MVC 模式](http://upload-images.jianshu.io/upload_images/3688153-44f8efc13bb57971.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/800)
-
MVP(雙向通信)
- View 與 Model 不發(fā)生聯(lián)系布蔗,都通過(guò) Presenter 傳遞
- View 非常薄藤违,不部署任何業(yè)務(wù)邏輯,稱為”被動(dòng)視圖”(Passive View)纵揍,即沒(méi)有任何主動(dòng)性顿乒,而 Presenter非常厚,所有邏輯都部署在那里
-
MVVM
- 基本上與 MVP 模式完全一致
-
唯一的區(qū)別是骡男,它采用雙向綁定:View的變動(dòng)淆游,自動(dòng)反映在 ViewModel,反之亦然
- 什么是ANR隔盛,產(chǎn)生原因犹菱,如何避免?
- AIDL的全稱是什么吮炕?如何工作腊脱?
全稱是:Android Interface Define Language
在Android中, 每個(gè)應(yīng)用程序都可以有自己的進(jìn)程. 在寫UI應(yīng)用的時(shí)候, 經(jīng)常要用到Service. 在不同的進(jìn)程中, 怎樣傳遞對(duì)象呢? 顯然, Java中不允許跨進(jìn)程內(nèi)存共享.
因此傳遞對(duì)象, 只能把對(duì)象拆分成操作系統(tǒng)能理解的簡(jiǎn)單形式, 以達(dá)到跨界對(duì)象訪問(wèn)的目的. 在J2EE中,采用RMI的方式, 可以通過(guò)序列化傳遞對(duì)象. 在Android中, 則
采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實(shí)際上做起來(lái)卻比較麻煩。
AIDL(AndRoid接口描述語(yǔ)言)是一種借口描述語(yǔ)言; 編譯器可以通過(guò)aidl文件生成一段代碼龙亲,通過(guò)預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要
在一個(gè)Activity中, 訪問(wèn)另一個(gè)Service中的某個(gè)對(duì)象, 需要先將對(duì)象轉(zhuǎn)化成AIDL可識(shí)別的參數(shù)(可能是多個(gè)參數(shù)), 然后使用AIDL來(lái)傳遞這些參數(shù), 在消息的接收端, 使用
這些參數(shù)組裝成自己需要的對(duì)象.AIDL的IPC的機(jī)制和COM或CORBA類似, 是基于接口的陕凹,但它是輕量級(jí)的。它使用代理類在客戶端和實(shí)現(xiàn)層間傳遞值. 如果要使用AIDL,
需要完成2件事情: 1. 引入AIDL的相關(guān)類.; 2. 調(diào)用aidl產(chǎn)生的class.
AIDL的創(chuàng)建方法:
AIDL語(yǔ)法很簡(jiǎn)單,可以用來(lái)聲明一個(gè)帶一個(gè)或多個(gè)方法的接口鳄炉,也可以傳遞參數(shù)和返回值杜耙。 由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.
下面是些AIDL支持的數(shù)據(jù)類型:
1.不需要import聲明的簡(jiǎn)單Java編程語(yǔ)言類型(int,boolean等)
2.String, CharSequence不需要特殊聲明
3.List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡(jiǎn)單數(shù)據(jù)類型, String等其他比支持的類型.
- NDK 是什么
NDK是一些列工具的集合,NDK提供了一系列的工具拂盯,幫助開發(fā)者迅速的開發(fā)C/C++的動(dòng)態(tài)庫(kù)佑女,并能自動(dòng)將so和java 應(yīng)用打成apk包。
NDK集成了交叉編譯器谈竿,并提供了相應(yīng)的mk文件和隔離cpu团驱、平臺(tái)等的差異,開發(fā)人員只需簡(jiǎn)單的修改mk文件就可以創(chuàng)建出so
- 持續(xù)更新中空凸。嚎花。