Android 一些面試題

2017年據說是找工作的寒冬,作為一個Android開發(fā),下面的一些問題可能在面試的時候遇到哦:

1、java 內部類有哪些分類?都有什么特點

內部類可以分為四種:1、靜態(tài)內部類:最簡單的內部類形式,類定義時加上static關鍵字,不能和外部類有相同的名字,被編譯成一個完全獨立的.class文件,名稱為OuterClass$InnerClass.class的形式。只可以訪問外部類的靜態(tài)成員和靜態(tài)方法,包括了私有的靜態(tài)成員和方法。2:成員內部類:成員內部類也是定義在另一個類中,但是定義時不用static修飾,成員內部類和靜態(tài)內部類可以類比為非靜態(tài)的成員變量和靜態(tài)的成員變量。成員內部類就像一個實例變量。它可以訪問它的外部類的所有成員變量和方法,不管是靜態(tài)的還是非靜態(tài)的都可以。3:局部內部類:局部內部類定義在方法中,比方法的范圍還小。是內部類中最少用到的一種類型。像局部變量一樣,不能被public, protected, private和static修飾。只能訪問方法中定義的final類型的局部變量。局部內部類在方法中定義,所以只能在方法中使用,即只能在方法當中生成局部內部類的實例并且調用其方法。4:匿名內部類:匿名內部類就是沒有名字的局部內部類,不使用關鍵字class, extends, implements, 沒有構造方法。匿名內部類隱式地繼承了一個父類或者實現(xiàn)了一個接口。匿名內部類使用得比較多,通常是作為一個方法參數(shù)。

2、Json支持哪些數(shù)據類型?

Number :雙精度浮點格式

String:字符型

Boolean:true 或 false

Array:值的有序序列

Value:它可以是一個字符串,一個數(shù)字,真的還是假(true/false),空(null?)等

Object:無序集合鍵值對

Whitespace:可以使用任何一對中的令牌

null:empty

3、volatile關鍵字?

用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改后的最的值。volatile修飾的變量不允許線程內部緩存和重排序,即直接修改內存。所以對其他線程是可見的。但是這里需要注意一個問題,volatile只能讓被他修飾內容具有可見性,但不能保證它具有原子性。比如 volatile int a = 0;之后有一個操作 a++;這個變量a具有可見性,但是a++ 依然是一個非原子操作,也就是這個操作同樣存在線程安全問題。當對非volatile變量進行讀寫的時候,每個線程先從內存拷貝變量到CPU緩存中。如果計算機有多個CPU,每個線程可能在不同的CPU上被處理,這意味著每個線程可以拷貝到不同的CPU cache中。而聲明變量是volatile的,JVM保證了每次讀變量都從內存中讀,跳過CPU cache這一步。

4、java中synchronized的用法?

當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執(zhí)行該段代碼。

一、當兩個并發(fā)線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執(zhí)行。另一個線程必須等待當前線程執(zhí)行完這個代碼塊以后才能執(zhí)行該代碼塊。

二、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。

三、尤其關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。

四、第三同樣適用其它同步代碼塊。也就是說,當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就獲得了這個object的對象鎖。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞。

五、以上規(guī)則對其它對象鎖同樣適用.

5、簡述http協(xié)議?

http(超文本傳輸協(xié)議)是一個基于請求與響應模式的、無狀態(tài)的、應用層的協(xié)議,?;赥CP的連接方式,HTTP1.1版本中給出一種持續(xù)連接的機制,絕大多數(shù)的Web開發(fā),都是構建在HTTP協(xié)議之上的Web應用。

HTTP協(xié)議的主要特點可概括如下:

a.支持客戶/服務器模式。

b.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務器的程序規(guī)模小,因而通信速度很快。

c.靈活:HTTP允許傳輸任意類型的數(shù)據對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標記。

d.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。

e.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數(shù)據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

6、使用AlarmManage做倒計時或計數(shù)器?

