1.java中equals和==的區(qū)別
基本數(shù)據(jù)類型==比較的是值,非基本數(shù)據(jù)類型==比較的是內(nèi)存地址
equals比較的是內(nèi)存地址
2.String边坤、StringBuffer茧痒、StringBuilder的區(qū)別(運(yùn)行速度:StringBuilder>StringBuffer>String)
String:字符串常量, 每次修改都相當(dāng)于生成一個(gè)新的對象殿较,所以不適合經(jīng)常變更值的場景
StringBuffer:字符串變量劳闹,線程安全適用于多線程
StringBuilder:字符串變量业汰,線程不安全適用于單線程样漆,效率略快于StringBuffer
速度上面String不斷的復(fù)制和更改是創(chuàng)建不同的對象來進(jìn)行操作放祟,這里涉及到GC垃圾回收機(jī)制跪妥,會(huì)影響速度;而StringBuffer和StringBuilder則處理同一個(gè)對象不存在JVM的GC回收落塑。
線程安全與否:如果一個(gè)StringBuffer對象在字符串緩沖區(qū)被多個(gè)線程使用時(shí)憾赁,StringBuffer中很多方法可以帶有synchronized關(guān)鍵字膘壶,所以可以保證線程是安全的洲愤,但StringBuilder的方法則沒有該關(guān)鍵字柬赐,所以不能保證線程安全肛宋,不能同步的問題酝陈。所以如果要進(jìn)行的操作是多線程的沉帮,那么就要使用StringBuffer待牵,但是在單線程的情況下缨该,還是建議使用速度比較快的StringBuilder贰拿。
3.java8新特性有哪些壮不?
Lamabda表達(dá)式
接口的默認(rèn)方法和靜態(tài)方法
重復(fù)注解
方法引用
更好的類型推斷
拓寬注解的應(yīng)用場景
訪問局部變量
Filter過濾
Stream接口
sort排序
Map映射
DataApi等等
4.說說你對JVM的理解
5.Handler機(jī)制的原理與RXJava有什么區(qū)別?
當(dāng)時(shí)問到我的時(shí)候我還真不知道怎么回答癌椿,我只知道相同點(diǎn):都是為了線程間通信缩功。
區(qū)別:
1.RxJava線程切換更方便(直接可以切換子線程和UI線程)嫡锌,Handler需要在子線程去發(fā)送消息势木,在主線程去接受消息然后才能改變UI啦桌。
2.RxJava是觀察者模式,Handler是消息隊(duì)列用的是雙向鏈表验烧。
6.廣播有幾種創(chuàng)建方式若治,有什么區(qū)別?
兩種菌仁,動(dòng)態(tài)創(chuàng)建和靜態(tài)創(chuàng)建(Android8.0以后不能靜態(tài)注冊廣播,官方說法是為了省電),區(qū)別:
1.動(dòng)態(tài)注冊的廣播永遠(yuǎn)要快于靜態(tài)注冊的廣播,不管靜態(tài)注冊的優(yōu)先級(jí)設(shè)置的多高,不管動(dòng)態(tài)注冊的優(yōu)先級(jí)有多低洽蛀。
2.動(dòng)態(tài)注冊廣播不是常駐型廣播 ,也就是說廣播跟隨activity的生命周期郊供。注意: 在activity調(diào)用ondestory(),移除廣播接收器驮审。靜態(tài)注冊是常駐型 (不能自動(dòng)銷毀),也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行地来。
3.在同一個(gè)優(yōu)先級(jí)下,誰先啟動(dòng)的快,誰將先接收到廣播未斑。
7.Android的數(shù)據(jù)存儲(chǔ)方式有哪些蜡秽?
1.Sharedpreferences(適合輕量級(jí)數(shù)據(jù)存儲(chǔ),采用XML鍵值對的形式存儲(chǔ)到本地费就,只能運(yùn)用于一個(gè)App內(nèi))
2.文件存儲(chǔ)
3.SQLite數(shù)據(jù)庫存儲(chǔ)
4.ContentProvider
5.網(wǎng)絡(luò)存儲(chǔ)
8.服務(wù)的啟動(dòng)方式和對應(yīng)的生命周期以及區(qū)別?
1.startService(onCreate-onStartCommand-onDestory)
服務(wù)與啟動(dòng)者沒有必然聯(lián)系,啟動(dòng)者銷毀斗躏,服務(wù)也可以存在笛臣;除非主動(dòng)調(diào)用StopService方法來停止服務(wù)静陈。
2.bindService(onCreate-onBind-onUnbind-onDestory)
服務(wù)與啟動(dòng)者相互關(guān)聯(lián)鲸拥,啟動(dòng)者銷毀刑赶,那么服務(wù)也會(huì)跟著銷毀;比如activityA中bind服務(wù)谒所,然后activityB中也在使用該服務(wù),一旦activityA銷毀那么服務(wù)也會(huì)銷毀沛申,這個(gè)時(shí)候activityB中服務(wù)也就沒用了劣领,除非再bind一次。
3.startService之后再bindService這樣避免宿主死亡之后service跟著被銷毀铁材。
9.線程間通信有哪些方式尖淘?
接口
Handler
觀察者模式(EventBus)
Android使用RunonUiThread可以切換到主線程
AsyncTask
BroadCast
SharedPreferences
10.進(jìn)程間通信有哪些方式?
Intent著觉,訪問其他程序的Activity或者調(diào)用系統(tǒng)電話村生、短信
Content Provider趁桃,多個(gè)App共享數(shù)據(jù)
AIDL(Android Interface Define Language)服務(wù)蟀苛,客戶端定義接口暴露給服務(wù)端使用
BroadCast
Socket
11.描述一下ANR錯(cuò)誤裆甩,哪些情況會(huì)發(fā)生抛腕,如何避免全封?
activity 按鍵或觸摸事件在5s無響應(yīng)土匀,broadcastreceiver 10s內(nèi)無法做出回應(yīng)解愤,service20s內(nèi)無法處理完成哼鬓;都會(huì)導(dǎo)致應(yīng)用無響應(yīng)宠互。(在主線程做耗時(shí)操作都會(huì)導(dǎo)致ANR)券册。
避免:
1.不要在主線程做耗時(shí)操作(數(shù)據(jù)庫查詢,網(wǎng)絡(luò)操作,大量數(shù)據(jù)存儲(chǔ)是掰,圖片的切割等)媒楼。
2.不要在廣播內(nèi)做耗時(shí)操作,如果非要,那么請通過Service新起線程來進(jìn)行耗時(shí)操作。
12.橫豎屏切換activity生命周期?
1、AndroidManifest.xml不設(shè)置Activity的android:configChanges時(shí)褥赊,切屏?xí)匦抡{(diào)用各個(gè)生命周期榆俺,
切橫屏?xí)r會(huì)執(zhí)行一次烁涌,切豎屏?xí)r會(huì)執(zhí)行兩次谋币。生命周期如下:
onSaveInstanceState-onPause-onStop-onDestory-onCreate-onStart-onRestoreInstanceState-onResume
2秤涩、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)
用各個(gè)生命周期垫毙,切橫、豎屏?xí)r只會(huì)執(zhí)行一次缸逃。生命周期如下:
onSaveInstanceState-onPause-onStop-onDestory-onCreate-onStart-onRestoreInstanceState-onResume
3蹂风、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),
切屏不會(huì)重新調(diào)用各個(gè)生命周期铜跑,只會(huì)執(zhí)行onConfigurationChanged方法烙懦。
13.你對設(shè)計(jì)模式的理解尘执,簡單說幾種图仓?
一共23種劫窒,隨便說幾種就行孕索,然后一般會(huì)問一些互相之間的區(qū)別啊选脊,使用它們的好處之類的钝的。
Builder模式(方便維護(hù),使用者可以不用清楚內(nèi)部構(gòu)成情況就能直接調(diào)用方法躺同;比如系統(tǒng)彈窗)
觀察者模式(被觀察者與觀察者,只要有訂閱關(guān)系埋同,當(dāng)被觀察者發(fā)生改變時(shí)州叠,就能通知觀察者們;比如Event )
單例模式(一個(gè)進(jìn)程/項(xiàng)目中只存在1個(gè)實(shí)例凶赁,為了節(jié)約內(nèi)存資源)
工廠模式
14.Android動(dòng)畫有幾類咧栗,它們的特點(diǎn)和區(qū)別是什么逆甜?
Android3.0之前2種動(dòng)畫,3.0之后3種動(dòng)畫
幀動(dòng)畫(Frame Animation):類似于一幀幀圖片組成的電影致板,xml中多張圖片組成交煞,在UI線程中播放這個(gè)xml形成的動(dòng)畫。
補(bǔ)間動(dòng)畫(Tweened Animation):補(bǔ)間動(dòng)畫分為四種形式斟或,分別是 alpha(淡入淡出)素征,translate(位移),scale(縮放大新芗贰)御毅,rotate(旋轉(zhuǎn))。補(bǔ)間動(dòng)畫的實(shí)現(xiàn)怜珍,一般會(huì)采用xml 文件的形式端蛆;當(dāng)然也可以用Java代碼直接實(shí)現(xiàn)。
屬性動(dòng)畫(Property Animation):這是3.0之后加入的動(dòng)畫酥泛,為了彌補(bǔ)前面兩種動(dòng)畫的不足今豆。屬性動(dòng)畫可以實(shí)現(xiàn)很多數(shù)學(xué)函數(shù)的路徑動(dòng)畫。屬性動(dòng)畫的運(yùn)行機(jī)制是通過不斷地對值進(jìn)行操作來實(shí)現(xiàn)的揭璃,而初始值和結(jié)束值之間的動(dòng)畫過渡就是由ValueAnimator這個(gè)類來負(fù)責(zé)計(jì)算的晚凿。它的內(nèi)部使用一種時(shí)間循環(huán)的機(jī)制來計(jì)算值與值之間的動(dòng)畫過渡,我們只需要將初始值和結(jié)束值提供給ValueAnimator瘦馍,并且告訴它動(dòng)畫所需運(yùn)行的時(shí)長,那么ValueAnimator就會(huì)自動(dòng)幫我們完成從初始值平滑地過渡到結(jié)束值這樣的效果应役。除此之外情组,ValueAnimator還負(fù)責(zé)管理動(dòng)畫的播放次數(shù)、播放模式箩祥、以及對動(dòng)畫設(shè)置監(jiān)聽器等院崇。
15.平時(shí)開發(fā)中設(shè)計(jì)到哪些性能優(yōu)化,你是從哪些地方來優(yōu)化袍祖,你是通過什么工具來分析的底瓣?
籠統(tǒng)的說:就是讓App反應(yīng)更快,使用更穩(wěn)蕉陋,流量捐凭、電量更省,apk更小凳鬓。
具體的說:省電優(yōu)化茁肠、內(nèi)存優(yōu)化、網(wǎng)絡(luò)優(yōu)化缩举、圖片優(yōu)化垦梆、UI優(yōu)化匹颤。
更快:使用時(shí)避免出現(xiàn)卡頓,響應(yīng)速度快托猩,減少用戶等待的時(shí)間印蓖,滿足用戶期望。
UI優(yōu)化:
分析工具:Systrace
(1)減少層級(jí)京腥,合理使用 RelativeLayout 和 LinerLayout赦肃,合理使用Merge,Include绞旅。
(2)提高顯示速度摆尝,使用 ViewStub,它是一個(gè)看不見的因悲、不占布局位置堕汞、占用資源非常小的視圖對象。
(3)布局復(fù)用晃琳,可以通過標(biāo)簽來提高復(fù)用讯检。
(4)盡可能少用wrap_content,wrap_content 會(huì)增加布局 measure 時(shí)計(jì)算成本卫旱,在已知寬高為固定值時(shí)人灼,不用wrap_content 。
(5)刪除控件中無用的屬性顾翼。
更穩(wěn):減低 Crash 率和 ANR 率投放,不要在用戶使用過程中崩潰和無響應(yīng)。
(1)增加相應(yīng)的判斷适贸,以及異常處理灸芳。
(2)避免在主線程做耗時(shí)操作。
更拾葑恕:節(jié)省流量和耗電烙样,節(jié)約內(nèi)存,減少用戶使用成本蕊肥,避免使用時(shí)導(dǎo)致手機(jī)發(fā)燙谒获。
耗電分析工具:Battery Historian
(1)避免浮點(diǎn)運(yùn)算。
(2)根據(jù)客戶端圖片的大小要求叫UI做相應(yīng)大小的圖提供給服務(wù)器壁却,避免過大消耗更多流量和電量批狱。
(3)不用的廣播,服務(wù)記得及時(shí)關(guān)閉儒洛。
內(nèi)存分析工具:Memory Monitor
(1)對象引用:強(qiáng)引用精耐、軟引用、弱引用琅锻、虛引用四種引用類型卦停,根據(jù)業(yè)務(wù)需求合理使用不同向胡,選擇不同的引用類型。
(2)減少不必要的內(nèi)存開銷:注意自動(dòng)裝箱惊完,增加內(nèi)存復(fù)用僵芹,比如有效利用系統(tǒng)自帶的資源、視圖復(fù)用小槐、對象池拇派、Bitmap對象的復(fù)用。
(3)使用最優(yōu)的數(shù)據(jù)類型:比如針對數(shù)據(jù)類容器結(jié)構(gòu)凿跳,可以使用ArrayMap數(shù)據(jù)結(jié)構(gòu)件豌,避免使用枚舉類型,使用緩存Lrucache等控嗜。
(4)圖片內(nèi)存優(yōu)化:點(diǎn)9圖減少圖片大小以及可以設(shè)置位圖規(guī)格茧彤,根據(jù)采樣因子做壓縮,用一些圖片緩存方式對圖片進(jìn)行管理等疆栏。
更性唷:安裝包小可以降低用戶的安裝成本。
(1)做混淆優(yōu)化代碼壁顶。
(2)刪除無用的代碼及圖片相應(yīng)的本地庫珠洗。
(3)Lint優(yōu)化。
(4)zip壓縮若专。
16.你對主件開發(fā)许蓖,模塊開發(fā)了解多少?模塊之間怎么進(jìn)行通訊调衰,數(shù)據(jù)傳輸蛔糯?
17.簡單描述一下你對Gradle的理解
Gradle理解點(diǎn)擊查看
18.MVC與MVP的區(qū)別?
MVC:Model(數(shù)據(jù)模型)窖式、View(視圖)、(Controller)控制器(activity或者fragment)动壤,View將操作反饋給Activity萝喘,Activitiy去獲取數(shù)據(jù),數(shù)據(jù)通過觀察者模式刷新給View琼懊。循環(huán)依賴
1.Activity(Fragment)重阁簸,很難單元測試。
2.View和Model耦合嚴(yán)重哼丈。
MVP:Model(模型層)启妹、View、Presenter(接口醉旦,Model和View交互的橋梁)饶米,View將操作給Presenter桨啃,Presenter去獲取數(shù)據(jù),數(shù)據(jù)獲取好了返回給Presenter檬输,Presenter去刷新View照瘾。PV,PM雙向依賴
1.如果功能復(fù)雜丧慈,Presenter接口爆炸(界面的操作更新UI都必須配合Presenter的接口來操作)析命。
2.Activity需要重寫很多接口方法來更新UI。
3.Model和View不直接進(jìn)行交互逃默,達(dá)到解耦效果鹃愤。
19.使用RXjava時(shí),你是如何對它進(jìn)行生命周期管理完域?
20.Lru算法的原理软吐?
LRU(Least Recently Used)最近最少使用,LRU使用的是LinkedHashMap筒主,如果鏈表中存在一個(gè)數(shù)則將其置頂关噪,如果沒有則直接在頂部加入這個(gè)數(shù)并將其底部的數(shù)移除。大致可以這樣理解乌妙,具體可以再搜索一下LRU算法使兔。
21.冒泡、選擇藤韵、快排有沒有相似之處虐沥?簡單說一下他們的原理?
冒泡:(原理看水桶里面的泡泡泽艘,從下到上冒泡欲险,每次確定一個(gè)最大的泡到最上面)
/** * 冒泡排序 從小到大 * 每次冒泡出相對最大的數(shù)到相對最后面
public static void bubbleSort(int[] data){
if(data == null) throw new IllegalArgumentException("data can't be null");
if(data.length<2) return;
//外層循環(huán)data.length-1次
for(int i=0 ;i<data.length-1;i++){
//內(nèi)層循環(huán)每次選擇一個(gè)最大的數(shù)冒泡到最后 循環(huán)次數(shù)每次都會(huì)少1次直到外層循環(huán)完畢data.length-i-1
for(int j=0 ; j<data.length-i-1;j++){
if(data[j]>data[j+1]){
int temp = data[j];
data[j] = data[j+1];
data[j+1]=temp; }
}
}
/*for(int i:data)
System.out.print(i+" ");*/
System.out.println(Arrays.toString(data)); }
選擇: (選擇第i個(gè)數(shù)依次與后面的數(shù)進(jìn)行比較得到相對最小的數(shù)來替換第i個(gè)數(shù))
/** * 選擇排序 從小到大 * 每次選出一個(gè)相對較小的排前面 */
public static void selectSort(int[] data){
if(data == null) throw new IllegalArgumentException("data can't be null");
if(data.length<2){return;}
//循環(huán)次數(shù)data.length-1
for(int i=0;i< data.length -1 ;i++){
int index = i;
//每次選擇第i個(gè)數(shù)依次和后面的數(shù)進(jìn)行比較,誰小誰變成第i個(gè)數(shù)匹涮;循環(huán)次數(shù)也是data.length-i-1
for(int j=i;j<data.length-1;j++){
if(data[index]>data[j]){
index = j;
}
}
if(i != index){
int temp = data[index];
data[index] = data[i];
data[i] = temp;
}
}
/*for(int i:data) System.out.print(i+" ");*/
System.out.println(Arrays.toString(data)); }
快排 :幾個(gè)字說不清楚天试,給個(gè)鏈接https://blog.csdn.net/crazy_rain/article/details/1572080
22.自定義View需要用到哪些方法,各自的作用然低?
onMeasure 測量喜每,onLayout 計(jì)算位置(布局),onDraw 繪制
具體推薦一篇博客:http://www.reibang.com/p/146e5cec4863
23.JVM和DVM有什么區(qū)別雳攘,以及ART垃圾回收機(jī)制带兜?
1.基于不同位置
Dalvik:基于寄存器,編譯和運(yùn)行都會(huì)快一些
JVM: 基于棧, 編譯和運(yùn)行都會(huì)慢些
2.字節(jié)碼的區(qū)別
Dalvik: 執(zhí)行.dex格式的字節(jié)碼吨灭,是對.class文件進(jìn)行壓縮后產(chǎn)生的,文件變小
JVM: 執(zhí)行.class格式的字節(jié)碼
3.運(yùn)行環(huán)境的區(qū)別
Dalvik : 一個(gè)應(yīng)用啟動(dòng)都運(yùn)行一個(gè)單獨(dú)的虛擬機(jī)運(yùn)行在一個(gè)單獨(dú)的進(jìn)程中
JVM: 只能運(yùn)行一個(gè)實(shí)例, 也就是所有應(yīng)用都運(yùn)行在同一個(gè)JVM中
但是在Android4.4引入了ART刚照,也是 Android 5.0 及更高版本的默認(rèn) Android 運(yùn)行時(shí)。目前google已經(jīng)不再維護(hù)和發(fā)布dalvik(DVM)喧兄。
1.ART GC 與 Dalvik 的主要區(qū)別在于 ART GC 引入了移動(dòng)垃圾回收器无畔。使用移動(dòng) GC 的目的在于通過堆壓縮來減少后臺(tái)應(yīng)用使用的內(nèi)存啊楚。目前,觸發(fā)堆壓縮的事件是 ActivityManager 進(jìn)程狀態(tài)的改變檩互。當(dāng)應(yīng)用轉(zhuǎn)到后臺(tái)運(yùn)行時(shí)特幔,它會(huì)通知 ART 已進(jìn)入不再“感知”卡頓的進(jìn)程狀態(tài)。此時(shí) ART 會(huì)進(jìn)行一些操作(例如闸昨,壓縮和監(jiān)視器壓縮)蚯斯,從而導(dǎo)致應(yīng)用線程長時(shí)間暫停。目前正在使用的兩個(gè)移動(dòng) GC 是同構(gòu)空間壓縮和半空間壓縮饵较。
2.與 Dalvik 相比拍嵌,暫停次數(shù)從 2 次減少到 1 次。Dalvik 的第一次暫停主要是為了進(jìn)行根標(biāo)記循诉,而這個(gè)動(dòng)作在 ART中已經(jīng)是讓線程自己去標(biāo)記横辆,然后馬上恢復(fù)運(yùn)行先改,這樣就減少了一次暫停缕棵。
3.與 Dalvik 類似,ART GC 在清除過程開始之前也會(huì)暫停 1 次整陌。兩者在這方面的主要差異在于:在此暫停期間划纽,某些 Dalvik 環(huán)節(jié)在 ART 中并發(fā)進(jìn)行脆侮。這些環(huán)節(jié)包括 java.lang.ref.Reference 處理、系統(tǒng)弱清除(例如勇劣,jni 弱全局等)靖避、重新標(biāo)記非線程根和卡片預(yù)清理。在 ART 暫停期間仍進(jìn)行的階段包括掃描臟卡片以及重新標(biāo)記線程根比默,這些操作有助于縮短暫停時(shí)間幻捏。
4.相對于 Dalvik,ART GC 改進(jìn)的最后一個(gè)方面是粘性 CMS 回收器增加了 GC 吞吐量命咐。不同于普通的分代 GC篡九,粘性 CMS 不移動(dòng)。系統(tǒng)會(huì)將年輕對象保存在一個(gè)分配堆棧(基本上是 java.lang.Object 數(shù)組)中醋奠,而非為其設(shè)置一個(gè)專屬區(qū)域瓮下。這樣可以避免移動(dòng)所需的對象以維持低暫停次數(shù),但缺點(diǎn)是容易在堆棧中加入大量復(fù)雜對象圖像而使堆棧變長
最后說一下回收機(jī)制:
- 先回收與其他Activity 或Service/Intent Receiver 無關(guān)的進(jìn)程(即優(yōu)先回收獨(dú)立的Activity)因此建議,我們的一些(耗時(shí))后臺(tái)操作钝域,最好是作成Service的形式
2.不可見(處于Stopped狀態(tài)的)Activity
3.Service進(jìn)程(除非真的沒有內(nèi)存可用時(shí)會(huì)被銷毀)
4.非活動(dòng)的可見的(Paused狀態(tài)的)Activity
5.當(dāng)前正在運(yùn)行(Active/Running狀態(tài)的)Activity
- OOA(面向?qū)ο蠓治觯OD(面向?qū)ο笤O(shè)計(jì))锭魔、OOP(面向?qū)ο笳Z言)基本原理
25.IntentService和Service有什么區(qū)別例证?
Service不是獨(dú)立的進(jìn)程,也不是獨(dú)立的線程迷捧,它是依賴于應(yīng)用程序的主線程(比喻成沒有界面的activity)织咧,也就是說胀葱,在更多時(shí)候不建議在Service中編寫耗時(shí)的邏輯和操作,否則會(huì)引起ANR笙蒙。
IntentService是Service的子類抵屿,IntentService在執(zhí)行onCreate操作的時(shí)候,內(nèi)部開了一個(gè)線程捅位,去你執(zhí)行你的耗時(shí)操作轧葛。通過Handler looper message的方式實(shí)現(xiàn)了一個(gè)多線程的操作,同時(shí)耗時(shí)操作也可以被這個(gè)線程管理和執(zhí)行艇搀,同時(shí)不會(huì)產(chǎn)生ANR的情況尿扯。
26.事件分發(fā)機(jī)制的原理(點(diǎn)擊上層如何傳遞給下層)?
http://www.reibang.com/p/e99b5e8bd67b
27.當(dāng)調(diào)用攝像機(jī)的時(shí)候怎么保存當(dāng)前activity的狀態(tài)焰雕?
為了防止在調(diào)用相機(jī)的時(shí)候衷笋,當(dāng)前activity被系統(tǒng)kill(比如內(nèi)存不夠時(shí),系統(tǒng)會(huì)自動(dòng)銷毀非可見的處于onPause或onStop狀態(tài)的activity)矩屁,我們需要 覆寫 onSaveInstanceState方法辟宗,保存當(dāng)前activity的狀態(tài)變量值。
28.Service和線程的區(qū)別吝秕,我們?yōu)槭裁床挥胹ervice代替線程泊脐,相應(yīng)在什么情況下使用?
Service:service是android的一種機(jī)制郭膛,對應(yīng)的service是運(yùn)行在主線程上的晨抡,它是由系統(tǒng)進(jìn)程托管。他們之間的通信類似于client和server则剃,是一種輕量級(jí)的ipc通信耘柱,這種通信的載體是binder,它是在linux層交換信息的一種ipc棍现。
線程:線程是程序執(zhí)行的最小單元调煎,它是分配CPU的基本單位〖喊梗可以用線程來執(zhí)行一些異步的操作士袄。
區(qū)別:Thread 的運(yùn)行是獨(dú)立于 Activity 的,也就是說當(dāng)一個(gè) Activity 被 finish 之后谎僻,如果你沒有主動(dòng)停止 Thread 或者 Thread 里的 run 方法沒有執(zhí)行完畢的話娄柳,Thread 也會(huì)一直執(zhí)行。因此這里會(huì)出現(xiàn)一個(gè)問題:當(dāng) Activity 被 finish 之后艘绍,你不再持有該 Thread 的引用赤拒。另一方面,你沒有辦法在不同的 Activity 中對同一 Thread 進(jìn)行控制;而Service則可以被多個(gè)activity共用(當(dāng)然你也可以說我可以在服務(wù)里面新起線程這樣不就可以被多個(gè)activity共用了,其實(shí)這樣的本質(zhì)還是共用的服務(wù)而不是線程)挎挖。
我們不用服務(wù)替代線程是因?yàn)椋悍?wù)(子類IntentService則是在內(nèi)部添加了子線程)也是運(yùn)行在主線程上面这敬,而不是子線程,相當(dāng)于你還是需要新起線程來完成相應(yīng)的操作蕉朵,這又是何苦啦崔涂;并且一個(gè)類里面需要多線程操作的情況,服務(wù)是不是顯得很無力始衅。各有各的優(yōu)點(diǎn)冷蚂,下面來看使用情況。
使用情況:
1.在應(yīng)用中觅闽,如果是長時(shí)間的在后臺(tái)運(yùn)行帝雇,而且不需要交互的情況下,使用服務(wù)蛉拙。
同樣是在后臺(tái)運(yùn)行尸闸,不需要交互的情況下,如果只是完成某個(gè)任務(wù)孕锄,之后就不需要運(yùn)行吮廉,而且可能是多個(gè)任務(wù),不需要長時(shí)間運(yùn)行的情況下使用線程畸肆。
2.如果任務(wù)占用CPU時(shí)間多宦芦,資源大的情況下,要使用線程轴脐。
3.一般我們做下載任務(wù)都是在服務(wù)里面新起線程做異步任務(wù)來操作调卑,或者直接使用IntentService。
29.Activity與Fragment之間通信
Handler
廣播
接口
EventBus
以上是我最近面試遇到的常見問題大咱,希望對大家有幫助恬涧;一般hr還有聊一些職業(yè)規(guī)劃之類等等。
下面我推薦幾篇總結(jié)比較全面的面試題: