Android的四大組件是哪個(gè),他們的作用鞍泉?
Activity是Android程序與用戶交互的窗口匈织,是Android構(gòu)造塊中最基本的一種贿衍,他需要保持各界面的狀態(tài)授舟,做很多持久化的事情,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯贸辈。
Service:后臺(tái)服務(wù)于Activity释树,封裝一個(gè)完整的功能邏輯實(shí)現(xiàn),接受上層指令擎淤,完成相關(guān)的事物
ContentProvider:是Android提供的第三方應(yīng)用數(shù)據(jù)的訪問文案奢啥,可以派生ContentProvider類,對(duì)外提供數(shù)據(jù)嘴拢,可以像數(shù)據(jù)庫一樣進(jìn)行選擇排序桩盲,屏蔽內(nèi)部數(shù)據(jù)的存儲(chǔ)細(xì)節(jié),向外提供了統(tǒng)一的接口模型席吴,大大簡化上層應(yīng)用赌结,對(duì)數(shù)據(jù)整合提供了更方便的途徑
BroadCast Receiver:接受一種或者多種Intent作觸發(fā)事件,接受相關(guān)消息孝冒,做一些簡單處理柬姚,轉(zhuǎn)換成一條Notification,統(tǒng)一了Android的事件廣播模型
簡述Androd常用的五種布局
線性布局 ?相對(duì)布局 ?表格布局 ? 絕對(duì)布局 ?針布局
Android常用的動(dòng)畫有哪幾種庄涡?他們的作用與區(qū)別量承?
補(bǔ)間動(dòng)畫相當(dāng)于視圖動(dòng)畫:只是視覺上的一個(gè)效果,實(shí)際View屬性沒有變化穴店,性能好撕捍,但是支持方式少
屬性動(dòng)畫:通過變化的屬性來打到動(dòng)畫的效果,性能略差泣洞,支持點(diǎn)擊等事件
幀動(dòng)畫:通過drawable一幀幀畫處理的
Gif動(dòng)畫:原理同上忧风,canvas畫出來
ListView的優(yōu)化布局
1)、對(duì)convetView進(jìn)行判空球凰,是當(dāng)convertView不為空的時(shí)候直接重新使用convertView從而減少了很多不必要的View的創(chuàng)建
2)阀蒂、定義一個(gè)ViewHolder该窗,將convetView的tag設(shè)置為ViewHolder,不為空時(shí)重新使用即可
3)、當(dāng)ListView加載數(shù)據(jù)量較大時(shí)可以采用分頁加載和圖片異步加載
Android的存儲(chǔ)方式有哪些蚤霞?
1)SharedPreferences ??存儲(chǔ)路徑:(data/data/packagename/shares_prefs), 輕量級(jí)存儲(chǔ),以鍵值對(duì)的形式存儲(chǔ)在xml中,一般用來保存應(yīng)用中的設(shè)置屬性????
2)文件存儲(chǔ) ???????????SD卡存儲(chǔ)多媒體文件, 文件緩存???
?3) Sqlite數(shù)據(jù)庫 ???????存儲(chǔ)路徑:(data/data/packagename/databases), 一種嵌入式數(shù)據(jù)庫,支持sql語言,存儲(chǔ)大量結(jié)構(gòu)性數(shù)據(jù)???
?4)ContentProvider ?進(jìn)程(應(yīng)用程序)間數(shù)據(jù)共享,數(shù)據(jù)源可以是sqlite,也可以是xml,相關(guān)類: ContentResolver(內(nèi)容解析器), ContentObserver(數(shù)據(jù) ???????????????????????觀察者)??
??5) 網(wǎng)絡(luò)存儲(chǔ) ???天氣數(shù)據(jù)的xml,json格式等等,通過HttpUrlConnection,HttpClient,或者SOAP協(xié)議獲取數(shù)據(jù)
Android的啟動(dòng)模式有哪些?
standard模式 ? 义钉、singTop模式 昧绣、singTask模式 、singleInstance模式
Activity在屏幕旋轉(zhuǎn)時(shí)的生命周期捶闸?
-不同條件下夜畴,旋轉(zhuǎn)屏幕時(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í)亿虽,切屏?xí)匦抡{(diào)用各個(gè)生命周期菱涤,切橫、豎屏?xí)r都只會(huì)執(zhí)行一次洛勉;
設(shè)置Activity的android:configChanges=”orientation|keyboardHidden|screenSize”時(shí)粘秆,切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法收毫。
需注意的是攻走,在4.0以后的版本需要加上ScreenSize 不然不會(huì)執(zhí)行onConfigurationChanged方法
執(zhí)行順序:onCreate、 onStart 此再、onResume昔搂、 ?
onConfigurationChanged
詳解地址(https://blog.csdn.net/qq_16064871/article/details/46480525)
注冊(cè)廣播有幾種方式,這些方式有何優(yōu)缺點(diǎn)引润,請(qǐng)談?wù)凙ndroidr引入廣播機(jī)制的用意
? ? 1)第一種不是常駐型廣播巩趁,也就是說廣播跟隨程序的生命周期。
???? 2)第二種是常駐型淳附,也就是說當(dāng)應(yīng)用程序關(guān)閉后议慰,如果有信息廣播來,程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行奴曙。
請(qǐng)解釋下在單線程模型中别凹,Message Handler ?MessageQUeue Looper
handler獲取當(dāng)前線程中的looper對(duì)象,looper用來存放Message的MessageQueue中取得Message,再有android進(jìn)行Message的分發(fā)和處理
MessageQueue(消息隊(duì)列) 用來存放通過handler發(fā)送過來的消息洽糟,通常附屬于某一個(gè)創(chuàng)建他的線程炉菲,可以通過Looper.myQueue()得到當(dāng)前線程的消息隊(duì)列
Hanlder 可以發(fā)布或者處理一個(gè)消息或者操作一個(gè)Runnable,通過Handler發(fā)送消息堕战,消息將只會(huì)發(fā)送到與他消息隊(duì)列,只能處理該消息隊(duì)列中的消息
Looper 是Handler和消息隊(duì)列之間通信橋梁拍霜,程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放入隊(duì)列嘱丢。Looper也把消息隊(duì)列里的消息廣播給所有的Handler
Message:消息的類型,在Handler類中的handleMessage方法中得到單個(gè)的消息進(jìn)行處理祠饺。在單線程模型下越驻,為了線程通信問題,Android設(shè)計(jì)了一個(gè)Message Queue(消息隊(duì)列)道偷, 線程間可以通過該Message Queue并結(jié)合Handler和Looper組件進(jìn)行信息交換缀旁。
Service和Thread的區(qū)別?
Thread:是程序執(zhí)行的最小單位勺鸦,他分配CPU的基本單位并巍。可以用Thread執(zhí)行異步操作
Serviece:是四大組件之一是android的一種機(jī)制换途,當(dāng)他運(yùn)行的時(shí)候如果是Local Service,那么對(duì)應(yīng)的Service是運(yùn)行在主線程main線程上
高級(jí):
1懊渡。如何對(duì)Android程序進(jìn)行性能分析?
Android性能主要之響應(yīng)速度和UI刷新速度
首先從函數(shù)的耗時(shí)來說怀跛,
2距贷。什么情況下會(huì)導(dǎo)致內(nèi)存溢出?
一吻谋,大量位圖的加載
二忠蝗, Bitmap對(duì)象不在使用時(shí)調(diào)用recycle()釋放內(nèi)存
三, 查詢數(shù)據(jù)庫沒有關(guān)閉游標(biāo)
四漓拾,構(gòu)造Adapter時(shí)阁最,沒有使用緩存的 convertView
3。如何避免OOM異常骇两?
首先OOM是什么速种?
當(dāng)程序需要申請(qǐng)一段“大”內(nèi)存,但是虛擬機(jī)沒有辦法及時(shí)的給到低千,即使做了GC操作以后
這就會(huì)拋出 OutOfMemoryException 也就是OOM
Android的OOM怎么樣配阵?
為了減少單個(gè)APP對(duì)整個(gè)系統(tǒng)的影響,android為每個(gè)app設(shè)置了一個(gè)內(nèi)存上限示血。
如何避免OOM?
減少內(nèi)存對(duì)象的占用
I.ArrayMap/SparseArray代替hashmap
II.避免在android里面使用Enum
III.減少bitmap的內(nèi)存占用
inSampleSize:縮放比例棋傍,在把圖片載入內(nèi)存之前,我們需要先計(jì)算出一個(gè)合適的縮放比例难审,避免不必要的大圖載入瘫拣。
decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8告喊,存在很大差異麸拄。
IV.減少資源圖片的大小派昧,過大的圖片可以考慮分段加載
內(nèi)存對(duì)象的重復(fù)利用
大多數(shù)對(duì)象的復(fù)用,都是利用對(duì)象池的技術(shù)拢切。
I.listview/gridview/recycleview contentview的復(fù)用
II.inBitmap 屬性對(duì)于內(nèi)存對(duì)象的復(fù)用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
這個(gè)方法在某些條件下非常有用蒂萎,比如要加載上千張圖片的時(shí)候。
III.避免在ondraw方法里面 new對(duì)象
IV.StringBuilder 代替+
4淮椰。Anroid如何捕獲未捕獲的異常岖是?
關(guān)鍵是實(shí)現(xiàn)Thread.UncaughtExceptionHandler
然后是在application的onCreate里面注冊(cè)
5。ANR是什么实苞?怎么避免和避免ANR?
ANR------(Application Not Responding)
應(yīng)用程序無響應(yīng)(也就是在規(guī)定的時(shí)間內(nèi),沒有響應(yīng))
ANR一般有三種類型:
1). KeyDispatchTimeout(5 seconds) --主要類型按鍵或觸摸事件在特定時(shí)間內(nèi)無響應(yīng)2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定時(shí)間內(nèi)無法處理完成3). ServiceTimeout(20 seconds) --小概率類型 Service在特定的時(shí)間內(nèi)無法處理完成為
為什么會(huì)超時(shí):事件沒有機(jī)會(huì)處理 & 事件處理超時(shí)
怎么避免ANR:ANR的關(guān)鍵是處理超時(shí)烈疚,所以應(yīng)該避免在UI線程黔牵,BroadcastReceiver 還有service主線程中,處理復(fù)雜的邏輯和計(jì)算而交給work thread操作爷肝。
1)避免在activity里面做耗時(shí)操作猾浦,oncreate & onresume
2)避免在onReceiver里面做過多操作
3)避免在Intent Receiver里啟動(dòng)一個(gè)Activity,因?yàn)樗鼤?huì)創(chuàng)建一個(gè)新的畫面灯抛,并從當(dāng)前用戶正在運(yùn)行的程序上搶奪焦點(diǎn)金赦。
4)盡量使用handler來處理UI thread & workthread的交互。
6对嚼。Android線程通信有哪幾種方式夹抗?
1。Handler機(jī)制
2纵竖。runOnUiThread方法
3漠烧。View.post(Runnable r)?
4。AsyncTask
7.Devik進(jìn)程Linux進(jìn)程線程的區(qū)別
Dalvik進(jìn)程
每個(gè)android app都會(huì)獨(dú)立占用一個(gè)dvm虛擬機(jī)靡砌,運(yùn)行在Linux系統(tǒng)中已脓,所以Dalvik進(jìn)程和Linux進(jìn)行是可以理解為同一個(gè)概念
8.描述下Android的系統(tǒng)架構(gòu)
應(yīng)用層 應(yīng)用框架層 liunx內(nèi)核層 系統(tǒng)運(yùn)行層
9。android應(yīng)用對(duì)內(nèi)存是如何限制的通殃?我們應(yīng)用如何合理使用內(nèi)存
activitymanager.getMemoryClass()獲取內(nèi)存限制
減少內(nèi)存對(duì)象的占用度液、內(nèi)存對(duì)象的重復(fù)利用
10。Handler機(jī)制
一個(gè)Handler允許你發(fā)送和處理Message和Runable對(duì)象画舌,每個(gè)線程都有自己的Looper堕担,每個(gè)Looper中封裝著MessageQueue。Looper負(fù)責(zé)不斷的從自己的消息隊(duì)列里取出隊(duì)頭的任務(wù)或消息執(zhí)行骗炉。每個(gè)handler也和線程關(guān)聯(lián)照宝,Handler負(fù)責(zé)把Message和Runable對(duì)象傳遞給MessageQueue(用到post ,sendMessage等方法)句葵,而且在這些對(duì)象離開MessageQueue時(shí)厕鹃,Handler負(fù)責(zé)執(zhí)行他們(用到handleMessage方法)兢仰。 其中Message類就是定義了一個(gè)信息,這個(gè)信息中包含一個(gè)描述符和任意的數(shù)據(jù)對(duì)象剂碴,這個(gè)信息被用來傳遞給Handler.Message對(duì)象提供額外的兩個(gè)int域和一個(gè)Object域把将。默認(rèn)情況下一個(gè)線程是不存在消息循環(huán)(message loop)的,需要調(diào)用Looper.prepare()來給線程創(chuàng)建一個(gè)消息循環(huán)忆矛,調(diào)用Looper.loop()來使消息循環(huán)起作用察蹲,從消息隊(duì)列里取消息,處理消息催训。調(diào)用Looper.loop()之后循環(huán)已經(jīng)開始洽议,下一個(gè)由handler發(fā)的message將會(huì)被這個(gè)handler的handleMessage方法處理,這是一個(gè)----循環(huán)漫拭。
11亚兄。事件分發(fā)機(jī)制
事假的分發(fā)過程由三個(gè)很重要的方法來共同完成的:
dispatchTouchEvent 、onInterceptTouchEvent 和onTouchEvent
(事件梳理地址: https://blog.csdn.net/android_zyf/article/details/60466323)
12采驻。開發(fā)中使用過哪些框架审胚,平臺(tái)
? 百度地圖 ?、 ??Volley 礼旅、 ? fastjson膳叨、? ?picciso、 ?友盟痘系、? ?zxing菲嘴、? ?Gson、?EventBus 時(shí)間分發(fā)機(jī)制碎浇,由handler實(shí)現(xiàn)临谱,線程間通信、Xutils
13奴璃。請(qǐng)說下Http請(qǐng)求的基本過程
1悉默。連接 ? 建立一個(gè)socket連接
2。請(qǐng)求 ?連接成功之后苟穆,開始先webView服務(wù)器發(fā)送請(qǐng)求這個(gè)請(qǐng)求是get與post
3抄课。應(yīng)答 ?webView服務(wù)器接收到請(qǐng)求,進(jìn)行處理
4雳旅。關(guān)閉連接 ?當(dāng)應(yīng)答結(jié)束后跟磨,web瀏覽器與web服務(wù)器必須斷開
14。屏幕適配
屏幕適配的方式:xxxdpi, wrap_content,match_parent獲取屏幕大小來處理
dp是適配屏幕的 sp來確定字體的大小
drawable-xxdpi攒盈,values-1280*1920等 這些都是適配的資源
warp_content,match_parent ,這些是view的自定義
weight 這是權(quán)重的適配
面試題
https://blog.csdn.net/liu852298068/article/details/52793586
https://www.cnblogs.com/android-blogs/p/6650298.html