AlarmManager的使用機制有的稱呼為全局定時器,有的稱呼為鬧鐘,其實它的作用和Timer有點相似。都有兩種相似的用法:(1)在指定時長后執(zhí)行某項操作(2)周期性的執(zhí)行某項操作 。AlarmManager對象配合Intent使用,可以定時的開啟一個Activity,發(fā)送一個BroadCast,或者開啟一個Service.

Intent intent=newIntent(xxxx.this, xxx.class);

intent.setAction("repeating");

PendingIntent sender=PendingIntent

.getBroadcast(xxx.this,0, intent,0);

//開始時間

longfirstime=SystemClock.elapsedRealtime();

AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);

//5秒一個周期,不停的發(fā)送廣播

am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP

, firstime,5*1000, sender);

7、Android實現(xiàn)異步?

a:繼承Thread類 b:實現(xiàn)Runnable接口? c:AsyncTask d : Handler.

8、View的specMode?

EXACTLY:一般是設置了明確的值或者是MATCH_PARENT

AT_MOST:表示子布局限制在一個最大值內,一般為WARP_CONTENT

UNSPECIFIED:表示子布局想要多大就多大,很少使用

9、 activity在屏幕旋轉時的生命周期

答:不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次;設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執(zhí)行一次;設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執(zhí)行onConfigurationChanged方法

10、 描述一下android的系統(tǒng)架構

android系統(tǒng)架構分從下往上為linux 內核層、運行庫、應用程序框架層、和應用程序層。

linuxkernel:負責硬件的驅動程序、網絡、電源、系統(tǒng)安全以及內存管理等功能。

libraries和 android runtime:libraries:即c/c++函數(shù)庫部分,大多數(shù)都是開放源代碼的函數(shù)庫,例如webkit(引擎),該函數(shù)庫負責 android網頁瀏覽器的運行,例如標準的c函數(shù)庫libc、openssl、sqlite等,當然也包括支持游戲開發(fā)2dsgl和 3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等眾多的多媒體文件格式。android的runtime負責解釋和執(zhí)行生成的dalvik格式的字節(jié)碼。

applicationframework(應用軟件架構),java應用程序開發(fā)人員主要是使用該層封裝好的api進行快速開發(fā)。

applications:該層是java的應用程序層,android內置的googlemaps、e-mail、即時通信工具、瀏覽器、mp3播放器等處于該層,java開發(fā)人員開發(fā)的程序也處于該層,而且和內置的應用程序具有平等的位置,可以調用內置的應用程序,也可以替換內置的應用程序。

上面的四個層次,下層為上層服務,上層需要下層的支持,調用下層的服務,這種嚴格分層的方式帶來的極大的穩(wěn)定性、靈活性和可擴展性,使得不同層的開發(fā)人員可以按照規(guī)范專心特定層的開發(fā)。

android應用程序使用框架的api并在框架下運行,這就帶來了程序開發(fā)的高度一致性,另一方面也告訴我們,要想寫出優(yōu)質高效的程序就必須對整個 applicationframework進行非常深入的理解。精通applicationframework,你就可以真正的理解android的設計和運行機制,也就更能夠駕馭整個應用層的開發(fā)。

11、一個".java"源文件中是否可以包括多個類(不是內部類)?有什么限制?

可以有多個類,但只能有一個public的類,并且public的類名必須與文件的主文件名相同。

包含多個類的Java源文件編譯之后會生成多個.class文件

12、Java如何跳出當前的多重嵌套循環(huán)?

在Java中,要想跳出多重循環(huán),可以在外面的循環(huán)語句前定義一個標號,然后在里層循環(huán)體的代碼中使用帶有標號的break 語句,即可跳出外層循環(huán)。例如,

outer:

for(inti=0;i<10;i++)

{

for(intj=0;j<10;j++)

{

System.out.println(“i=”+ i + “,j=” + j);

if(j== 5) break ouer;

}

}

13、垃圾回收考慮幾種回收機制。

