面試干貨

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ī)制:

  1. 先回收與其他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

  1. 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é)比較全面的面試題:

http://www.reibang.com/p/0f82b0650909

http://www.reibang.com/p/4115bcf9f92e

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碴巾,一起剝皮案震驚了整個(gè)濱河市溯捆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厦瓢,老刑警劉巖提揍,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異煮仇,居然都是意外死亡劳跃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門浙垫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來售碳,“玉大人,你說我怎么就攤上這事∶橙耍” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵佃声,是天一觀的道長艺智。 經(jīng)常有香客問我,道長圾亏,這世上最難降的妖魔是什么十拣? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮志鹃,結(jié)果婚禮上夭问,老公的妹妹穿的比我還像新娘。我一直安慰自己曹铃,他們只是感情好缰趋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陕见,像睡著了一般秘血。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上评甜,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天灰粮,我揣著相機(jī)與錄音,去河邊找鬼忍坷。 笑死粘舟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佩研。 我是一名探鬼主播柑肴,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼韧骗!你這毒婦竟也來了嘉抒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤袍暴,失蹤者是張志新(化名)和其女友劉穎些侍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體政模,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岗宣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淋样。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耗式。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刊咳,到底是詐尸還是另有隱情彪见,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布娱挨,位于F島的核電站余指,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跷坝。R本人自食惡果不足惜酵镜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柴钻。 院中可真熱鬧淮韭,春花似錦、人聲如沸贴届。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粱腻。三九已至庇配,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绍些,已是汗流浹背捞慌。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柬批,地道東北人啸澡。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像氮帐,于是被迫代替她去往敵國和親嗅虏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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