對于一個垃圾回收器的設計算法來說,大致有如下可供選擇的設計:

A.串行回收(Serial)和并行回收(Parallel):串行回收就是不管系統(tǒng)有多少個CPU,始終只用一個CPU來執(zhí)行垃圾回收操作;而并行回收就是把整個回收工作拆分成多部分,每個部分由一個CPU負責,從而讓多個CPU并行回收,并行回收的執(zhí)行效率很高,但復雜度增加,另外也有其他一些副作用,比如內存碎片會增加。

B.并發(fā)執(zhí)行(Concurrent)和應用程序停止(Stop-the-world):。Stop-the-world的垃圾回收方式在執(zhí)行垃圾回收的同時會導致應用程序的暫停。并發(fā)執(zhí)行的垃圾回收雖然不會導致應用程序的暫停,但由于并發(fā)執(zhí)行垃圾回收需要解決和應用程序的執(zhí)行沖突(應用程序可能會在垃圾回收的過稱中修改對象),因此并發(fā)執(zhí)行垃圾回收的系統(tǒng)開銷比Stop-the-world更好,而且執(zhí)行時也需要更多的堆內存。

C.壓縮(Compacting)和不壓縮(Non-compacting)和復制(Copying):為了減少內存碎片,支持壓縮的垃圾回收器會把所有的活對象搬遷到一起,然后將之前占用的內存全部回收。不壓縮式的垃圾回收器只是回收內存,這樣回收回來的內存不可能是連續(xù)的,因此將會有較多的內存碎片。較之壓縮式的垃圾回收,不壓縮式的垃圾回收回收內存快了,而分配內存時就會更慢,而且無法解決內存碎片的問題。復制式的垃圾回收會將所有可達對象復制到另一塊相同的內存中,這種方式的優(yōu)點是垃圾及回收過程不會產生內存碎片,但缺點也很明顯,需要拷貝數(shù)據和額外的內存。

14、sleep() 和 wait() 有什么區(qū)別?

對于sleep()方法,我們首先要知道該方法是屬于Thread類中的。而wait()方法,則是屬于Object類中的。

sleep()方法導致了程序暫停執(zhí)行指定的時間,讓出cpu給其他線程,但是他的監(jiān)控狀態(tài)依然保持者,當指定的時間到了又會自動恢復運行狀態(tài)。

在調用sleep()方法的過程中,線程不會釋放對象鎖。

而當調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法后本線程才進入對象鎖定池準備

獲取對象鎖進入運行狀態(tài)

15、簡述synchronized和java.util.concurrent.locks.Lock的異同?

ReentrantLock 擁有Synchronized相同的并發(fā)性和內存語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候,線程A和B都要獲取對象O的鎖定,假設A獲取了對象O鎖,B將等待A釋放對O的鎖定,如果使用 synchronized ,如果A不釋放,B將一直等下去,不能被中斷如果 使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時間以后,中斷等待,而干別的事情。

synchronized是在JVM層面上實現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時出現(xiàn)異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過代碼實現(xiàn)的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}中

在資源競爭不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的性能會下降幾十倍,但是ReetrantLock的性能能維持常態(tài)

Atomic:和上面的類似,不激烈情況下,性能比synchronized略遜,而激烈的時候,也能維持常態(tài)。激烈的時候,Atomic的性能會優(yōu)于ReentrantLock一倍左右。但是其有一個缺點,就是只能同步一個值,一段代碼中只能出現(xiàn)一個Atomic的變量,多于一個同步無效。因為他不能在多個Atomic之間同步。

16、View, SurfaceView, GLSurfaceView有什么區(qū)別?

答:View是最基礎的,必須在UI主線程內更新畫面,速度較慢。

SurfaceView 是View的子類,使用了雙緩機制,在新的線程中更新畫面所以刷新界面速度比View快。

SurfaceView一般會與SurfaceHolder結合使用,調用SurfaceView的getHolder()方法即可獲取SurfaceView關聯(lián)的SurfaceHolder,SurfaceHolder用于向與之關聯(lián)的SurfaceView上繪圖,

SurfaceHolder提供了如下方法來獲取Canvas對象:

- CanvaslockCanvas():鎖定整個SurfaceView對象,獲取該Surface上的Canvas。

- CanvaslockCanvas(Rect dirty):鎖定SurfaceView上Rect劃分的區(qū)域,獲取該Surface上的Canvas。

當對同一個SurfaceView調用上面兩個方法時,兩個方法所返回的是同一個Canvas對象。但當程序調用第二個方法獲取指定區(qū)域的Canvas時,SurfaceView將只對Rect所“圈”出來的區(qū)域進行更新,通過這種方式可以提高畫面的更新速度。

當通過lockCanvas()獲取指定了SurfaceView上的Canvas之后,接下來程序就可調用Canvas進行繪圖了,Canvas繪圖完成后通過如下方法來釋放繪圖、提交所繪制的圖形:

-unlockCanvasAndPost(canvas);

GLSurfaceView 是SurfaceView的子類,OpenGL專用的。

17、Java 中的內存分配

靜態(tài)儲存區(qū)編譯時就分配好,在程序整個運行期間都存在。它主要存放靜態(tài)數(shù)據和常量;

棧區(qū):當方法執(zhí)行時,會在棧區(qū)內存中創(chuàng)建方法體內部的局部變量,方法結束后自動釋放內存;

堆區(qū):通常存放 new 出來的對象。由 Java 垃圾回收器回收

18、Java中四種引用

強引用(StrongReference):強引用就是指在程序代碼之中普遍存在的,只要某個對象有強引用與之關聯(lián),JVM必定不會回收這個對象,即使在內存不足的情況下,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象

軟引用(SoftReference):軟引用是用來描述一些有用但并不是必需的對象,在Java中用java.lang.ref.SoftReference類來表示。對于軟引用關聯(lián)著的對象,只有在內存不足的時候JVM才會回收該對象。因此,這一點可以很好地用來解決OOM的問題,并且這個特性很適合用來實現(xiàn)緩存:比如網頁緩存、圖片緩存等。

弱引用(WeakReference):弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯(lián)的對象。在java中,用java.lang.ref.WeakReference類來表示。

虛引用(PhantomReference):虛引用和前面的軟引用、弱引用不同,它并不影響對象的生命周期。在java中java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關聯(lián),則跟沒有引用與之關聯(lián)一樣,在任何時候都可能被垃圾回收器回收。要注意的是,虛引用必須和引用隊列關聯(lián)使用,當垃圾回收器準備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用,就會把這個虛引用加入到與之 關聯(lián)的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個虛引用已經被加入到引用隊列,那么就可以在所引用的對象的內存被回收之前采取必要的行動。

對于強引用,我們平時在編寫代碼時經常會用到。而對于其他三種類型的引用,使用得最多的就是軟引用和弱引用,這2種既有相似之處又有區(qū)別。它們都是用來描述非必需對象的,但是被軟引用關聯(lián)的對象只有在內存不足時才會被回收,而被弱引用關聯(lián)的對象在JVM進行垃圾回收時總會被回收。針對上面的特性,軟引用適合用來進行緩存,當內存不夠時能讓JVM回收內存,弱引用能用來在回調函數(shù)中防止內存泄露。因為回調函數(shù)往往是匿名內部類,隱式保存有對外部類的引用,所以如果回調函數(shù)是在另一個線程里面被回調,而這時如果需要回收外部類,那么就會內存泄露,因為匿名內部類保存有對外部類的強引用。

19、activity的四種啟動模式

standard:默認模式,可以不用寫配置。在這個模式下,都會默認創(chuàng)建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加

singleTop:可以有多個實例,但是不允許多個相同Activity疊加。即,如果Activity在棧頂?shù)臅r候,啟動相同的Activity,不會創(chuàng)建新的實例,而會調用其onNewIntent方法。

singleTask:只有一個實例。在同一個應用程序中啟動他的時候,若Activity不存在,則會在當前task創(chuàng)建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉并調用它的onNewIntent方法。如果是在別的應用程序中啟動它,則會新建一個task,并在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的實例中再打開新的Activity,這個新的Activity還是會在singleTask的實例的task中。

singleInstance:只有一個實例,并且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在

20、java中String,StringBuilder, StringBuffer的區(qū)別

String類中使用字符數(shù)組保存字符串,因為有“final”修飾符,所以string對象是不可變的。StringBuilder與StringBuffer都繼承AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串,這兩種對象都是可變的。

String中的對象是不可變的,也就可以理解為常量,顯然線程安全;StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的;

21:HashMap, LinkedHashMap, TreeMap,區(qū)別

Map主要用于存儲健值對,根據鍵得到值,因此不允許鍵重復(重復了覆蓋了),但允許值重復

Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數(shù)據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數(shù)據的順序是完全隨機的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支持線程的同步

Hashtable與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。

LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數(shù),按照應用次數(shù)排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數(shù)據較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數(shù)據有關,和容量無關,而HashMap的遍歷速度和他的容量有關

TreeMap實現(xiàn)SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。

一般情況下,我們用的最多的是HashMap,HashMap里面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數(shù)據,根據鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。

TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。

LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現(xiàn),它還可以按讀取順序來排列,像連接池中可以應用。

22、TCP和UDP的區(qū)別

TCP/IP協(xié)議是一個協(xié)議簇。里面包括很多協(xié)議的。UDP只是其中的一個。之所以命名為TCP/IP協(xié)議,因為TCP,IP協(xié)議是兩個很重要的協(xié)議,就用他兩命名了。

一個TCP協(xié)議連接其實就是在物理線路上創(chuàng)建的一條“虛擬信道”。這條“虛擬信道”建立后,在TCP協(xié)議發(fā)出FIN包之前(兩個終端都會向對方發(fā)送一個FIN包),是不會釋放的。正因為這一點,TCP協(xié)議被稱為面向連接的協(xié)議!

UDP協(xié)議,一樣會在物理線路上創(chuàng)建一條“虛擬信道”,否則UDP協(xié)議無法傳輸數(shù)據!但是,當UDP協(xié)議傳完數(shù)據后,這條“虛擬信道”就被立即注銷了!因此,稱UDP是不面向連接的協(xié)議!

主要區(qū)別:

基于連接與無連接;

對系統(tǒng)資源的要求(TCP較多,UDP少);

UDP程序結構較簡單;

流模式與數(shù)據報模式 ;

TCP保證數(shù)據正確性,UDP可能丟包,TCP保證數(shù)據順序,UDP不保證。

23、http session機制

http是無狀態(tài)的協(xié)議,客戶每次讀取web頁面時,服務器都打開新的會話,而且服務器也不會自動維護客戶的上下文信息,那么要怎么才能實現(xiàn)會話跟蹤呢?session就是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務器端,通過SessionID來區(qū)分不同的客戶,session是以cookie或URL重寫為基礎的,默認使用cookie來實現(xiàn),系統(tǒng)會創(chuàng)造一個名為JSESSIONID的輸出返回給客戶端Cookie保存。

保存session id的幾種方式

A.保存session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標識發(fā)送給服務器。

B.由于cookie可以被人為的禁止,必須有其它的機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器,經常采用的一種技術叫做URL重寫,就是把session id附加在URL路徑的后面,附加的方式也有兩種,一種是作為URL路徑的附加信息,另一種是作為查詢字符串附加在URL后面。網絡在整個交互過程中始終保持狀態(tài),就必須在每個客戶端可能請求的路徑后面都包含這個session id。

C.另一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。

24、動態(tài)廣播訂閱和靜態(tài)廣播訂閱的區(qū)別

靜態(tài)訂閱廣播又叫:常駐型廣播,當你的應用程序關閉了,如果有廣播信息來,你寫的廣播接收器同樣的能接受到,他的注冊方式就是在你的應用程序中的AndroidManifast.xml進行訂閱的。

動態(tài)訂閱廣播又叫:非常駐型廣播,當應用程序結束了,廣播自然就沒有了,比如你在activity中的onCreate或者onResume中訂閱廣播,同時你必須在onDestory或者onPause中取消廣播訂閱。不然會報異常,這樣你的廣播接收器就一個非常駐型的了。

這里面還有一個細節(jié)那就是這兩種訂閱方式,在發(fā)送廣播的時候需要注意的是:動態(tài)注冊的時候使用的是隱式intent方式的,所以在發(fā)送廣播的時候需要使用隱式Intent去發(fā)送,不然是廣播接收者是接收不到廣播的,這一點要注意。但是靜態(tài)訂閱的時候,因為在AndroidMainfest.xml中訂閱的,所以在發(fā)送廣播的時候使用顯示Intent和隱式Intent都可以(當然這個只針對于我們自己定義的廣播接收者),所以以防萬一,我們一般都采用隱式Intent去發(fā)送廣播

動態(tài)廣播比靜態(tài)廣播具有更高的優(yōu)先級

25、Android handler機制

基本流程:

首先Looper.prepare()在本線程中保存一個Looper實例,然后該實例中保存一個MessageQueue對象;因為Looper.prepare()在一個線程中只能調用一次,所以MessageQueue在一個線程中只會存在一個。

2、Looper.loop()會讓當前線程進入一個無限循環(huán),不端從MessageQueue的實例中讀取消息,然后回調msg.target.dispatchMessage(msg)方法。因為這里采用的是無限循環(huán),所以可能會有個疑問:該循環(huán)會不會特別消耗CPU資源?其實并不會,如果messageQueue有消息,自然是繼續(xù)取消息;如果已經沒有消息了,此時該線程便會阻塞在該next()方法的nativePollOnce()方法中,主線程便會釋放CPU資源進入休眠狀態(tài),直到下個消息到達或者有事務發(fā)生時,才通過往pipe管道寫端寫入數(shù)據來喚醒主線程工作

3、Handler的構造方法,會首先得到當前線程中保存的Looper實例,進而與Looper實例中的MessageQueue想關聯(lián)。

4、Handler的sendMessage方法,會給msg的target賦值為handler自身,然后加入MessageQueue中。

5、在構造Handler實例時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調用的方法。

在Activity中,我們并沒有顯示的調用Looper.prepare()和Looper.loop()方法,為啥Handler可以成功創(chuàng)建呢,這是因為在Activity的啟動代碼中,已經在當前UI線程調用了Looper.prepare()和Looper.loop()方法。

26、AIDL原理

AIDL (Android Interface Definition Language) 是一種IDL 語言,用于生成可以在Android設備上兩個進程之間進行進程間通信(interprocess communication, IPC)的代碼。如果在一個進程中(例如Activity)要調用另一個進程中(例如Service)對象的操作,就可以使用AIDL生成可序列化的參數(shù)。AIDL IPC機制是面向接口的,像COM或Corba一樣,但是更加輕量級。它是使用代理類在客戶端和實現(xiàn)端傳遞數(shù)據。

27、Android 下res和assert有什么區(qū)別

相同點:.兩者目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進制。

不同點:res/raw中的文件會被映射到R.Java文件中,訪問的時候直接使用資源id即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。

raw是Resources (res)的子目錄,Android會自動的為這目錄中的所有資源文件生成一個ID,這個ID會被存儲在R類當中,作為一個文件的引用。這意味著這個資源 文件可以很容易的被Android的類和方法訪問到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是訪問一個文件最快捷的方式。MP3和Ogg文件放在這個目錄下是比較合適 的

assets目錄更像一個附錄類型的目錄,Android不會為這個目錄中的文件生成ID并保存在R類當中,因此它與 Android中的一些類和方法兼容度更低。同時,由于你需要一個字符串路徑來獲取這個目錄下的文件描述符,訪問的速度會更慢。但是把一些文件放在這個目 錄下會使一些操作更加方便,比方說拷貝一個數(shù)據庫文件到系統(tǒng)內存中。要注意的是,你無法在Android XML文件中引用到assets目錄下的文件,只能通過AssetManager來訪問這些文件。數(shù)據庫文件和游戲數(shù)據等放在這個目錄下是比較合適的。

28、頁面卡頓原因分析及分析工具以及解決方法

界面卡頓影響的頁面ListView、ScrollView、有動畫的頁面等

分析步驟:打開調試開發(fā)者選項,GPU呈現(xiàn)模式分析:如果藍色部分比較高,說明是UI線程性能問題;紅色部分比較高,應該是DrawList比較復雜,這部分可能跟藍色部分相關。目前還沒想到藍色部分不高,紅色部分搞的案例;黃色部分高,也許是GPU太忙,也許是CPU太忙。 GPU太忙,說明DrawList太多,CPU太忙,說明要么主線程性能有問題,要么GPU太忙,來不及通知主線程??偟膩碚f,三部分是相關的。藍色部分的高,可以直接導致紅色和黃色部分的高,所以,重點還是分析藍色部分的高。

分析主線程性能:兩種類型的影響因素:全局級別的影響因素;比如CPU性能低、內存不足,頻繁GC。 頁面級別的影響因素;頁面的 measure比較耗時頁面的、 layout比較耗時、頁面的 draw比較耗時。

如果所有頁面都慢,判定是全局級別因素,如果只有某個頁面慢,判定是頁面級別的原因

頁面級別的影響因素一般原因:有自定義控件,measure, layout, draw效率比較低;View 結構比較復雜或者不合理,導致 measure, layout效率比較低;頁面結構設計復雜或者不合理,導致draw效率比較低,過度繪制

頁面級別影響因素的分析工具及方法:

自定義控件效率低下:用 method tracing可以發(fā)現(xiàn),Android Studio:? Android Monitor-->start method tracing,結果用Exclusive Time排序

Android systrace? ? Method Profiling

29、Json數(shù)據的解析

android的json解析部分都在包org.json下,主要有以下幾個類:

JSONObject:可以看作是一個json對象,這是系統(tǒng)中有關JSON定義的基本單元,其包含一對(Key/Value)數(shù)值

JSONArray:它代表一組有序的數(shù)值

解析Json的例子:

/ 假設現(xiàn)在要創(chuàng)建這樣一個json文本

//??{

//??????"phone"?:?["12345678",?"87654321"],?//?數(shù)組

//??????"name"?:?"yuanzhifei89",?//?字符串

//??????"age"?:?100,?//?數(shù)值

//??????"address"?:?{?"country"?:?"china",?"province"?:?"jiangsu"?},?//?對象

//??????"married"?:?false?//?布爾值

//??}

try{

//?首先最外層是{},是創(chuàng)建一個對象

JSONObject?person?=newJSONObject();

//?第一個鍵phone的值是數(shù)組,所以需要創(chuàng)建數(shù)組對象

JSONArray?phone?=newJSONArray();

phone.put("12345678").put("87654321");

person.put("phone",?phone);

person.put("name","yuanzhifei89");

person.put("age",100);

//?鍵address的值是對象,所以又要創(chuàng)建一個對象

JSONObject?address?=newJSONObject();

address.put("country","china");

address.put("province","jiangsu");

person.put("address",?address);

person.put("married",false);

}catch(JSONException?ex)?{

//?鍵為null或使用json不支持的數(shù)字格式(NaN,?infinities)

thrownewRuntimeException(ex);

}

30、怎么做出一個dialog樣式的activity

android自帶theme如下:

?android:theme="@android:style/Theme.Dialog"?? 將一個Activity顯示為對話框模式

?android:theme="@android:style/Theme.NoTitleBar"? 不顯示應用程序標題欄

?android:theme="@android:style/Theme.NoTitleBar.Fullscreen"? 不顯示應用程序標題欄,并全屏

?android:theme="Theme.Light"? 背景為白色

?android:theme="Theme.Light.NoTitleBar"? 白色背景并無標題欄

?android:theme="Theme.Light.NoTitleBar.Fullscreen"? 白色背景,無標題欄,全屏

?android:theme="Theme.Black"? 背景黑色

?android:theme="Theme.Black.NoTitleBar"? 黑色背景并無標題欄

?android:theme="Theme.Black.NoTitleBar.Fullscreen"??? 黑色背景,無標題欄,全屏

?android:theme="Theme.Wallpaper"? 用系統(tǒng)桌面為應用程序背景

?android:theme="Theme.Wallpaper.NoTitleBar"? 用系統(tǒng)桌面為應用程序背景,且無標題欄

?android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"? 用系統(tǒng)桌面為應用程序背景,無標題欄,全屏

?android:theme="Translucent"

?android:theme="Theme.Translucent.NoTitleBar"

?android:theme="Theme.Translucent.NoTitleBar.Fullscreen"

?android:theme="Theme.Panel"

?android:theme="Theme.Light.Panel"

其實,只要在manifest.xml文件中把中設置為android:theme = "@android:style/Theme.Dialog"即可

31、點擊短信里的鏈接進入APP

詳情請看:http://blog.csdn.net/books1958/article/details/49948555

32、POST和GET的區(qū)別

GET在瀏覽器回退時是無害的,而POST會再次提交請求。 GET產生的URL地址可以被Bookmark,而POST不可以。 GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。 GET請求只能進行url編碼,而POST支持多種編碼方式。 GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會被保留。 GET請求在URL中傳送的參數(shù)是有長度限制的,而POST么有。 對參數(shù)的數(shù)據類型,GET只接受ASCII字符,而POST沒有限制。 GET比POST更不安全,因為參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息。 GET參數(shù)通過URL傳遞,POST放在Request body中。

其實GET和POST本質上就是TCP鏈接,并無差別。但是由于HTTP的規(guī)定和瀏覽器/服務器的限制,導致他們在應用過程中體現(xiàn)出一些不同。

GET和POST還有一個重大區(qū)別,簡單的說:GET產生一個TCP數(shù)據包;POST產生兩個TCP數(shù)據包。

對于GET方式的請求,瀏覽器會把http header和data一并發(fā)送出去,服務器響應200(返回數(shù)據);

而對于POST,瀏覽器先發(fā)送header,服務器響應100 continue,瀏覽器再發(fā)送data,服務器響應200 ok(返回數(shù)據)。

也就是說,GET只需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和服務器打個招呼“嗨,我等下要送一批貨來,你們打開門迎接我”,然后再回頭把貨送過去。

并不是所有瀏覽器都會在POST中發(fā)送兩次包,F(xiàn)irefox就只發(fā)送一次。

33、Android中asserts目錄和raw目錄的區(qū)別

Android中asset文件夾和raw文件夾區(qū)別

34、java的一些基礎面試題

java初級面試題

未完待續(xù)~~~~~~

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

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評論 25 709
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,791評論 11 349
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,662評論 18 399
  • 把一條路走得足夠長, 就能聽見延遲的聲音,也能聞到延遲的氣味。 又不敢停留。沒有人停留。沒有一個異端。 每一寸向著...
    丁千閱讀 305評論 0 1
  • 大年初三,簡年繼續(xù)打卡,哈哈~接著昨天的簡年繼續(xù)說。 昨天看完東野圭吾的《解憂雜貨店》,深深感受到,東野大叔的小說...
    黃金橙子閱讀 285評論 9 0

友情鏈接更多精彩內容