【Android】面試寶典

 

 

 

 

 

 

Android面試html

 

 

 

                                                                                                                  

 

1. 內容介紹................................................................................................................................................................................................................... 8java

2. JavaSE基礎(★★)............................................................................................................................................................................................ 8linux

1、 Java面向對象思想................................................................................................................................................................................ 8android

一、面向對象都有哪些特性以及你對這些特性的理解............................................................................................................... 8面試

2、 Java中的多態......................................................................................................................................................................................... 9算法

一、 Java中實現多態的機制是什麼?............................................................................................................................................ 9sql

3、 Java的異常處理.................................................................................................................................................................................. 10數據庫

一、 Java中異常分爲哪些種類........................................................................................................................................................ 10apache

二、 調用下面的方法,獲得的返回值是什麼............................................................................................................................. 10編程

4、 Java的數據類型.................................................................................................................................................................................. 11

一、 Java的基本數據類型都有哪些各佔幾個字節.................................................................................................................. 11

二、 String是基本數據類型嗎?能夠被繼承嗎?................................................................................................................... 11

5、 Java的IO.............................................................................................................................................................................................. 12

一、 Java中有幾種類型的流............................................................................................................................................................ 12

二、 字節流如何轉爲字符流.............................................................................................................................................................. 12

三、 如何將一個java對象序列化到文件裏................................................................................................................................ 12

6、 Java的集合........................................................................................................................................................................................... 12

一、HashMap排序題,上機題。(本人主要靠這道題入職的第一家公司).................................................................... 12

二、 集合的安全性問題....................................................................................................................................................................... 14

7、 Java的多線程...................................................................................................................................................................................... 15

一、 多線程的兩種建立方式.............................................................................................................................................................. 15

二、 在java中wait和sleep方法的不一樣?.............................................................................................................................. 15

三、 synchronized和volatile關鍵字的做用.......................................................................................................................... 15

四、 分析代碼解釋緣由....................................................................................................................................................................... 16

五、 什麼是線程池,如何使用?.................................................................................................................................................... 18

3. JavaSE高級(★★).......................................................................................................................................................................................... 18

1、 Java中的反射...................................................................................................................................................................................... 18

一、說說你對Java中反射的理解.................................................................................................................................................... 18

2、 Java中的動態代理............................................................................................................................................................................. 18

一、 寫一個ArrayList的動態代理類(筆試題)...................................................................................................................... 19

3、 Java中的設計模式............................................................................................................................................................................. 19

一、 你所知道的設計模式有哪些.................................................................................................................................................... 19

二、 單例設計模式................................................................................................................................................................................ 19

三、 工廠設計模式................................................................................................................................................................................ 20

四、 建造者模式(Builder)............................................................................................................................................................ 24

五、 適配器設計模式............................................................................................................................................................................ 25

六、 裝飾模式(Decorator).......................................................................................................................................................... 27

七、 策略模式(strategy).............................................................................................................................................................. 28

八、 觀察者模式(Observer)....................................................................................................................................................... 29

4. Android基礎(★★★)................................................................................................................................................................................... 31

1、 Android基本常識.............................................................................................................................................................................. 31

一、 寫10個簡單的linux命令....................................................................................................................................................... 31

二、 書寫出android工程的目錄結構.......................................................................................................................................... 32

三、 什麼是ANR 如何避免它?..................................................................................................................................................... 32

四、 談談Android的優勢和不足之處......................................................................................................................................... 33

五、 一條最長的短信息約佔多少byte?....................................................................................................................................... 34

六、 sim卡的EF文件有何做用?.................................................................................................................................................. 34

七、 如何判斷是否有SD卡?.......................................................................................................................................................... 37

八、 dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念?..................................................................... 37

九、 Android程序與Java程序的區別?................................................................................................................................... 38

十、 啓動應用後,改變系統語言,應用的語言會改變麼?.............................................................................................. 38

十一、 請介紹下adb、ddms、aapt的做用.............................................................................................................................. 38

十二、 ddms 和traceview的區別................................................................................................................................................. 39

1三、 補充知識:TraceView的使用............................................................................................................................................. 39

2、 Activity................................................................................................................................................................................................... 43

一、 什麼是Activity?........................................................................................................................................................................... 43

二、 請描述一下Activity 生命週期............................................................................................................................................... 43

三、 如何保存Activity的狀態?..................................................................................................................................................... 44

四、 兩個Activity之間跳轉時必然會執行的是哪幾個方法?............................................................................................. 45

五、 橫豎屏切換時Activity的生命週期....................................................................................................................................... 45

六、 如何將一個Activity設置成窗口的樣式............................................................................................................................. 45

七、 如何退出Activity?如何安全退出已調用多個Activity的Application?.......................................................... 45

八、 請描述一下Activity的啓動模式都有哪些以及各自的特色........................................................................................ 46

3、 Service.................................................................................................................................................................................................... 55

一、 Service是否在main thread中執行, service裏面是否能執行耗時的操做?..................................................... 56

二、 Activity怎麼和Service綁定,怎麼在Activity中啓動本身對應的Service?.................................................. 56

三、 請描述一下Service的生命週期............................................................................................................................................ 56

四、 什麼是IntentService?有何優勢?.................................................................................................................................... 58

五、 說說Activity、Intent、Service是什麼關係................................................................................................................... 60

六、 Service和Activity在同一個線程嗎.................................................................................................................................... 60

七、 Service裏面能夠彈吐司麼...................................................................................................................................................... 61

4、 BroadCastReceiver.......................................................................................................................................................................... 61

一、 請描述一下BroadcastReceiver........................................................................................................................................... 61

二、 在manifest和代碼中如何註冊和使用BroadcastReceiver..................................................................................... 62

三、 BroadCastReceiver的生命週期.......................................................................................................................................... 62

5、 ContentProvider............................................................................................................................................................................... 62

一、 請介紹下ContentProvider是如何實現數據共享的.................................................................................................... 63

二、 請介紹下Android的數據存儲方式..................................................................................................................................... 63

三、 爲何要用ContentProvider?它和sql的實現上有什麼差異?.......................................................................... 63

四、 說說ContentProvider、ContentResolver、ContentObserver之間的關係................................................ 64

6、 Android中的佈局.............................................................................................................................................................................. 64

一、Android中經常使用的佈局都有哪些............................................................................................................................................. 64

二、 談談UI中, Padding和Margin有什麼區別?.......................................................................................................... 64

7、 ListView................................................................................................................................................................................................. 65

一、 ListView如何提升其效率?................................................................................................................................................... 65

二、 當ListView數據集改變後,如何更新ListView............................................................................................................ 65

三、 ListView如何實現分頁加載................................................................................................................................................... 65

四、 ListView能夠顯示多種類型的條目嗎................................................................................................................................. 66

五、 ListView如何定位到指定位置............................................................................................................................................... 66

六、 當在ScrollView中如何嵌入ListView............................................................................................................................... 66

七、 ListView中如何優化圖片........................................................................................................................................................ 67

八、 ListView中圖片錯位的問題是如何產生的....................................................................................................................... 68

九、 Java中引用類型都有哪些........................................................................................................................................................ 68

8、 JNI&NDK.............................................................................................................................................................................................. 71

一、 在Android中如何調用C語言.............................................................................................................................................. 71

二、 請介紹一下NDK.......................................................................................................................................................................... 71

三、 JNI調用經常使用的兩個參數.......................................................................................................................................................... 71

9、 Android中的網絡訪問.................................................................................................................................................................... 72

一、Android中如何訪問網絡........................................................................................................................................................... 72

二、 如何解析服務器傳來的JSON文件...................................................................................................................................... 72

三、 如何解析服務器傳來的XML格式數據............................................................................................................................... 74

四、 如何從網絡上加載一個圖片顯示到界面............................................................................................................................. 76

五、 如何播放網絡視頻....................................................................................................................................................................... 77

10、 Intent...................................................................................................................................................................................................... 77

一、 Intent傳遞數據時,能夠傳遞哪些類型數據?............................................................................................................... 77

二、 Serializable和Parcelable的區別...................................................................................................................................... 77

三、 請描述一下Intent 和 IntentFilter..................................................................................................................................... 78

11、 Fragment.......................................................................................................................................................................................... 80

一、 Fragment跟Activity之間是如何傳值的.......................................................................................................................... 80

二、 描述一下Fragment的生命週期........................................................................................................................................... 81

5. Android高級(★★★)................................................................................................................................................................................... 81

1、 Android性能優化.............................................................................................................................................................................. 81

一、 如何對Android應用進行性能分析..................................................................................................................................... 82

二、 什麼狀況下會致使內存泄露.................................................................................................................................................... 83

三、 如何避免OOM異常.................................................................................................................................................................. 87

四、 Android中如何捕獲未捕獲的異常...................................................................................................................................... 89

2、 Android屏幕適配.............................................................................................................................................................................. 90

一、 屏幕適配方式都有哪些.............................................................................................................................................................. 90

二、 屏幕適配的處理技巧都有哪些................................................................................................................................................ 96

三、 dp和px之間的關係.................................................................................................................................................................. 99

3、 AIDL......................................................................................................................................................................................................... 99

一、 什麼是AIDL以及如何使用...................................................................................................................................................... 99

4、自定義控件............................................................................................................................................................................................ 100

一、如何自定義一個控件.................................................................................................................................................................. 100

二、 請描述一下View的繪製流程.............................................................................................................................................. 101

5、Android中的事件處理.................................................................................................................................................................... 103

一、Handler機制................................................................................................................................................................................ 103

二、 事件分發機制.............................................................................................................................................................................. 104

6、Android簽名....................................................................................................................................................................................... 106

一、簡單描述下Android 數字簽名............................................................................................................................................ 106

二、 使用Eclipse如何生成數字簽名......................................................................................................................................... 107

7、 Android中的動畫........................................................................................................................................................................... 107

一、 Android中的動畫有哪幾類,它們的特色和區別是什麼......................................................................................... 108

二、 如何修改Activity進入和退出動畫.................................................................................................................................... 108

8、 其餘知識(非歸類內容).............................................................................................................................................................. 108

一、 AsyncTask如何使用............................................................................................................................................................... 109

二、 都使用過哪些框架、平臺...................................................................................................................................................... 113

三、 都使用過哪些自定義控件...................................................................................................................................................... 113

6. Android項目(★★★)................................................................................................................................................................................ 114

一、 如何介紹本身的項目................................................................................................................................................................ 114

二、 項目介紹示範.............................................................................................................................................................................. 114

附錄:更新記錄..................................................................................................................................................................................................... 115

=======================================

更多精品教程盡在【perfect教程】

http://shop117393101.taobao.com

如地址失效,可聯繫Q1871209564

=======================================

非此地址購買得到,均爲二次倒賣、翻錄

獲得的視頻不完整、無售後保障

本店長期更新黑馬Android視頻

一次購買終身售後

=======================================

                          Android面試寶典-V1

1. 內容介紹

該面試寶典不只收錄了本人親身面試遇到的問題,還收錄了從黑馬學子那裏收集過來的問題。在之後的工做中本人也會不斷的更新和充實該面試寶典,固然也但願你們可以多多奉獻比較優質的面試題。

該面試寶典不只展現了常見的面試問題以及回答技巧,還詳細講解了每一道題所包含的知識點,讓黑馬學子不只知其然,更知其因此然。

本人的面試實戰記錄發佈在黑馬論壇:http://bbs.itheima.com/thread-196394-1-1.html

你們能夠訪問上面的網址,經過陽哥的實戰記錄略微感知一下真實面試的狀況,從中學習一些面試技巧以便讓本身在將來的面試中可以駕輕就熟,順利拿到本身喜歡的offer。

2. JavaSE基礎(★★)

有人可能會問對於咱們學Android的同窗來說,面試還會問Java基礎嗎?答案是會的,可是不會太多,所以我給了兩顆星的重要程度。通常筆試的時候出現java基礎題的機率比較大,口頭面試的時候比較少,好比本身在面試的時候一些對基礎知識比較看重的面試官會深究着Java基礎去問,好比問你異常的類型以及處理方式,集合的體系結構等等。

1、Java面向對象思想

一、面向對象都有哪些特性以及你對這些特性的理解

 繼承:繼承是從已有類獲得繼承信息建立新類的過程。提供繼承信息的類被稱爲父類(超類、基類);獲得繼承信息的類被稱爲子類(派生類)。繼承讓變化中的軟件系統有了必定的延續性,同時繼承也是封裝程序中可變因素的重要手段。

 封裝:一般認爲封裝是把數據和操做數據的方法綁定起來,對數據的訪問只能經過已定義的接口。面向對象的本質就是將現實世界描繪成一系列徹底自治、封閉的對象。咱們在類中編寫的方法就是對實現細節的一種封裝;咱們編寫一個類就是對數據和數據操做的封裝。能夠說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口。

 多態性:多態性是指容許不一樣子類型的對象對同一消息做出不一樣的響應。簡單的說就是用一樣的對象引用調用一樣的方法可是作了不一樣的事情。多態性分爲編譯時的多態性和運行時的多態性。若是將對象的方法視爲對象向外界提供的服務,那麼運行時的多態性能夠解釋爲:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來講都是透明的。方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),而方法重寫(override)實現的是運行時的多態性(也稱爲後綁定)。運行時的多態是面向對象最精髓的東西,要實現多態須要作兩件事:1. 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法);2. 對象造型(用父類型引用引用子類型對象,這樣一樣的引用調用一樣的方法就會根據子類對象的不一樣而表現出不一樣的行爲)。

 抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。

2、Java中的多態

一、Java中實現多態的機制是什麼?

靠的是父類或接口定義的引用變量能夠指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

3、Java的異常處理

一、Java中異常分爲哪些種類

1)按照異常須要處理的時機分爲編譯時異常也叫CheckedException和運行時異常也叫RuntimeException。只有java語言提供了Checked異常,Java認爲Checked異常都是能夠被處理的異常,因此Java程序必須顯式處理Checked異常。若是程序沒有處理Checked異常,該程序在編譯時就會發生錯誤沒法編譯。這體現了Java的設計哲學:沒有完善錯誤處理的代碼根本沒有機會被執行。對Checked異常處理方法有兩種:

1 當前方法知道如何處理該異常,則用try...catch塊來處理該異常。

2 當前方法不知道如何處理,則在定義該方法是聲明拋出該異常。

運行時異常只有當代碼在運行時才發行的異常,編譯時不須要try catch。Runtime如除數是0和數組下標越界等,其產生頻繁,處理麻煩,若顯示申明或者捕獲將會對程序的可讀性和運行效率影響很大。因此由系統自動檢測並將它們交給缺省的異常處理程序。固然若是你有處理要求也能夠顯示捕獲它們。

二、調用下面的方法,獲得的返回值是什麼

 

代碼在走到第3行的時候雨大了一個MathException,這時第四行的代碼就不會執行了,代碼直接跳轉到catch語句中,走到第6行的時候,異常機制有這麼一個原則若是在catch中遇到了return或者異常等能使該函數終止的話那麼用finally就必須先執行完finally代碼塊裏面的代碼而後再返回值。所以代碼又跳到第8行,惋惜第8行是一個return語句,那麼這個時候方法就結束了,所以第6行的返回結果就沒法被真正返回。若是finally僅僅是處理了一個釋放資源的操做,那麼該道題最終返回的結果就是2。

所以上面返回值是3。

4、Java的數據類型

一、Java的基本數據類型都有哪些各佔幾個字節

Java有8種基本數據類型

byte 1

char 2

sort 2

int 4

float 4

double 8

long 8

boolean 1(boolean類型比較特別可能只佔一個bit,多個boolean可能共同佔用一個字節)

二、String是基本數據類型嗎?能夠被繼承嗎?

String是引用類型,底層用char數組實現的。由於String是final類,在java中被final修飾的類不能被繼承,所以String固然不能夠被繼承。

 

5、Java的IO

一、Java中有幾種類型的流

字節流和字符流。字節流繼承於InputStream和OutputStream,字符流繼承於InputStreamReader 和OutputStreamWriter。

二、字節流如何轉爲字符流

字節輸入流轉字符輸入流經過InputStreamReader實現,該類的構造函數能夠傳入InputStream對象。

字節輸出流轉字符輸出流經過OutputStreamWriter實現,該類的構造函數能夠傳入OutputStream對象。

三、如何將一個java對象序列化到文件裏

在java中可以被序列化的類必須先實現Serializable接口,該接口沒有任何抽象方法只是起到一個標記做用。

 

6、Java的集合

一、HashMap排序題,上機題。(本人主要靠這道題入職的第一家公司)

已知一個HashMap<Integer,User>集合, User有name(String)和age(int)屬性。請寫一個方法實現對HashMap的排序功能,該方法接收HashMap<Integer,User>爲形參,返回類型爲HashMap<Integer,User>,要求對HashMap中的User的age倒序進行排序。排序時key=value鍵值對不得拆散。

:要作出這道題必須對集合的體系結構很是的熟悉。HashMap自己就是不可排序的,可是該道題恰恰讓給HashMap排序,那咱們就得想在API中有沒有這樣的Map結構是有序的,LinkedHashMap,對的,就是他,他是Map結構,也是鏈表結構,有序的,更可喜的是他是HashMap的子類,咱們返回LinkedHashMap<Integer,User>便可,還符合面向接口(父類編程的思想)。

但凡是對集合的操做,咱們應該保持一個原則就是能用JDK中的API就有JDK中的API,好比排序算法咱們不該該去用冒泡或者選擇,而是首先想到用Collections集合工具類。 users = new HashMap<>(); users.put(1, new User("張三", 25)); users.put(3, new User("李四", 22)); users.put(2, new User("王五", 28)); System.out.println(users); HashMap<integer,user> sortHashMap = sortHashMap(users); System.out.println(sortHashMap); /** * 控制檯輸出內容 * {1=User [name=張三, age=25], 2=User [name=王五, age=28], 3=User [name=李四, age=22]} {2=User [name=王五, age=28], 1=User [name=張三, age=25], 3=User [name=李四, age=22]} */ } public static HashMap<integer, user=""> sortHashMap(HashMap<integer, user=""> map) { // 首先拿到map的鍵值對集合 Set<entry<integer, user="">> entrySet = map.entrySet(); // 將set集合轉爲List集合,爲何,爲了使用工具類的排序方法 List<entry<integer, user="">> list = new ArrayList<entry<integer, user="">>(entrySet); " v:shapes="_x0000_s1091">

 

>() { @Override public int compare(Entry<integer, user=""> o1, Entry<integer, user=""> o2) { //按照要求根據User的age的倒序進行排 return o2.getValue().getAge()-o1.getValue().getAge(); } }); //建立一個新的有序的HashMap子類的集合 LinkedHashMap<integer, user=""> linkedHashMap = new LinkedHashMap<integer, user="">(); //將List中的數據存儲在LinkedHashMap中 for(Entry<integer, user=""> entry : list){ linkedHashMap.put(entry.getKey(), entry.getValue()); } //返回結果 return linkedHashMap; } } " v:shapes="_x0000_s1090">

二、集合的安全性問題

請問ArrayList、HashSet、HashMap是線程安全的嗎?若是不是我想要線程安全的集合怎麼辦?

咱們都看過上面那些集合的源碼(若是沒有那就看看吧),每一個方法都沒有加鎖,顯然都是線程不安全的。話又說過來若是他們安全了也就沒第二問了。

在集合中Vector和HashTable卻是線程安全的。你打開源碼會發現其實就是把各自核心方法添加上了synchronized關鍵字。

Collections工具類提供了相關的API,可讓上面那3個不安全的集合變爲安全的。

 

上面幾個函數都有對應的返回值類型,傳入什麼類型返回什麼類型。打開源碼其實實現原理很是簡單,就是將集合的核心方法添加上了synchronized關鍵字。

7、Java的多線程

一、多線程的兩種建立方式

java.lang.Thread 類的實例就是一個線程可是它須要調用java.lang.Runnable接口來執行,因爲線程類自己就是調用的Runnable接口因此你能夠繼承java.lang.Thread 類或者直接實現Runnable接口來重寫run()方法實現線程。

二、在java中wait和sleep方法的不一樣?

最大的不一樣是在等待時wait會釋放鎖,而sleep一直持有鎖。wait一般被用於線程間交互,sleep一般被用於暫停執行。

三、synchronized和volatile關鍵字的做用

一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾以後,那麼就具有了兩層語義:

  1)保證了不一樣線程對這個變量進行操做時的可見性,即一個線程修改了某個變量的值,這新值對其餘線程來講是當即可見的。

  2)禁止進行指令重排序。

volatile本質是在告訴jvm當前變量在寄存器(工做內存)中的值是不肯定的,須要從主存中讀取;

synchronized則是鎖定當前變量,只有當前線程能夠訪問該變量,其餘線程被阻塞住。

1.volatile僅能使用在變量級別;

synchronized則能夠使用在變量、方法、和類級別的

2.volatile僅能實現變量的修改可見性,並不能保證原子性;

synchronized則能夠保證變量的修改可見性和原子性

3.volatile不會形成線程的阻塞;

synchronized可能會形成線程的阻塞。

4.volatile標記的變量不會被編譯器優化;

synchronized標記的變量能夠被編譯器優化

四、分析代碼解釋緣由

 

上面的代碼執行完後輸出的結果肯定爲1000嗎?

答案是不必定,或者不等於1000。這是爲何嗎?

在 java 的內存模型中每個線程運行時都有一個線程棧,線程棧保存了線程運行時候變量值信息。當線程訪問某一個對象時候值的時候,首先經過對象的引用找到對應在堆內存的變量的值,而後把堆內存變量的具體值load到線程本地內存中,創建一個變量副本,以後線程就再也不和對象在堆內存變量值有任何關係,而是直接修改副本變量的值,在修改完以後的某一個時刻(線程退出以前),自動把線程變量副本的值回寫到對象在堆中變量。這樣在堆中的對象的值就產生變化了。

也就是說上面主函數中開啓了1000個子線程,每一個線程都有一個變量副本,每一個線程修改變量只是臨時修改了本身的副本,當線程結束時再將修改的值寫入在主內存中,這樣就出現了線程安全問題。所以結果就不可能等於1000了,通常都會小於1000。

上面的解釋用一張圖表示以下:

(圖片來自網絡,非本人所繪)

 

五、什麼是線程池,如何使用?

線程池就是事先將多個線程對象放到一個容器中,當使用的時候就不用new線程而是直接去池中拿線程便可,節省了開闢子線程的時間,提升的代碼執行效率。

在JDK的java.util.concurrent.Executors中提供了生成多種線程池的靜態方法。

 

而後調用他們的execute方法便可。

3. JavaSE高級(★★)

1、Java中的反射

一、說說你對Java中反射的理解

Java中的反射首先是可以獲取到Java中要反射類的字節碼,獲取字節碼有三種方法,1.Class.forName(className) 2.類名.class 3.this.getClass()。而後將字節碼中的方法,變量,構造函數等映射成相應的Method、Filed、Constructor等類,這些類提供了豐富的方法能夠被咱們所使用。

2、Java中的動態代理

一、寫一個ArrayList的動態代理類(筆試題)

list = new ArrayList(); List proxyInstance = (List) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(list, args); } }); proxyInstance.add("你好"); System.out.println(list); " v:shapes="_x0000_s1086">

3、Java中的設計模式

一、你所知道的設計模式有哪些

Java中通常認爲有23種設計模式,咱們不須要全部的都會,可是其中經常使用的幾種設計模式應該去掌握。下面列出了全部的設計模式。須要掌握的設計模式我單獨列出來了,固然能掌握的越多越好。

整體來講設計模式分爲三大類:

建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

二、單例設計模式

最好理解的一種設計模式,分爲懶漢式和餓漢式。

 餓漢式:

 

 懶漢式:

 

三、工廠設計模式

工廠模式分爲工廠方法模式和抽象工廠模式。

 工廠方法模式

工廠方法模式分爲三種:普通工廠模式,就是創建一個工廠類,對實現了同一接口的一些類進行實例的建立。

多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,若是傳遞的字符串出錯,則不能正確建立對象,而多個工廠方法模式是提供多個工廠方法,分別建立對象。

靜態工廠方法模式,將上面的多個工廠方法模式裏的方法置爲靜態的,不須要建立實例,直接調用便可。

 普通工廠模式

 

 多個工廠方法模式

該模式是對普通工廠方法模式的改進,在普通工廠方法模式中,若是傳遞的字符串出錯,則不能正確建立對象,而多個工廠方法模式是提供多個工廠方法,分別建立對象。

 

 靜態工廠方法模式,將上面的多個工廠方法模式裏的方法置爲靜態的,不須要建立實例,直接調用便可。

 

 抽象工廠模式

工廠方法模式有一個問題就是,類的建立依賴工廠類,也就是說,若是想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,因此,從設計角度考慮,有必定的問題,如何解決?就用到抽象工廠模式,建立多個工廠類,這樣一旦須要增長新的功能,直接增長新的工廠類就能夠了,不須要修改以前的代碼。

 

 

四、建造者模式(Builder)

工廠類模式提供的是建立單個類的模式,而建造者模式則是將各類產品集中起來進行管理,用來建立複合對象,所謂複合對象就是指某個類具備不一樣的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來獲得的。

list = new ArrayList(); public void produceMailSender(int count) { for (int i = 0; i < count; i++) { list.add(new MailSender()); } } public void produceSmsSender(int count) { for (int i = 0; i < count; i++) { list.add(new SmsSender()); } } } " v:shapes="_x0000_s1078">

 

五、適配器設計模式

 適配器模式將某個類的接口轉換成客戶端指望的另外一個接口表示,目的是消除因爲接口不匹配所形成的類的兼容性問題。主要分爲三類:類的適配器模式、對象的適配器模式、接口的適配器模式。

 類的適配器模式

 

 對象的適配器模式

基本思路和類的適配器模式相同,只是將Adapter類做修改,此次不繼承Source類,而是持有Source類的實例,以達到解決兼容性的問題。

 

 接口的適配器模式

接口的適配器是這樣的:有時咱們寫的一個接口中有多個抽象方法,當咱們寫該接口的實現類時,必須實現該接口的全部方法,這明顯有時比較浪費,由於並非全部的方法都是咱們須要的,有時只須要某一些,此處爲了解決這個問題,咱們引入了接口的適配器模式,藉助於一個抽象類,該抽象類實現了該接口,實現了全部的方法,而咱們不和原始的接口打交道,只和該抽象類取得聯繫,因此咱們寫一個類,繼承該抽象類,重寫咱們須要的方法就行。

六、裝飾模式(Decorator)

顧名思義,裝飾模式就是給一個對象增長一些新的功能,並且是動態的,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例。

 

七、策略模式(strategy)

策略模式定義了一系列算法,並將每一個算法封裝起來,使他們能夠相互替換,且算法的變化不會影響到使用算法的客戶。須要設計一個接口,爲一系列實現類提供統一的方法,多個實現類實現該接口,設計一個抽象類(無關緊要,屬於輔助類),提供輔助函數。策略模式的決定權在用戶,系統自己提供不一樣算法的實現,新增或者刪除算法,對各類算法作封裝。所以,策略模式多用在算法決策系統中,外部用戶只須要決定用哪一個算法便可。

 

 

八、觀察者模式(Observer)

觀察者模式很好理解,相似於郵件訂閱和RSS訂閱,當咱們瀏覽一些博客或wiki時,常常會看到RSS圖標,就這的意思是,當你訂閱了該文章,若是後續有更新,會及時通知你。其實,簡單來說就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,而且隨着變化!對象之間是一種一對多的關係。

 

vector = new Vector(); @Override public void add(Observer observer) { vector.add(observer); } @Override public void del(Observer observer) { vector.remove(observer); } @Override public void notifyObservers() { Enumeration enumo = vector.elements(); while (enumo.hasMoreElements()) { enumo.nextElement().update(); } } } public class MySubject extends AbstractSubject { @Override public void operation() { System.out.println("update self!"); notifyObservers(); } } public class ObserverTest { public static void main(String[] args) { Subject sub = new MySubject(); sub.add(new Observer1()); " v:shapes="_x0000_s1070">

 

4. Android基礎(★★★)

1、Android基本常識

一、寫10個簡單的linux命令

mkdir 建立文件夾

rmdir 刪除文件夾

rm 刪除文件

mv 移動文件

cp 拷貝文件

cat 查看文件

tail 查看文件尾部

more 分頁查看文件

cd 切換當前目錄

ls 列出文件清單

reboot 重啓

date 顯示日期

cal  顯示日曆

ps 查看系統進程至關於windows的任務管理器

ifconfig 配置網絡

二、書寫出android工程的目錄結構

src 源文件

gen 生成的文件 R文件就在此

android. jar 依賴的android sdk

assets 資源文件

    bin 生成的字節碼apk在此

libs 依賴jar和so

res 資源文件

drawable

drawable-hdpi

layout

menu

values

AndroidManifest.xml

project.properties

三、什麼是ANR 如何避免它?

在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。

不一樣的組件發生ANR的時間不同,主線程(Activity、Service)是5秒,BroadCastReceiver 是10秒。

解決方案:

將全部耗時操做,好比訪問網絡,Socket通訊,查詢大量SQL語句,複雜邏輯計算等都放在子線程中去,而後經過handler.sendMessage、runonUITread、AsyncTask等方式更新UI。不管如何都要確保用戶界面操做的流暢度。若是耗時操做須要讓用戶等待,那麼能夠在界面上顯示進度條。

四、談談Android的優勢和不足之處

優勢:

一、開放性,開源,免費,可定製

二、掙脫運營商束縛

三、豐富的硬件選擇

四、不受任何限制的開發商

五、無縫結合的Google應用

缺點:

一、安全問題、隱私問題

二、同質化嚴重

三、運營商對Android手機仍然有影響

四、山寨化嚴重

五、過度依賴開發商,缺少標準配置

五、一條最長的短信息約佔多少byte?

在國內的三大運營商一般狀況下中文70(包括標點),英文160個。對於國外的其餘運行商具體多長鬚要看運營商類型了。

android內部是經過以下代碼進行判斷具體一個短信多少byte的。

ArrayList<String> android.telephony.SmsManager.divideMessage(String text)

六、sim卡的EF文件有何做用?

基本文件EF(Elementary File)是SIM卡文件系統的一部分。

 

文件

文件標識符

文件縮寫

中文名稱

文件做用

MF

3F00

根目錄

備註:全部非ETSI GSM協議中規定的應用文件由各廠家自行定義在根目錄下(如:PIN1,PIN2…)

EFICCID

2FE2

ICCID

SIM卡惟一的識別號

包含運營商、卡商、髮卡時間、省市代碼等信息

DFGSM

7F20

GSM目錄

備註:根據ETSIGSM09.91的規定Phase2(或以上)的SIM卡中應該有7F21並指向7F20,用以兼容Phase1的手機

EFLP語言選擇

6F05

LP

語言選擇文件

包含一種或多種語言編碼

EFIMSI

6F07

IMSI

國際移動用戶識別符

包含SIM卡所對應的號段,好比46000表明135-139號段、46002表明1340-1348

EFKC語音加密密鑰

6F20

Kc

計算密鑰

用於SIM卡的加密、解密

EFPLMNsel網絡選擇表

6F30

PLMNsel

公共陸地網選擇

決定SIM卡選擇哪一種網絡,在這裏應該選擇中國移動的網絡

EFHPLMN歸屬地網絡選擇表

6F31

HPLMN

兩次搜索PLMN的時間間隔

兩次搜索中國移動的網絡的時間間隔

EFACMmax最大計費額

6F37

ACMmax

包含累積呼叫表的最大值

所有的ACM數據存在SIM卡中,此處取最大值

EFSST SIM卡服務表

6F38

SST

SIM卡服務列表

指出SIM卡能夠提供服務的種類,哪些業務被激活哪些業務沒有開通

EFACM累加計費計數器

6F39

ACM

累計呼叫列表

當前的呼叫和之前的呼叫的單位總和

EFGID1分組識別1

6F3E

GID1

1級分組識別文件

包含特定的SIM-ME組合的標識符,能夠識別一組特定的SIM卡

EFGID2分組識別2

6F3F

GID2

2級分組識別文件

包含特定的SIM-ME組合的標識符,能夠識別一組特定的SIM卡

EFPUCT單位價格/貨幣表

6F41

PUCT

呼叫單位的價格和貨幣表

PUCT是與計費通知有關的信息,ME用這個信息結合EFACM,以用戶選擇的貨幣來計算呼叫費用

EFCBMI小區廣播識別號

6F45

CBMI

小區廣播信息標識符

規定了用戶但願MS採納的小區廣播消息內容的類型

EFSPN服務提供商

6F46

SPN

服務提供商名稱

包含服務提供商的名稱和ME顯示的相應要求

EFCBMID

6F48

CBMID

數據下載的小區廣播消息識別符

移動臺將收到的CBMID傳送給SIM卡

EFSUME

6F54

SUME

創建菜單單元

創建SIM卡中的菜單

EFBCCH廣播信道

6F74

BCCH

廣播控制信道

因爲BCCH的存儲,在選擇小區時,MS能夠縮小對BCCH載波的搜索範圍

EFACC訪問控制級別

6F78

ACC

訪問控制級別

SIM卡有15個級別,10個普通級別,5個高級級別

EFFPLMN禁止網絡號

6F7B

FPLMN

禁用的PLMN

禁止選擇除中國移動之外的其餘運營商,好比中國聯通、中國衛通等

EFLOCI位置信息

6F7E

LOCI

 位置信息

存儲臨時移動用戶識別符、位置區信息等內容

EFAD管理數據

6FAD

AD

管理數據

包括關於不一樣類型SIM卡操做模式的信息。例如:常規模式(PLMN用戶用於GSM網絡操做),型號認證模式(容許ME在無線設備的認證期間的特殊應用);小區測試模式(在小區商用以前,進行小區測試),製造商特定模式(容許ME製造商在維護階段進行特定的性能自動測試)

EFPHASE階段

6FAE

PHASE

階段標識

標識SIM卡所處的階段信息,好比是普通SIM卡仍是STK卡等

DFTELECOM

7F10

電信目錄

 

 

EFADN縮位撥號

6F3A

AND

電話簿

用於將電話記錄存放在SIM卡中

EFFDN固定撥號

6F3B

FDN

固定撥號

包括固定撥號(FDN)和/或補充業務控制字串(SSC),還包括相關網絡/承載能力的識別符和擴展記錄的識別符,以及有關的α識別符

EFSMS短消息

6F3C

SMS

短消息

用於將短消息記錄存放在SIM卡中

EFCCP能力配置參數

6F3D

CCP

能力配置參數

包括所須要的網絡和承載能力的參數,以及當採用一個縮位撥號號碼,固定撥號號碼,MSISDN、最後撥號號碼、服務撥號號碼或禁止撥號方式等,創建呼叫時相關的ME配置

EFMSISDN電話號碼

6F40

MSISDN

移動基站國際綜合業務網號

存放用戶的手機號

EFSMSP短信息參數

6F42

SMSP

短消息業務參數

包括短信中心號碼等信息

EFSMSS短信息狀態

6F43

SMSS

短消息狀態

這個標識是用來控制流量的

EFLND最後撥號

6F44

LND

最後撥叫號碼

存儲最後撥叫號碼

EFExt1擴展文件1

6F4A

EXT1

擴展文件1

包括AND,MSISDN或LND的擴展數據

EFExt2擴展文件2

6F4B

EXT2

擴展文件2

包含FDN的擴展數據

 

七、如何判斷是否有SD卡?

 經過以下方法:

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

若是返回true就是有sdcard,若是返回false則沒有。

八、dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念?

dvm指dalvik的虛擬機。每個Android應用程序都擁有一個獨立的Dalvik虛擬機實例,應用程序都在它本身的進程中運行。而每個dvm都是在Linux 中的一個進程,因此說能夠近似認爲是同一個概念。

什麼是android DVM:Dalvik是Google公司本身設計用於Android平臺的Java虛擬機,每個Dalvik 應用做爲一個獨立的Linux 進程執行。獨立的進程能夠防止在虛擬機崩潰的時候全部程序都被關閉。

Dalvik和Java虛擬機的區別

1:Dalvik主要是完成對象生命週期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。   

2:Dalvik負責進程隔離和線程管理,每個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。

3:不一樣於Java虛擬機運行java字節碼,Dalvik虛擬機運行的是其專有的文件格式Dex

4: dex文件格式能夠減小總體文件尺寸,提升I/O操做的類查找速度。 

5: odex是爲了在運行過程當中進一步提升性能,對dex文件的進一步優化。   

6:全部的Android應用的線程都對應一個Linux線程,虛擬機於是能夠更多的依賴操做系統的線程調度和管理機制

7:有一個特殊的虛擬機進程Zygote,他是虛擬機實例的孵化器。它在系統啓動的時候就會產生,它會完成虛擬機的初始化,庫的加載,預製類庫和初始化的操做。若是系統須要一個新的虛擬機實例,它會迅速複製自身,以最快的數據提供給系統。對於一些只讀的系統庫,全部虛擬機實例都和Zygote共享一塊內存區域。

九、Android程序與Java程序的區別?

 Android程序用android sdk開發,java程序用javasdk開發.

Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,好比說界面部分,java.awt  swing  package除了java.awt.font被引用外,其餘都被拋棄,在Android平臺開發中不能使用。android sdk 添加工具jar httpclient , pull  opengl

十、啓動應用後,改變系統語言,應用的語言會改變麼?

這個通常是不會的,通常須要重啓應用才能改變應用語言。可是對應應用來講若是作了國際化處理則支持若是沒有處理那系統語言再更改也是無用的。

十一、請介紹下adb、ddms、aapt的做用

adb是Android Debug Bridge ,Android調試橋的意思,ddms是Dalvik Debug Monitor Service,dalvik調試監視服務。aapt即Android Asset Packaging Tool,在SDK的build-tools目錄下。該工具能夠查看,建立, 更新ZIP格式的文檔附件(zip, jar, apk)。也可將資源文件編譯成二進制文件,儘管咱們沒有直接使用過該工具,可是開發工具會使用這個工具打包apk文件構成一個Android 應用程序。

Android 的主要調試工具是adb(Android debuging bridge),ddms是一個在adb基礎上的一個圖形化工具。

adb,它是一個命令行工具。而ddms功能與adb相同,只是它有一個圖形化界面。對不喜歡命今操做方式的人來講是一個不錯的選擇。

十二、ddms 和traceview的區別

簡單的說ddms是一個程序執行查看器,在裏面能夠看見線程和堆棧等信息,traceView是程序性能分析器。

1三、補充知識:TraceView的使用

1、TraceView簡介

     Traceview是Android平臺特有的數據採集和分析工具,它主要用於分析Android中應用程序的hotspot(瓶頸)。Traceview自己只是一個數據分析工具,而數據的採集則須要使用Android SDK中的Debug類或者利用DDMS工具。兩者的用法以下:

開發者在一些關鍵代碼段開始前調用Android SDK中Debug類的startMethodTracing函數,並在關鍵代碼段結束前調用stopMethodTracing函數。這兩個函數運行過程當中將採集運行時間內該應用全部線程(注意,只能是Java線程)的函數執行狀況,並將採集數據保存到/mnt/sdcard/下的一個文件中。開發者而後須要利用SDK中的Traceview工具來分析這些數據。

藉助Android SDK中的DDMS工具。DDMS可採集系統中某個正在運行的進程的函數調用信息。對開發者而言,此方法適用於沒有目標應用源代碼的狀況。DDMS工具中Traceview的使用以下圖所示。

 

點擊上圖中所示按鈕便可以採集目標進程的數據。當中止採集時,DDMS會自動觸發Traceview工具來瀏覽採集數據。

下面,咱們經過一個示例程序介紹Traceview的使用。

實例程序以下圖所示:界面有4個按鈕,對應四個方法。

 

點擊不一樣的方法會進行不一樣的耗時操做。

 

 

咱們分別點擊按鈕一次,要求找出最耗時的方法。點擊前經過DDMS 啓動 Start Method Profiling按鈕。

 

而後依次點擊4個按鈕,都執行後再次點擊上圖中紅框中按鈕,中止收集數據。

接下來咱們開始對數據進行分析。

當咱們中止收集數據的時候會出現以下分析圖表。該圖表分爲2大部分,上面分不一樣的行,每一行表明一個線程的執行耗時狀況。main線程對應行的的內容很是豐富,而其餘線程在這段時間內幹得工做則要少得多。圖表的下半部分是具體的每一個方法執行的時間狀況。顯示方法執行狀況的前提是先選中某個線程。

 

 

咱們主要是分析main線程。

上面方法指標參數所表明的意思以下:

列名

描述

Name

該線程運行過程當中所調用的函數名

Incl Cpu Time

某函數佔用的CPU時間,包含內部調用其它函數的CPU時間

Excl Cpu Time

某函數佔用的CPU時間,但不含內部調用其它函數所佔用的CPU時間

Incl Real Time

某函數運行的真實時間(以毫秒爲單位),內含調用其它函數所佔用的真實時間

Excl Real Time

某函數運行的真實時間(以毫秒爲單位),不含調用其它函數所佔用的真實時間

Call+Recur Calls/Total

某函數被調用次數以及遞歸調用佔總調用次數的百分比

Cpu Time/Call

某函數調用CPU時間與調用次數的比。至關於該函數平均執行時間

Real Time/Call

同CPU Time/Call相似,只不過統計單位換成了真實時間

咱們爲了找到最耗時的操做,那麼能夠經過點擊Incl Cpu Time,讓其按照時間的倒序排列。我點擊後效果以下圖:

 

經過分析發現:method1最耗時,耗時2338毫秒。

 

那麼有了上面的信息咱們能夠進入咱們的method1方法查看分析咱們的代碼了。

2、Activity

一、什麼是Activity?

四大組件之一,一般一個用戶交互界面對應一個activity。activity 是Context的子類,同時實現了window.callback和keyevent.callback, 能夠處理與窗體用戶交互的事件。

常見的Activity類型有FragmentActivitiy,ListActivity,TabAcitivty等。

若是界面有共同的特色或者功能的時候,還會本身定義一個BaseActivity。

二、請描述一下Activity 生命週期

Activity從建立到銷燬有多種狀態,從一種狀態到另外一種狀態時會激發相應的回調方法,這些回調方法包括:onCreate onStart onResume onPause onStop onDestroy

其實這些方法都是兩兩對應的,onCreate建立與onDestroy銷燬;

onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;

這6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在何時調用呢?

答案就是:在Activity被onStop後,可是沒有被onDestroy,在再次啓動此Activity時就調用onRestart(而再也不調用onCreate)方法;

若是被onDestroy了,則是調用onCreate方法。

三、如何保存Activity的狀態?

Activity的狀態一般狀況下系統會自動保存的,只有當咱們須要保存額外的數據時才須要使用到這樣的功能。

通常來講, 調用onPause()和onStop()方法後的activity實例仍然存在於內存中, activity的全部信息和狀態數據不會消失, 當activity從新回到前臺以後, 全部的改變都會獲得保留。

可是當系統內存不足時, 調用onPause()和onStop()方法後的activity可能會被系統摧毀, 此時內存中就不會存有該activity的實例對象了。若是以後這個activity從新回到前臺, 以前所做的改變就會消失。爲了不此種狀況的發生, 咱們能夠覆寫onSaveInstanceState()方法。onSaveInstanceState()方法接受一個Bundle類型的參數, 開發者能夠將狀態數據存儲到這個Bundle對象中, 這樣即便activity被系統摧毀, 當用戶從新啓動這個activity而調用它的onCreate()方法時, 上述的Bundle對象會做爲實參傳遞給onCreate()方法, 開發者能夠從Bundle對象中取出保存的數據, 而後利用這些數據將activity恢復到被摧毀以前的狀態。

須要注意的是, onSaveInstanceState()方法並非必定會被調用的, 由於有些場景是不須要保存狀態數據的. 好比用戶按下BACK鍵退出activity時, 用戶顯然想要關閉這個activity, 此時是沒有必要保存數據以供下次恢復的, 也就是onSaveInstanceState()方法不會被調用. 若是調用onSaveInstanceState()方法, 調用將發生在onPause()或onStop()方法以前。

 

四、兩個Activity之間跳轉時必然會執行的是哪幾個方法?

通常狀況下好比說有兩個activity,分別叫A,B,當在A裏面激活B組件的時候, A會調用 onPause()方法,而後B調用onCreate() ,onStart(), onResume()。

 這個時候B覆蓋了窗體, A會調用onStop()方法.  若是B是個透明的,或者是對話框的樣式, 就不會調用A的onStop()方法。

五、橫豎屏切換時Activity的生命週期

此時的生命週期跟清單文件裏的配置有關係。

一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期

默認首先銷燬當前activity,而後從新加載。

二、設置Activity的android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法。

一般在遊戲開發, 屏幕的朝向都是寫死的。

六、如何將一個Activity設置成窗口的樣式

只須要給咱們的Activity配置以下屬性便可。

 android:theme="@android:style/Theme.Dialog"

七、如何退出Activity?如何安全退出已調用多個Activity的Application?

一、一般狀況用戶退出一個Activity只需按返回鍵,咱們寫代碼想退出activity直接調用finish()方法就行。

二、記錄打開的Activity:

每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。

lists ;// 在application 全局的變量裏面 lists = new ArrayList(); lists.add(this); for(Activity activity: lists) { activity.finish(); } lists.remove(this); " v:shapes="_x0000_s1067">

三、發送特定廣播:

在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。

//給某個activity 註冊接受接受廣播的意圖  

       registerReceiver(receiver, filter)

//若是過接受到的是 關閉activity的廣播  就調用finish()方法 把當前的activity finish()掉

四、遞歸退出

在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。

五、其實 也能夠經過 intent的flag 來實現intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的activity。此時若是該任務棧中已經有該Activity,那麼系統會把這個Activity上面的全部Activity幹掉。其實至關於給Activity配置的啓動模式爲SingleTop。

 

八、請描述一下Activity的啓動模式都有哪些以及各自的特色

啓動模式(launchMode)在多個Activity跳轉的過程當中扮演着重要的角色,它能夠決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其餘Activity實例公用一個task裏。這裏簡單介紹一下task的概念,task是一個具備棧結構的對象,一個task能夠管理多個Activity,啓動一個應用,也就建立一個與之對應的task。

Activity一共有如下四種launchMode:

 1.standard

 2.singleTop

 3.singleTask

 4.singleInstance

咱們能夠在AndroidManifest.xml配置<activity>的android:launchMode屬性爲以上四種之一便可。

下面咱們結合實例一一介紹這四種lanchMode:

8.1 standard

standard模式是默認的啓動模式,不用爲<activity>配置android:launchMode屬性便可,固然也能夠指定值爲standard。

咱們將建立一個Activity,命名爲FirstActivity,來演示一下標準的啓動模式。FirstActivity代碼以下:

 

FirstActivity界面中的TextView用於顯示當前Activity實例的序列號,Button用於跳轉到下一個FirstActivity界面。

而後咱們連續點擊幾回按鈕,將會出現下面的現象:

 

 

 

咱們注意到都是FirstActivity的實例,但序列號不一樣,而且咱們須要連續按後退鍵兩次,才能回到第一個FirstActivity。standard模式的原理以下圖所示:

 

如圖所示,每次跳轉系統都會在task中生成一個新的FirstActivity實例,而且放於棧結構的頂部,當咱們按下後退鍵時,才能看到原來的FirstActivity實例。

這就是standard啓動模式,無論有沒有已存在的實例,都生成新的實例。

8.2 singleTop

咱們在上面的基礎上爲<activity>指定屬性android:launchMode="singleTop",系統就會按照singleTop啓動模式處理跳轉行爲。咱們重複上面幾個動做,將會出現下面的現象:

 

 

 

咱們看到這個結果跟standard有所不一樣,三個序列號是相同的,也就是說使用的都是同一個FirstActivity實例;若是按一下後退鍵,程序當即退出,說明當前棧結構中只有一個Activity實例。singleTop模式的原理以下圖所示:

 

正如上圖所示,跳轉時系統會先在棧結構中尋找是否有一個FirstActivity實例正位於棧頂,若是有則再也不生成新的,而是直接使用。也許朋友們會有疑問,我只看到棧內只有一個Activity,若是是多個Activity怎麼辦,若是不是在棧頂會如何?咱們接下來再經過一個示例來證明一下你們的疑問。

咱們再新建一個Activity命名爲SecondActivity,以下:

 

而後將以前的FirstActivity跳轉代碼改成:

 

這時候,FirstActivity會跳轉到SecondActivity,SecondActivity又會跳轉到FirstActivity。演示結果以下:

 

 

 

咱們看到,兩個FirstActivity的序列號是不一樣的,證實從SecondActivity跳轉到FirstActivity時生成了新的FirstActivity實例。原理圖以下:

 

咱們看到,當從SecondActivity跳轉到FirstActivity時,系統發現存在有FirstActivity實例,但不是位於棧頂,因而從新生成一個實例。

這就是singleTop啓動模式,若是發現有對應的Activity實例正位於棧頂,則重複利用,再也不生成新的實例。

8.3 singleTask

在上面的基礎上咱們修改FirstActivity的屬性android:launchMode="singleTask"。演示的結果以下:

 

 

咱們注意到,在上面的過程當中,FirstActivity的序列號是不變的,SecondActivity的序列號卻不是惟一的,說明從SecondActivity跳轉到FirstActivity時,沒有生成新的實例,可是從FirstActivity跳轉到SecondActivity時生成了新的實例。singleTask模式的原理圖以下圖所示:

 

在圖中的下半部分是SecondActivity跳轉到FirstActivity後的棧結構變化的結果,咱們注意到,SecondActivity消失了,沒錯,在這個跳轉過程當中系統發現有存在的FirstActivity實例,因而再也不生成新的實例,而是將FirstActivity之上的Activity實例通通出棧,將FirstActivity變爲棧頂對象,顯示到幕前。也許朋友們有疑問,若是將SecondActivity也設置爲singleTask模式,那麼SecondActivity實例是否是能夠惟一呢?在咱們這個示例中是不可能的,由於每次從SecondActivity跳轉到FirstActivity時,SecondActivity實例都被迫出棧,下次等FirstActivity跳轉到SecondActivity時,找不到存在的SecondActivity實例,因而必須生成新的實例。可是若是咱們有ThirdActivity,讓SecondActivity和ThirdActivity互相跳轉,那麼SecondActivity實例就能夠保證惟一。

這就是singleTask模式,若是發現有對應的Activity實例,則使此Activity實例之上的其餘Activity實例通通出棧,使此Activity實例成爲棧頂對象,顯示到幕前。

8.4 singleInstance

這種啓動模式比較特殊,由於它會啓用一個新的棧結構,將Activity放置於這個新的棧結構中,並保證再也不有其餘Activity實例進入。

咱們修改FirstActivity的launchMode="standard",SecondActivity的launchMode="singleInstance",因爲涉及到了多個棧結構,咱們須要在每一個Activity中顯示當前棧結構的id,因此咱們爲每一個Activity添加以下代碼:

 

而後咱們再演示一下這個流程:

 

咱們發現這兩個Activity實例分別被放置在不一樣的棧結構中,關於singleInstance的原理圖以下

咱們看到從FirstActivity跳轉到SecondActivity時,從新啓用了一個新的棧結構,來放置SecondActivity實例,而後按下後退鍵,再次回到原始棧結構;圖中下半部分顯示的在SecondActivity中再次跳轉到FirstActivity,這個時候系統會在原始棧結構中生成一個FirstActivity實例,而後回退兩次,注意,並無退出,而是回到了SecondActivity,爲何呢?是由於從SecondActivity跳轉到FirstActivity的時候,咱們的起點變成了SecondActivity實例所在的棧結構,這樣一來,咱們須要「迴歸」到這個棧結構。

若是咱們修改FirstActivity的launchMode值爲singleTop、singleTask、singleInstance中的任意一個,流程將會如圖所示:

 

singleInstance啓動模式多是最複雜的一種模式,爲了幫助你們理解,我舉一個例子,假如咱們有一個share應用,其中的ShareActivity是入口Activity,也是可供其餘應用調用的Activity,咱們把這個Activity的啓動模式設置爲singleInstance,而後在其餘應用中調用。咱們編輯ShareActivity的配置:

" v:shapes="_x0000_s1062">

而後咱們在其餘應用中這樣啓動該Activity:

 

當咱們打開ShareActivity後再按後退鍵回到原來界面時,ShareActivity作爲一個獨立的個體存在,若是這時咱們打開share應用,無需建立新的ShareActivity實例便可看到結果,由於系統會自動查找,存在則直接利用。你們能夠在ShareActivity中打印一下taskId,看看效果。關於這個過程,原理圖以下:

 

3、Service

一、Service是否在main thread中執行, service裏面是否能執行耗時的操做?

默認狀況,若是沒有顯示的指servic所運行的進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)裏面。

service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件 )

特殊狀況 ,能夠在清單文件配置 service 執行所在的進程 ,讓service在另外的進程中執行

" v:shapes="_x0000_s1060">

二、Activity怎麼和Service綁定,怎麼在Activity中啓動本身對應的Service?

Activity經過bindService(Intent service, ServiceConnection conn, int flags)跟Service進行綁定,當綁定成功的時候Service會將代理對象經過回調的形式傳給conn,這樣咱們就拿到了Service提供的服務代理對象。

在Activity中能夠經過startService和bindService方法啓動Service。通常狀況下若是想獲取Service的服務對象那麼確定須要經過bindService()方法,好比音樂播放器,第三方支付等。若是僅僅只是爲了開啓一個後臺任務那麼能夠使用startService()方法。

三、請描述一下Service的生命週期

Service有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不一樣的使用方法生命週期方法也不一樣。

非綁定模式:當第一次調用startService的時候執行的方法依次爲onCreate()、onStartCommand(),當Service關閉的時候調用onDestory方法。

綁定模式:第一次bindService()的時候,執行的方法爲onCreate()、onBind()解除綁定的時候會執行onUnbind()、onDestory()。

上面的兩種生命週期是在相對單純的模式下的情形。咱們在開發的過程當中還必須注意Service實例只會有一個,也就是說若是當前要啓動的Service已經存在了那麼就不會再次建立該Service固然也不會調用onCreate()方法。

一個Service能夠被多個客戶進行綁定,只有全部的綁定對象都執行了onBind()方法後該Service纔會銷燬,不過若是有一個客戶執行了onStart()方法,那麼這個時候若是全部的bind客戶都執行了unBind()該Service也不會銷燬。

Service的生命週期圖以下所示,幫助你們記憶。

 

四、什麼是IntentService?有何優勢?

咱們一般只會使用Service,可能IntentService對大部分同窗來講都是第一次據說。那麼看了下面的介紹相信你就再也不陌生了。若是你仍是不瞭解那麼在面試的時候你就坦誠說沒用過或者不瞭解等。並非全部的問題都須要回答上來的。

1、IntentService簡介

IntentService是Service的子類,比普通的Service增長了額外的功能。先看Service自己存在兩個問題:

Service不會專門啓動一條單獨的進程,Service與它所在應用位於同一個進程中;

Service也不是專門一條新線程,所以不該該在Service中直接處理耗時的任務;

2、IntentService特徵

會建立獨立的worker線程來處理全部的Intent請求;

會建立獨立的worker線程來處理onHandleIntent()方法實現的代碼,無需處理多線程問題;

全部請求處理完成後,IntentService會自動中止,無需調用stopSelf()方法中止Service;

爲Service的onBind()提供默認實現,返回null;

爲Service的onStartCommand提供默認實現,將請求Intent添加到隊列中;

3、使用IntentService

本人寫了一個IntentService的使用例子供參考。該例子中一個MainActivity一個MyIntentService,這兩個類都是四大組件固然須要在清單文件中註冊。這裏只給出核心代碼:

MainActivity.java:

 

 

MyIntentService.java

 

運行後效果以下:

 

五、說說Activity、Intent、Service是什麼關係

他們都是Android開發中使用頻率最高的類。其中Activity和Service都是Android四大組件之一。他倆都是Context類的子類ContextWrapper的子類,所以他倆能夠算是兄弟關係吧。不過兄弟倆各有各自的本領,Activity負責用戶界面的顯示和交互,Service負責後臺任務的處理。Activity和Service之間能夠經過Intent傳遞數據,所以能夠把Intent看做是通訊使者。

六、Service和Activity在同一個線程嗎

對於同一app來講默認狀況下是在同一個線程中的,main Thread (UI Thread)。

七、Service裏面能夠彈吐司麼

能夠的。彈吐司有個條件就是得有一個Context上下文,而Service自己就是Context的子類,所以在Service裏面彈吐司是徹底能夠的。好比咱們在Service中完成下載任務後能夠彈一個吐司通知用戶。

4、BroadCastReceiver

一、請描述一下BroadcastReceiver

BroadCastReceiver是Android四大組件之一,主要用於接收系統或者app發送的廣播事件。

廣播分兩種:有序廣播和無序廣播。

內部通訊實現機制:經過Android系統的Binder機制實現通訊。

無序廣播:徹底異步,邏輯上能夠被任何廣播接收者接收到。優勢是效率較高。缺點是一個接收者不能將處理結果傳遞給下一個接收者,並沒有法終止廣播intent的傳播。

有序廣播:按照被接收者的優先級順序,在被接收者中依次傳播。好比有三個廣播接收者A,B,C,優先級是A > B > C。那這個消息先傳給A,再傳給B,最後傳給C。每一個接收者有權終止廣播,好比B終止廣播,C就沒法接收到。此外A接收到廣播後能夠對結果對象進行操做,當廣播傳給B時,B能夠從結果對象中取得A存入的數據。

在經過Context.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)時咱們能夠指定resultReceiver廣播接收者,這個接收者咱們能夠認爲是最終接收者,一般狀況下若是比他優先級更高的接收者若是沒有終止廣播,那麼他的onReceive會被執行兩次,第一次是正常的按照優先級順序執行,第二次是做爲最終接收者接收。若是比他優先級高的接收者終止了廣播,那麼他依然能接收到廣播。

在咱們的項目中常用廣播接收者接收系統通知,好比開機啓動、sd掛載、低電量、外播電話、鎖屏等。

若是咱們作的是播放器,那麼監聽到用戶鎖屏後咱們應該將咱們的播放之暫停等。

二、在manifest和代碼中如何註冊和使用BroadcastReceiver

在清單文件中註冊廣播接收者稱爲靜態註冊,在代碼中註冊稱爲動態註冊。靜態註冊的廣播接收者只要app在系統中運行則一直能夠接收到廣播消息,動態註冊的廣播接收者當註冊的Activity或者Service銷燬了那麼就接收不到廣播了。

靜態註冊:在清單文件中進行以下配置

" v:shapes="_x0000_s1057">

動態註冊:在代碼中進行以下注冊

 

三、BroadCastReceiver的生命週期

a. 廣播接收者的生命週期很是短暫的,在接收到廣播的時候建立,onReceive()方法結束以後銷燬;

b. 廣播接收者中不要作一些耗時的工做,不然會彈出Application No Response錯誤對話框;

c. 最好也不要在廣播接收者中建立子線程作耗時的工做,由於廣播接收者被銷燬後進程就成爲了空進程,很容易被系統殺掉;

d. 耗時的較長的工做最好放在服務中完成;

四、如何讓本身的廣播只讓指定的app接收(2015.09.02)

 

5、ContentProvider

一、請介紹下ContentProvider是如何實現數據共享的

在Android中若是想將本身應用的數據(通常多爲數據庫中的數據)提供給第三發應用,那麼咱們只能經過ContentProvider來實現了。

ContentProvider是應用程序之間共享數據的接口。使用的時候首先自定義一個類繼承ContentProvider,而後覆寫query、insert、update、delete等方法。由於其是四大組件之一所以必須在AndroidManifest文件中進行註冊。

" v:shapes="_x0000_s1055">

第三方能夠經過ContentResolver來訪問該Provider。

二、請介紹下Android的數據存儲方式

File存儲

SharedPreference存儲

ContentProvider存儲

SQLiteDataBase存儲

網絡存儲

三、爲何要用ContentProvider?它和sql的實現上有什麼差異?

ContentProvider屏蔽了數據存儲的細節,內部實現對用戶徹底透明,用戶只須要關心操做數據的uri就能夠了,ContentProvider能夠實現不一樣app之間共享。

       Sql也有增刪改查的方法,可是sql只能查詢本應用下的數據庫。而ContentProvider 還能夠去增刪改查本地文件. xml文件的讀取等。

四、說說ContentProvider、ContentResolver、ContentObserver之間的關係

ContentProvider 內容提供者,用於對外提供數據

ContentResolver.notifyChange(uri)發出消息

ContentResolver 內容解析者,用於獲取內容提供者提供的數據

ContentObserver 內容監聽器,能夠監聽數據的改變狀態

ContentResolver.registerContentObserver()監聽消息。

6、Android中的佈局

一、Android中經常使用的佈局都有哪些

FrameLayout

RelativeLayout

LinearLayout

AbsoluteLayout

TableLayout

二、談談UI中, Padding和Margin有什麼區別?

android:padding和android:layout_margin的區別,其實概念很簡單,padding是站在父view的角度描述問題,它規定它裏面的內容必須與這個父view邊界的距離。margin則是站在本身的角度描述問題,規定本身和其餘(上下左右)的view之間的距離,若是同一級只有一個view,那麼它的效果基本上就和padding同樣了。

 

7、ListView

一、ListView如何提升其效率?

① 複用ConvertView

② 自定義靜態類ViewHolder

③ 使用分頁加載

④ 使用WeakRefrence引用ImageView對象

二、當ListView數據集改變後,如何更新ListView

使用該ListView的adapter的notifyDataSetChanged()方法。該方法會使ListView從新繪製。

三、ListView如何實現分頁加載

      ① 設置ListView的滾動監聽器:setOnScrollListener(new OnScrollListener{….})

在監聽器中有兩個方法: 滾動狀態發生變化的方法(onScrollStateChanged)和listView被滾動時調用的方法(onScroll)

      ② 在滾動狀態發生改變的方法中,有三種狀態:

手指按下移動的狀態:                     SCROLL_STATE_TOUCH_SCROLL: // 觸摸滑動

慣性滾動(滑翔(flgin)狀態):     SCROLL_STATE_FLING: // 滑翔

靜止狀態:                                SCROLL_STATE_IDLE: // 靜止

 對不一樣的狀態進行處理:

分批加載數據,只關心靜止狀態:關心最後一個可見的條目,若是最後一個可見條目就是數據適配器(集合)裏的最後一個,此時可加載更多的數據。在每次加載的時候,計算出滾動的數量,當滾動的數量大於等於總數量的時候,能夠提示用戶無更多數據了。

四、ListView能夠顯示多種類型的條目嗎

這個固然能夠的,ListView顯示的每一個條目都是經過baseAdapter的getView(int position, View convertView, ViewGroup parent)來展現的,理論上咱們徹底可讓每一個條目都是不一樣類型的view,除此以外adapter還提供了getViewTypeCount()和getItemViewType(int position)兩個方法。在getView方法中咱們能夠根據不一樣的viewtype加載不一樣的佈局文件。

五、ListView如何定位到指定位置

能夠經過ListView提供的lv.setSelection(48);方法。

六、如何在ScrollView中如何嵌入ListView

一般狀況下咱們不會在ScrollView中嵌套ListView,可是若是面試官非讓我嵌套的話也是能夠的。

在ScrollView添加一個ListView會致使listview控件顯示不全,一般只會顯示一條,這是由於兩個控件的滾動事件衝突致使。因此須要經過listview中的item數量去計算listview的顯示高度,從而使其完整展現,以下提供一個方法供你們參考。

 

 

七、ListView中如何優化圖片

圖片的優化策略比較多。

一、處理圖片的方式:

若是ListView中自定義的Item中有涉及到大量圖片的,必定要對圖片進行細心的處理,由於圖片佔的內存是ListView項中最頭疼的,處理圖片的方法大體有如下幾種:

①、不要直接拿路徑就去循環BitmapFactory.decodeFile;使用Options保存圖片大小、不要加載圖片到內存去。

②、對圖片必定要通過邊界壓縮尤爲是比較大的圖片,若是你的圖片是後臺服務器處理好的那就不須要了

③、在ListView中取圖片時也不要直接拿個路徑去取圖片,而是以WeakReference(使用WeakReference代替強引用。好比能夠使用WeakReference mContextRef)、SoftReference、WeakHashMap等的來存儲圖片信息。

④、在getView中作圖片轉換時,產生的中間變量必定及時釋放

二、異步加載圖片基本思想:

1)、 先從內存緩存中獲取圖片顯示(內存緩衝)

2)、獲取不到的話從SD卡里獲取(SD卡緩衝)

3)、都獲取不到的話從網絡下載圖片並保存到SD卡同時加入內存並顯示(視狀況看是否要顯示)

原理:

優化一:先從內存中加載,沒有則開啓線程從SD卡或網絡中獲取,這裏注意從SD卡獲取圖片是放在子線程裏執行的,不然快速滑屏的話會不夠流暢。

優化二:於此同時,在adapter裏有個busy變量,表示listview是否處於滑動狀態,若是是滑動狀態則僅從內存中獲取圖片,沒有的話無需再開啓線程去外存或網絡獲取圖片。

優化三:ImageLoader裏的線程使用了線程池,從而避免了過多線程頻繁建立和銷燬,若是每次老是new一個線程去執行這是很是不可取的,好一點的用的AsyncTask類,其實內部也是用到了線程池。在從網絡獲取圖片時,先是將其保存到sd卡,而後再加載到內存,這麼作的好處是在加載到內存時能夠作個壓縮處理,以減小圖片所佔內存。

八、ListView中圖片錯位的問題是如何產生的

圖片錯位問題的本質源於咱們的listview使用了緩存convertView,假設一種場景,一個listview一屏顯示九個item,那麼在拉出第十個item的時候,事實上該item是重複使用了第一個item,也就是說在第一個item從網絡中下載圖片並最終要顯示的時候,其實該item已經不在當前顯示區域內了,此時顯示的後果將可能在第十個item上輸出圖像,這就致使了圖片錯位的問題。因此解決之道在於可見則顯示,不可見則不顯示。

九、Java中引用類型都有哪些

Java中對象的引用分爲四種級別,這四種級別由高到低依次爲:強引用、軟引用、弱引用和虛引用。

 強引用(StrongReference)

這個就很少說,咱們寫代碼每天在用的就是強引用。若是一個對象被被人擁有強引用,那麼垃圾回收器毫不會回收它。當內存空間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具備強引用的對象來解決內存不足問題。

Java的對象是位於heap中的,heap中對象有強可及對象、軟可及對象、弱可及對象、虛可及對象和不可到達對象。應用的強弱順序是強、軟、弱、和虛。對於對象是屬於哪一種可及的對象,由他的最強的引用決定。以下代碼:

softRef=new SoftReference(abc); //2 WeakReference weakRef = new WeakReference(abc); //3 abc=null; //4 softRef.clear();//5 " v:shapes="_x0000_s1048">

第一行在heap堆中建立內容爲「abc」的對象,並創建abc到該對象的強引用,該對象是強可及的。

第二行和第三行分別創建對heap中對象的軟引用和弱引用,此時heap中的abc對象已經有3個引用,顯然此時abc對象還是強可及的。

第四行以後heap中對象再也不是強可及的,變成軟可及的。

第五行執行以後變成弱可及的。

 軟引用(SoftReference)

若是一個對象只具備軟引用,那麼若是內存空間足夠,垃圾回收器就不會回收它,若是內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就能夠被程序使用。軟引用可用來實現內存敏感的高速緩存。

軟引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是軟引用所引用的對象被垃圾回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

軟引用是主要用於內存敏感的高速緩存。在jvm報告內存不足以前會清除全部的軟引用,這樣以來gc就有可能收集軟可及的對象,可能解決內存吃緊問題,避免內存溢出。何時會被收集取決於gc的算法和gc運行時可用內存的大小。當gc決定要收集軟引用時執行如下過程,以上面的softRef爲例:

    1 首先將softRef的referent(abc)設置爲null,再也不引用heap中的new String("abc")對象。

    2 將heap中的new String("abc")對象設置爲可結束的(finalizable)。

    3 當heap中的new String("abc")對象的finalize()方法被運行並且該對象佔用的內存被釋放, softRef被添加到它的ReferenceQueue(若是有的話)中。

   注意:對ReferenceQueue軟引用和弱引用能夠有可無,可是虛引用必須有。

  被 Soft Reference 指到的對象,即便沒有任何 Direct Reference,也不會被清除。一直要到 JVM 內存不足且沒有Direct Reference 時纔會清除,SoftReference 是用來設計 object-cache 之用的。如此一來 SoftReference 不但能夠把對象 cache 起來,也不會形成內存不足的錯誤 (OutOfMemoryError)。

 弱引用(WeakReference)

若是一個對象只具備弱引用,那該類就是無關緊要的對象,由於只要該對象被gc掃描到了隨時都會把它幹掉。弱引用與軟引用的區別在於:只具備弱引用的對象擁有更短暫的生命週期。在垃圾回收器線程掃描它所管轄的內存區域的過程當中,一旦發現了只具備弱引用的對象,無論當前內存空間足夠與否,都會回收它的內存。不過,因爲垃圾回收器是一個優先級很低的線程, 所以不必定會很快發現那些只具備弱引用的對象。

弱引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。

 虛引用(PhantomReference)

"虛引用"顧名思義,就是形同虛設,與其餘幾種引用都不一樣,虛引用並不會決定對象的生命週期。若是一個對象僅持有虛引用,那麼它就和沒有任何引用同樣,在任什麼時候候均可能被垃圾回收。虛引用主要用來跟蹤對象被垃圾回收的活動。

虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,若是發現它還有虛引用,就會在回收對象的內存以前,把這個虛引用加入到與之關聯的引用隊列中。程序能夠經過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。程序若是發現某個虛引用已經被加入到引用隊列,那麼就能夠在所引用的對象的內存被回收以前採起必要的行動。

創建虛引用以後經過get方法返回結果始終爲null,經過源代碼你會發現,虛引用通向會把引用的對象寫進referent,只是get方法返回結果爲null。先看一下和gc交互的過程再說一下他的做用。

  1 不把referent設置爲null, 直接把heap中的new String("abc")對象設置爲可結束的(finalizable)。

  2 與軟引用和弱引用不一樣, 先把PhantomRefrence對象添加到它的ReferenceQueue中.而後在釋放虛可及的對象。

8、JNI&NDK

一、在Android中如何調用C語言

當咱們的Java須要調用C語言的時候能夠經過JNI的方式,Java Native Interface。Android提供了對JNI的支持,所以咱們在Android中能夠使用JNI調用C語言。在Android開發目錄的libs目錄下添加xxx.so文件,不過xxx.so文件須要放在對應的CPU架構名目錄下,好比armeabi,x86等。

在Java代碼須要經過System.loadLibrary(libName);加載so文件。同時C語言中的方法在java中必須以native關鍵字來聲明。普通Java方法調用這個native方法接口,虛擬機內部自動調用so文件中對應的方法。

二、請介紹一下NDK

1.NDK 是一系列工具的集合

NDK 提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so 和java 應用一塊兒打包成apk。NDK 集成了交叉編譯器,並提供了相應的mk 文件隔離CPU、平臺、ABI 等差別,開發人員只須要簡單修改mk 文件(指出「哪些文件須要編譯」、「編譯特性要求」等),就能夠建立出so。

2.NDK 提供了一份穩定、功能有限的API 頭文件聲明

Google 明確聲明該API 是穩定的,在後續全部版本中都穩定支持當前發佈的API。從該版本的NDK 中看出,這些API 支持的功能很是有限,包含有:C 標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、Log 庫(liblog)。

三、JNI調用經常使用的兩個參數

 JNIEnv *env, jobject obj

第一個是指向虛擬機對象的指針,是一個二級指針。裏面封裝了不少方法和中間變量供咱們使用。

第二個表明着調用該方法的Java對象的C語言表示。

9、Android中的網絡訪問

一、Android中如何訪問網絡

Android提供了org.apache.http.HttpClientConnection和java.net.HttpURLConnection兩個鏈接網絡對象。使用哪一個都行,具體要看企業領導的要求了。

除此以外通常我比較喜歡使用xUtils中的HttpUtils功能,該模塊底層使用的就是org.apache.http.client.HttpClient,使用起來很是方便。

二、如何解析服務器傳來的JSON文件

在Android中內置了JSON的解析API,在org.json包中包含了以下幾個類:JSONArray、JSONObject、JSONStringer、JSONTokener和一個異常類JSONException。

 

一、JSON解析步驟

1)、讀取網絡文件數據並轉爲一個json字符串

       InputStream in = conn.getInputStream();

       String jsonStr = DataUtil.Stream2String(in);//將流轉換成字符串的工具類

2)、將字符串傳入相應的JSON構造函數中

①、經過構造函數將json字符串轉換成json對象

       JSONObject  jsonObject = new JSONObject(jsonStr);

②、經過構造函數將json字符串轉換成json數組:

JSONArray array = new JSONArray(jsonStr);

3)、解析出JSON中的數據信息:

①、從json對象中獲取你所須要的鍵所對應的值

       JSONObject  json=jsonObject.getJSONObject("weatherinfo");

       String city = json.getString("city");

       String temp = json.getString("temp")

②、遍歷JSON數組,獲取數組中每個json對象,同時能夠獲取json對象中鍵對應的值

       for (int i = 0; i < array.length(); i++) {

              JSONObject obj = array.getJSONObject(i);

              String title=obj.getString("title");

              String description=obj.getString("description");

       }

二、生成JSON對象和數組

1)生成JSON:

方法一、建立一個map,經過構造方法將map轉換成json對象

       Map<String, Object> map = new HashMap<String, Object>();

       map.put("name", "zhangsan");

       map.put("age", 24);

       JSONObject json = new JSONObject(map);

方法二、建立一個json對象,經過put方法添加數據

       JSONObject json=new JSONObject();

       json.put("name", "zhangsan");

       json.put("age", 24);

2)生成JSON數組:

建立一個list,經過構造方法將list轉換成json對象

       Map<String, Object> map1 = new HashMap<String, Object>();

       map1.put("name", "zhangsan");

       map1.put("age", 24);

       Map<String, Object> map2 = new HashMap<String, Object>();

       map2.put("name", "lisi");

       map2.put("age", 25);

       List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();

       list.add(map1);

       list.add(map2);

       JSONArray array=new JSONArray(list);

       System.out.println(array.toString());

三、如何解析服務器傳來的XML格式數據

Android爲咱們提供了原生的XML解析和生成支持。

一、XML解析

              獲取解析器: Xml.newPullParser()

              設置輸入流: setInput()

              獲取當前事件類型: getEventType()

              解析下一個事件, 獲取類型: next()

              獲取標籤名: getName()

              獲取屬性值: getAttributeValue()

              獲取下一個文本: nextText()

              獲取當前文本: getText()

              5種事件類型: START_DOCUMENT, END_DOCUMENT, START_TAG, END_TAG, TEXT

示例代碼:

public List<Person> getPersons(InuptStream in){ 

       XmlPullParser parser=Xml.newPullParser();//獲取解析器

       parser.setInput(in,"utf-8");

       for(int type=){   //循環解析

       }     

}

二、XML生成

              獲取生成工具: Xml.newSerializer()

              設置輸出流: setOutput()

              開始文檔: startDocument()

              結束文檔: endDocument()

              開始標籤: startTag()

              結束標籤: endTag()

              屬性: attribute()

              文本: text()   

示例代碼:

XmlSerializer serial=Xml.newSerializer();//獲取xml序列化工具

serial.setOuput(put,"utf-8");

serial.startDocument("utf-8",true);

serial.startTag(null,"persons");

for(Person p:persons){

       serial.startTag(null,"persons");     

       serial.attribute(null,"id",p.getId().toString());

       serial.startTag(null,"name");  

       serial.attribute(null,"name",p.getName().toString());

       serial.endTag(null,"name");

       serial.startTag(null,"age");      

       serial.attribute(null,"age",p.getAge().toString());

       serial.endTag(null,"age");

       serial.endTag(null,"persons");      

}

四、如何從網絡上加載一個圖片顯示到界面

能夠經過BitmapFactory.decodeStream(inputStream);方法將圖片轉換爲bitmap,而後經過

imageView.setImageBitmap(bitmap);將該圖片設置到ImageView中。這是原生的方法,還能夠使用第三方開源的工具來實現,好比使用SmartImageView做爲ImageView控件,而後直接設置一個url地址便可。也能夠使用xUtils中的BitmapUtils工具。

五、如何播放網絡視頻

除了使用Android提供的MediaPlayer和VideoView外一般還能夠使用第三方開源萬能播放器,VitamioPlayer。該播放器兼容性好,支持幾乎全部主流視頻格式。

10、Intent

一、Intent傳遞數據時,能夠傳遞哪些類型數據?

       Intent能夠傳遞的數據類型很是的豐富,java的基本數據類型和String以及他們的數組形式均可以,除此以外還能夠傳遞實現了Serializable和Parcelable接口的對象。

二、Serializable和Parcelable的區別

1.在使用內存的時候,Parcelable 類比Serializable性能高,因此推薦使用Parcelable類。

2.Serializable在序列化的時候會產生大量的臨時變量,從而引發頻繁的GC。

3.Parcelable不能使用在要將數據存儲在磁盤上的狀況。儘管Serializable效率低點,但在這種狀況下,仍是建議你用Serializable 。

實現:

1 Serializable 的實現,只須要繼承Serializable 便可。這只是給對象打了一個標記,系統會自動將其序列化。

2 Parcelabel 的實現,須要在類中添加一個靜態成員變量 CREATOR,這個變量須要繼承 Parcelable.Creator 接口。

CREATOR = new Parcelable.Creator() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; private MyParcelable(Parcel in) { mData = in.readInt(); } } " v:shapes="_x0000_s1054">

三、請描述一下Intent 和 IntentFilter

Android 中經過 Intent 對象來表示一條消息,一個 Intent 對象不只包含有這個消息的目的地,還能夠包含消息的內容,這比如一封 Email,其中不只應該包含收件地址,還能夠包含具體的內容。對於一個 Intent 對象,消息「目的地」是必須的,而內容則是可選項。

經過Intent 能夠實現各類系統組件的調用與激活. 

IntentFilter: 能夠理解爲郵局或者是一個信箋的分揀系統…

這個分揀系統經過3個參數來識別

Action: 動做    view

Data: 數據uri   uri

Category : 而外的附加信息

Action 匹配

Action 是一個用戶定義的字符串,用於描述一個 Android 應用程序組件,一個 IntentFilter 能夠包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時能夠在其 <intent-filter >節點指定一個 Action 列表用於標示 Activity 所能接受的「動做」,例如:

 <intent-filter >

 <action android:name="android.intent.action.MAIN" />

 <action android:name="cn.itheima.action" />

……

 </intent-filter>

若是咱們在啓動一個 Activity 時使用這樣的 Intent 對象:

 Intent intent =new Intent();

 intent.setAction("cn.itheima.action");

那麼全部的 Action 列表中包含了「cn.itheima」的 Activity 都將會匹配成功。

Android 預約義了一系列的 Action 分別表示特定的系統動做。這些 Action 經過常量的方式定義在 android.content. Intent中,以「ACTION_」開頭。咱們能夠在 Android 提供的文檔中找到它們的詳細說明。

URI 數據匹配

一個 Intent 能夠經過 URI 攜帶外部數據給目標組件。在 <intent-filter >節點中,經過 <data/>節點匹配外部數據。

mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、端口、和路徑。以下:

 <data android:mimeType="mimeType" android:scheme="scheme"

 android:host="host" android:port="port" android:path="path"/>

電話的uri   tel: 12345

                 http://www.baidu.com

本身定義的uri  itcast://cn.itcast/person/10

若是在 Intent Filter 中指定了這些屬性,那麼只有全部的屬性都匹配成功時 URI 數據匹配纔會成功。

Category 類別匹配

<intent-filter >節點中能夠爲組件定義一個 Category 類別列表,當 Intent 中包含這個列表的全部項目時 Category 類別匹配纔會成功。

四、under what condition could the code sample below crash your application?How would you modify the code to avoid this potential problem?Explain your answer?

Intent sendIntent = new Intent();

sendIntent.setAction(Intent.ACTION_SEND);

sendIntent.putExtra(Intent.EXTRA_TEXT,textMessage);

sendIntent.setType(HTTP.PLAIN_TEXT_TYEP);//"text/plain" MIME type

content.startActivity(sendIntent);

 

五、what are Activity and Fragment?where and why should you use one over the other?

 

六、can you use an intent to provide data to a ContentProvider ? if not ,what would be the proper mechanism for doing this?

 

11、Fragment

一、Fragment跟Activity之間是如何傳值的

當Fragment跟Activity綁定以後,在Fragment中能夠直接經過getActivity()方法獲取到其綁定的Activity對象,這樣就能夠調用Activity的方法了。在Activity中能夠經過以下方法獲取到Fragment實例


獲取到Fragment以後就能夠調用Fragment的方法。也就實現了通訊功能。

二、描述一下Fragment的生命週期

 

三、Fragment的replace和add方法的區別(2015.8.30)

Fragment自己並無replace和add方法,這裏的理解應該爲使用FragmentManager的replace和add兩種方法切換Fragment時有什麼不一樣。

咱們常用的一個架構就是經過RadioGroup切換Fragment,每一個Fragment就是一個功能模塊。

 

實現這個功能能夠經過replace和add兩種方法。

Fragment的容器一個FrameLayout,add的時候是把全部的Fragment一層一層的疊加到了FrameLayout上了,而replace的話首先將該容器中的其餘Fragment去除掉而後將當前Fragment添加到容器中。

一個Fragment容器中只能添加一個Fragment種類,若是屢次添加則會報異常,致使程序終止,而replace則無所謂,隨便切換。

由於經過add的方法添加的Fragment,每一個Fragment只能添加一次,所以若是要想達到切換效果須要經過Fragment的的hide和show方法結合者使用。將要顯示的show出來,將其餘hide起來。這個過程Fragment的生命週期沒有變化。

經過replace切換Fragment,每次都會執行上一個Fragment的onDestroyView,新Fragment的onCreateView、onStart、onResume方法。

基於以上不一樣的特色咱們在使用的使用必定要結合着生命週期操做咱們的視圖和數據。

四、Fragment如何實現相似Activity棧的壓棧和出棧效果的?(2015.8.30)

Fragment的事物管理器內部維持了一個雙向鏈表結構,該結構能夠記錄咱們每次add的Fragment和replace的Fragment,而後當咱們點擊back按鈕的時候會自動幫咱們實現退棧操做。

 

除此以外由於咱們要使用FragmentManger用的是FragmentActivity,所以FragmentActivity的onBackPress方法一定從新覆寫了。打開看一下,發現確實如此。

 

= 0) { //從後退棧中取出當前記錄對象 BackStackRecord bss = mBackStack.get(index); if (name != null && name.equals(bss.getName())) { break; } if (id >= 0 && id == bss.mIndex) { break; } index--; } " v:shapes="文本框_x0020_119">

5. Android高級(★★★)

1、Android性能優化

一、如何對Android應用進行性能分析

一款App流暢與否安裝在本身的真機裏,玩幾天就能有個大概的感性認識。不過經過專業的分析工具能夠使咱們更好的分析咱們的應用。

若是不考慮使用其餘第三方性能分析工具的話,咱們能夠直接使用ddms中的工具,其實ddms工具已經很是的強大了。ddms中有traceview、heap、allocation tracker等工具均可以幫助咱們分析應用的方法執行時間效率和內存使用狀況。

 traceview工具在本文章中已經有詳細的介紹,所以這裏就再也不贅述。

 heap

heap工具能夠幫助咱們檢查代碼中是否存在會形成內存泄漏的地方。

用heap監測應用進程使用內存狀況的步驟以下:

1. 啓動eclipse後,切換到DDMS透視圖,並確認Devices視圖、Heap視圖都是打開的;

2. 點擊選中想要監測的進程,好比system_process進程;

3. 點擊選中Devices視圖界面中最上方一排圖標中的「Update Heap」圖標;

6. 點擊Heap視圖中的「Cause GC」按鈕;

7. 此時在Heap視圖中就會看到當前選中的進程的內存使用量的詳細狀況。

 說明:

a) 點擊「Cause GC」按鈕至關於向虛擬機請求了一次gc操做;

b) 當內存使用信息第一次顯示之後,無須再不斷的點擊「Cause GC」,Heap視圖界面會定時刷新,在對應用的不斷的操做過程當中就能夠看到內存使用的變化;

c) 內存使用信息的各項參數根據名稱便可知道其意思,在此再也不贅述。

  如何才能知道咱們的程序是否有內存泄漏的可能性呢。這裏須要注意一個值:Heap視圖中部有一個Type叫作data object,即數據對象,也就是咱們的程序中大量存在的類類型的對象。在data object一行中有一列是「Total Size」,其值就是當前進程中全部Java數據對象的內存總量,通常狀況下,這個值的大小決定了是否會有內存泄漏。能夠這樣判斷:

a) 不斷的操做當前應用,同時注意觀察data object的Total Size值;

b) 正常狀況下Total Size值都會穩定在一個有限的範圍內,也就是說因爲程序中的的代碼良好,沒有形成對象不被垃圾回收的狀況,因此說雖然咱們不斷的操做會不斷的生成不少對象,而在虛擬機不斷的進行GC的過程當中,這些對象都被回收了,內存佔用量會會落到一個穩定的水平;

c) 反之若是代碼中存在沒有釋放對象引用的狀況,則data object的Total Size值在每次GC後不會有明顯的回落,隨着操做次數的增多Total Size的值會愈來愈大,

  直到到達一個上限後致使進程被kill掉。

d) 此處以system_process進程爲例,在個人測試環境中system_process進程所佔用的內存的data object的Total Size正常狀況下會穩定在2.2~2.8之間,而當其值超過3.55後進程就會被kill。

  總之,使用DDMS的Heap視圖工具能夠很方便的確認咱們的程序是否存在內存泄漏的可能性。

 allocation tracker

運行DDMS,只需簡單的選擇應用進程並單擊Allocation tracker標籤,就會打開一個新的窗口,單擊「Start Tracing」按鈕;

而後,讓應用運行你想分析的代碼。運行完畢後,單擊「Get Allocations」按鈕,一個已分配對象的列表就會出現第一個表格中。

單擊第一個表格中的任何一項,在表格二中就會出現致使該內存分配的棧跟蹤信息。經過allocation tracker,不只知道分配了哪類對象,還能夠知道在哪一個線程、哪一個類、哪一個文件的哪一行。

二、什麼狀況下會致使內存泄露

Android的虛擬機是基於寄存器的Dalvik,它的最大堆大小通常是16M,有的機器爲24M。所以咱們所能利用的內存空間是有限的。若是咱們的內存佔用超過了必定的水平就會出現OutOfMemory的錯誤。

內存溢出的幾點緣由:

一、資源釋放問題

程序代碼的問題,長期保持某些資源,如Context、Cursor、IO流的引用,資源得不到釋放形成內存泄露。

二、對象內存過大問題

保存了多個耗用內存過大的對象(如Bitmap、XML文件),形成內存超出限制。

三、static關鍵字的使用問題

static是Java中的一個關鍵字,當用它來修飾成員變量時,那麼該變量就屬於該類,而不是該類的實例。因此用static修飾的變量,它的生命週期是很長的,若是用它來引用一些資源耗費過多的實例(Context的狀況最多),這時就要謹慎對待了。

public class ClassName { 

     private static Context mContext; 

     //省略

}

以上的代碼是很危險的,若是將Activity賦值到mContext的話。那麼即便該Activity已經onDestroy,可是因爲仍有對象保存它的引用,所以該Activity依然不會被釋放。

咱們舉Android文檔中的一個例子。

 

 

 

 

 

sBackground是一個靜態的變量,可是咱們發現,咱們並無顯式的保存Contex的引用,可是,當Drawable與View鏈接以後,Drawable就將View設置爲一個回調,因爲View中是包含Context的引用的,因此,實際上咱們依然保存了Context的引用。這個引用鏈以下:

    Drawable->TextView->Context

    因此,最終該Context也沒有獲得釋放,發生了內存泄露。

 針對static的解決方案

① 應該儘可能避免static成員變量引用資源耗費過多的實例,好比Context。

    ② Context儘可能使用ApplicationContext,由於Application的Context的生命週期比較長,引用它不會出現內存泄露的問題。

    ③ 使用WeakReference代替強引用。好比能夠使用WeakReference<Context> mContextRef;

四、線程致使內存溢出

線程產生內存泄露的主要緣由在於線程生命週期的不可控。咱們來考慮下面一段代碼。

 

 

 

這段代碼很日常也很簡單,是咱們常用的形式。咱們思考一個問題:假設MyThread的run函數是一個很費時的操做,當咱們開啓該線程後,將設備的橫屏變爲了豎屏,一 般狀況下當屏幕轉換時會從新建立Activity,按照咱們的想法,老的Activity應該會被銷燬纔對,然而事實上並不是如此。

因爲咱們的線程是Activity的內部類,因此MyThread中保存了Activity的一個引用,當MyThread的run函數沒有結束時,MyThread是不會被銷燬的,所以它所引用的老的Activity也不會被銷燬,所以就出現了內存泄露的問題。

有些人喜歡用Android提供的AsyncTask,但事實上AsyncTask的問題更加嚴重,Thread只有在run函數不結束時纔出現這種內存泄露問題,然而AsyncTask內部的實現機制是運用了ThreadPoolExcutor,該類產生的Thread對象的生命週期是不肯定的,是應用程序沒法控制的,所以若是AsyncTask做爲Activity的內部類,就更容易出現內存泄露的問題。

針對這種線程致使的內存泄露問題的解決方案:

    第1、將線程的內部類,改成靜態內部類(由於非靜態內部類擁有外部類對象的強引用,而靜態類則不擁有)。

    第2、在線程內部採用弱引用保存Context引用。

三、如何避免OOM異常

想要避免OOM異常首先咱們要知道什麼狀況下會致使OOM異常。

一、圖片過大致使OOM

Android 中用bitmap時很容易內存溢出,好比報以下錯誤:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。

解決方法:

方法1: 等比例縮小圖片

 

以上代碼能夠優化內存溢出,但它只是改變圖片大小,並不能完全解決內存溢出。

方法2:對圖片採用軟引用,及時地進行recyle()操做

bitmap = new SoftReference(pBitmap); if(bitmap != null){ if(bitmap.get() != null && !bitmap.get().isRecycled()){ bitmap.get().recycle(); bitmap = null; } } " v:shapes="_x0000_s1044">

二、界面切換致使OOM

有時候咱們會發現這樣的問題,橫豎屏切換N次後 OOM了。

這種問題沒有固定的解決方法,可是咱們能夠從如下幾個方面下手分析。

一、看看頁面佈局當中有沒有大的圖片,好比背景圖之類的。

去除xml中相關設置,改在程序中設置背景圖(放在onCreate()方法中):

 

    在Activity destory時注意,drawable.setCallback(null); 防止Activity得不到及時的釋放。

 二、跟上面方法類似,直接把xml配置文件加載成view 再放到一個容器裏,而後直接調用 this.setContentView(View view);方法,避免xml的重複加載。

三、 在頁面切換時儘量少地重複使用一些代碼

好比:重複調用數據庫,反覆使用某些對象等等......

常見的內存使用不當的狀況

三、查詢數據庫沒有關閉遊標

程序中常常會進行查詢數據庫的操做,可是常常會有使用完畢Cursor後沒有關閉的狀況。若是咱們的查詢結果集比較小,對內存的消耗不容易被發現,只有在常時間大量操做的狀況下才會出現內存問題,這樣就會給之後的測試和問題排查帶來困難和風險。

四、構造Adapter時,沒有使用緩存的 convertView

在使用ListView的時候一般會使用Adapter,那麼咱們應該儘量的使用ConvertView。

五、Bitmap對象再也不使用時調用recycle()釋放內存

有時咱們會手工的操做Bitmap對象,若是一個Bitmap對象比較佔內存,當它再也不被使用的時候,能夠調用Bitmap.recycle()方法回收此對象的像素所佔用的內存,但這不是必須的,視狀況而定。

六、其餘

  Android應用程序中最典型的須要注意釋放資源的狀況是在Activity的生命週期中,在onPause()、onStop()、 onDestroy()方法中須要適當的釋放資源的狀況。

四、Android中如何捕獲未捕獲的異常

一、自定義一個Application,好比叫MyApplication繼承Application實現UncaughtExceptionHandler。

二、覆寫UncaughtExceptionHandler的onCreate和uncaughtException方法。

 

注意:上面的代碼只是簡單的將異常打印出來。

在onCreate方法中咱們給Thread類設置默認異常處理handler,若是這句代碼不執行則一切都是白搭。

在uncaughtException方法中咱們必須新開闢個線程進行咱們異常的收集工做,而後將系統給殺死。

三、在AndroidManifest中配置該Application

 

四、blog分享

關於異常數據的收集在網上有一篇不錯的blog能夠推薦給你們。

http://blog.csdn.net/jdsjlzx/article/details/7606423

2、Android屏幕適配

一、屏幕適配方式都有哪些

1.1 適配方式之dp

名詞解釋:

 分辨率:eg:480*800,1280*720。表示物理屏幕區域內像素點的總和。(切記:跟屏幕適配沒有任何關係)

   由於咱們既能夠把1280*720的分辨率作到4.0的手機上面。我也能夠把1280*720的分辨率作到5.0英寸的手機上面,若是分辨率相同,手機屏幕越小清晰。

 px(pix):像素,就是屏幕中最小的一個顯示單元

 dpi(像素密度):即每英寸屏幕所擁有的像素數,像素密度越大,顯示畫面細節就越豐富。

計算公式:像素密度=√{(長度像素數^2+寬度像素數^2)}/ 屏幕尺寸

注:屏幕尺寸單位爲英寸 例:分辨率爲1280*720 屏幕寬度爲6英寸 計算所得像素密度約等於245,屏幕尺寸指屏幕對角線的長度。

在Android手機中dpi分類:

ldpi

Resources for low-density (ldpi) screens (~120dpi).

mdpi

Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.)

hdpi

Resources for high-density (hdpi) screens (~240dpi).

xhdpi

Resources for extra high-density (xhdpi) screens (~320dpi).

在咱們的Android工程目錄中有以下drawable-*dpi目錄,這些目錄是用來適配不一樣分辨率手機的。

 

Android應用在查找圖片資源時會根據其分辨率自動從不一樣的文件目錄下查找(這自己就是Android系統的適配策略),若是在低分辨的文件目錄中好比drawable-mdpi中沒有圖片資源,其餘目錄中都有,當咱們將該應用部署到mdpi分辨率的手機上時,那麼該應用會查找分辨率較高目錄下的資源文件,若是較高分辨率目錄下也沒有資源則只好找較低目錄中的資源了。

常見手機屏幕像素及對應分別率級別:

 ldpi  320*240    

 mdpi  480*320    

 hdpi  800*480

 xhdpi  1280*720

 xxhdpi  1920*1080

dp和px之間的簡單換算關係:

 

 ldpi的手機 1dp=0.75px

 mdpi的手機 1dp=1.0px

 hdpi的手機 1dp=1.5px

 xhdpi的手機 1dp=2.0px

 xxhdpi的手機 1dp=3.0px

 

:根據上面的描述咱們得出以下結論,對於mdpi的手機,咱們的佈局經過dp單位能夠達到適配效果。

1.2 適配方式之dimens

跟drawable目錄相似的,在Android工程的res目錄下有values目錄,這個是默認的目錄,同時爲了適配不一樣尺寸手機咱們能夠建立一個values-1280x720的文件夾,同時將dimens.xml文件拷貝到該目錄下。

 

在dimens.xml中定義一個尺寸,以下圖所示。

 

在values-1280x720目錄中的dimens.xml中定義一樣的尺寸名稱,可是使用不一樣的尺寸,以下圖所示。

 

當咱們在佈局文件中使用長或者寬度單位時,好比下圖所示,應該使用@dimen/width來靈活的定義寬度。

 

:在values-1280x720中,中間的是大寫字母X的小寫形式x,而不是加減乘除的乘號。若是咱們在values-1280x720中放置了dimens常量,必定記得也將該常量的對應值在values目錄下的dimens.xml中放一份,由於該文件是默認配置,當用戶的手機不是1280*720的狀況下系統應用使用的是默認values目錄中的dimens.xml。

1.3 適配方式之layout

跟values同樣,在Android工程目錄中layout目錄也支持相似values目錄同樣的適配,在layout中咱們能夠針對不一樣手機的分辨率制定不一樣的佈局,以下圖所示。

 

1.4 適配方式之java代碼適配

爲了演示用java代碼控制適配的效果,所以假設有這樣的需求,讓一個TextView控件的寬和高分別爲屏幕的寬和高的一半。

咱們新建立一個Android工程,修改main_activity.xml,佈局文件清單以下:

" v:shapes="_x0000_s1040">

" v:shapes="_x0000_s1039">

在MainActivity.java類中完成用java代碼控制TextView的佈局效果,其代碼清單以下:

 

其中Constant類是一個常量類,很簡單,只有兩個常量用來記錄屏幕的寬和高,其代碼清單以下:

 

1.5適配方式之weight權重適配

在控件中使用屬性android:layout_weight="1"以起到適配效果,可是該屬性的使用有以下規則:

一、只能用在線性控件中,好比LinearLayout。

二、豎直方向上使用權重的控件高度必須爲0dp(Google官方的推薦用法)

三、水平方向上使用權重的控件寬度必須爲0dp(Google官方的推薦用法)

二、屏幕適配的處理技巧都有哪些

手機自適應主要分爲兩種狀況:橫屏和豎屏的切換,以及分辨率大小的不一樣。

2.1橫屏和豎屏的切換

一、Android應用程序支持橫豎屏幕的切換,Android中每次屏幕的切換動會重啓Activity,因此應該在Activity銷燬(執行onPause()方法和onDestroy()方法)前保存當前活動的狀態;在Activity再次建立的時候載入配置,那樣,進行中的遊戲就不會自動重啓了!有的程序適合從豎屏切換到橫屏,或者反過來,這個時候怎麼辦呢?能夠在配置Activity的地方進行以下的配置android:screenOrientation="portrait"(landscape是橫向,portrait是縱向)。這樣就能夠保證是豎屏老是豎屏了。

二、而有的程序是適合橫豎屏切換的。如何處理呢?首先要在配置Activity的時候進行以下的配置:

android:configChanges="keyboardHidden|orientation",另外須要重寫Activity的onConfigurationChanged方法。實現方式以下:

 

2.2分辨率大小不一樣

對於分辨率問題,官方給的解決辦法是建立不一樣的layout文件夾,這就須要對每種分辨率的手機都要寫一個佈局文件,雖然看似解決了分辨率的問題,可是若是其中一處或多處有修改了,就要每一個佈局文件都要作出修改,這樣就形成很大的麻煩。那麼能夠經過如下幾種方式解決:

一)使用layout_weight

目前最爲推薦的Android多屏幕自適應解決方案。

    該屬性的做用是決定控件在其父佈局中的顯示權重,通常用於線性佈局中。其值越小,則對應的layout_width或layout_height的優先級就越高(通常到100做用就不太明顯了);通常橫向佈局中,決定的是layout_width的優先級;縱向佈局中,決定的是layout_height的優先級。

    傳統的layout_weight使用方法是將當前控件的layout_width和layout_height都設置成fill_parent,這樣就能夠把控件的顯示比例徹底交給layout_weight;這樣使用的話,就出現了layout_weight越小,顯示比例越大的狀況(即權重越大,顯示所佔的效果越小)。不過對於2個控件還好,若是控件過多,且顯示比例也不相同的時候,控制起來就比較麻煩了,畢竟反比不是那麼好肯定的。因而就有了如今最爲流行的0px設值法。看似讓人難以理解的layout_height=0px的寫法,結合layout_weight,卻能夠使控件成正比例顯示,輕鬆解決了當前Android開發最爲頭疼的碎片化問題之一。

二)清單文件配置:【不建議使用這種方式,須要對不一樣的界面寫不一樣的佈局】

須要在AndroidManifest.xml文件的<manifest>元素以下添加子元素

<supports-screensandroid:largeScreens="true"

android:normalScreens="true"

android:anyDensity="true"

android:smallScreens="true"

android:xlargeScreens="true">

</supports-screens>

以上是爲咱們的屏幕設置多分辨率支持(更準確的說是適配大、中、小三種密度)。

Android:anyDensity="true",這一句對整個的屏幕都起着十分重要的做用,值爲true,咱們的應用程序當安裝在不一樣密度的手機上時,程序會分別加載hdpi,mdpi,ldpi文件夾中的資源。相反,若是值設置爲false,即便咱們在hdpi,mdpi,ldpi,xdpi文件夾下擁有同一種資源,那麼應用也不會自動地去相應文件夾下尋找資源。而是會在大密度和小密度手機上加載中密度mdpi文件中的資源。

有時候會根據須要在代碼中動態地設置某個值,能夠在代碼中爲這幾種密度分別設置偏移量,可是這種方法最好不要使用,最好的方式是在xml文件中不一樣密度的手機進行分別設置。這裏地圖的偏移量能夠在values-xpdi,values-hpdi,values-mdpi,values-ldpi四種文件夾中的dimens.xml文件進行設置。

三)、其餘:

說明:

       在不一樣分辨率的手機模擬器下,控件顯示的位置會稍有不一樣

       經過在layout中定義的佈局設置的參數,使用dp(dip),會根據不一樣的屏幕分辨率進行適配

       可是在代碼中的各個參數值,都是使用的像素(px)爲單位的

技巧:

一、儘可能使用線性佈局,相對佈局,若是屏幕放不下了,能夠使用ScrollView(能夠上下拖動)

ScrowView使用的注意:

在不一樣的屏幕上顯示內容不一樣的狀況,其實這個問題咱們每每是用滾動視圖來解決的,也就是ScrowView;須要注意的是ScrowView中使用layout_weight是無效的,既然使用ScrowView了,就把它裏面的控件的大小都設成固定的吧。

二、指定寬高的時候,採用dip的單位,dp單位動態匹配

三、因爲android代碼中寫的單位都是像素,全部須要經過工具類進行轉化

四、儘可能使用9-patch圖,能夠自動的依據圖片上面顯示的內容被拉伸和收縮。其中在編輯的時候,灰色區域是被拉伸的,上下兩個點控制水平方向的拉伸,左右兩點控制垂直方向的拉伸

三、dp和px之間的關係

dp:是dip的簡寫,指密度無關的像素。

       指一個抽象意義上的像素,程序用它來定義界面元素。一個與密度無關的,在邏輯尺寸上,與一個位於像素密度爲160dpi的屏幕上的像素是一致的。要把密度無關像素轉換爲屏幕像素,能夠用這樣一個簡單的公式:pixels=dips*(density/160)。舉個例子,在DPI爲240的屏幕上,1個DIP等於1.5個物理像素。

佈局時最好使用dp來定義咱們程序的界面,由於這樣能夠保證咱們的UI在各類分辨率的屏幕上均可以正常顯示。

 

3、AIDL

一、什麼是AIDL以及如何使用

①aidl是Android interface definition Language 的英文縮寫,意思Android 接口定義語言。

②使用aidl能夠幫助咱們發佈以及調用遠程服務,實現跨進程通訊。

③將服務的aidl放到對應的src目錄,工程的gen目錄會生成相應的接口類

咱們經過bindService(Intent,ServiceConnect,int)方法綁定遠程服務,在bindService中有一個ServiceConnec接口,咱們須要覆寫該類的onServiceConnected(ComponentName,IBinder)方法,這個方法的第二個參數IBinder對象其實就是已經在aidl中定義的接口,所以咱們能夠將IBinder對象強制轉換爲aidl中的接口類。

咱們經過IBinder獲取到的對象(也就是aidl文件生成的接口)實際上是系統產生的代理對象,該代理對象既能夠跟咱們的進程通訊,又能夠跟遠程進程通訊,做爲一箇中間的角色實現了進程間通訊。

4、自定義控件

一、如何自定義一個控件

自定義控件能夠分爲兩種自定義組合控件和自定義view。

 自定義組合控件

自定義組合控件就是把多個控件作爲一個總體看待、處理。這樣的好處不只能夠減輕xml的代碼量,也提升了代碼的複用性。

在手機衛士項目中咱們第一次接觸了自定義組合控件。

1. 聲明一個View 對象,繼承相對佈局,或者線性佈局或者其餘的ViewGroup。

2. 在自定義的View 對象裏面重寫它的構造方法,在構造方法裏面就把佈局都初始化完畢。

3. 根據業務需求添加一些api 方法,擴展自定義的組合控件;

4. 但願在佈局文件裏面能夠自定義一些屬性。

5. 聲明自定義屬性的命名空間。

xmlns:itheima="http://schemas.android.com/apk/res/com.itheima.mobilesafe"

6. 在res 目錄下的values 目錄下建立attrs.xml 的文件聲明咱們寫的屬性。

7. 在佈局文件中寫自定義的屬性。

8. 使用這些定義的屬性。自定義View 對象的構造方法裏面有一個帶兩個參數的構造方法佈局文件裏面定義的屬性都放在AttributeSet attrs,獲取那些定義的屬性。

 自定義view

自定義View首先要實現一個繼承自View的類。添加類的構造方法,一般是三個構造方法,不過從Android5.0開始構造方法已經添加到4個了。override父類的方法,如onDraw,(onMeasure)等。若是自定義的View有本身的屬性,須要在values下創建attrs.xml文件,在其中定義屬性,同時代碼也要作修改。

blog分享:http://blog.csdn.net/lmj623565791/article/details/24252901

二、請描述一下View的繪製流程

整個View樹的繪圖流程是在ViewRoot.java類(該類位於Android源碼下面:D:\AndroidSource_GB\AndroidSource_GB\frameworks\base\core\java\android\view)的performTraversals()函數展開的,該函數作的執行過程可簡單概況爲根據以前設置的狀態,判斷是否須要從新計算視圖大小(measure)、是否從新須要安置視圖的位置(layout)、以及是否須要重繪 (draw),其框架過程以下:

 

一、mesarue()過程

  主要做用:爲整個View樹計算實際的大小,即設置實際的高(對應屬性:mMeasuredHeight)和寬(對應屬性:

  mMeasureWidth),每一個View的控件的實際寬高都是由父視圖和自己視圖決定的。

  具體的調用鏈以下: ViewRoot根對象的屬性mView(其類型通常爲ViewGroup類型)調用measure()方法去計算View樹的大小,回調View/ViewGroup對象的onMeasure()方法,該方法實現的功能以下:   

         一、設置本View視圖的最終大小,該功能的實現經過調用setMeasuredDimension()方法去設置實際的高(對應屬性:mMeasuredHeight)和寬(對應屬性:mMeasureWidth)。

         2 、若是該View對象是個ViewGroup類型,須要重寫該onMeasure()方法,對其子視圖進行遍歷的measure()過程。對每一個子視圖的measure()過程,是經過調用父類ViewGroup.java類裏的measureChildWithMargins()方法去實現,該方法內部只是簡單地調用了View對象的measure()方法。

二、layout佈局過程

主要做用:爲將整個根據子視圖的大小以及佈局參數將View樹放到合適的位置上。

具體的調用鏈以下:

          一、layout方法會設置該View視圖位於父視圖的座標軸,即mLeft,mTop,mLeft,mBottom(調用setFrame()函數去實現)接下來回調onLayout()方法(若是該View是ViewGroup對象,須要實現該方法,對每一個子視圖進行佈局)。

      二、若是該View是個ViewGroup類型,須要遍歷每一個子視圖chiildView,調用該子視圖的layout()方法去設置它的座標值。

三、draw()繪圖過程

  由ViewRoot對象的performTraversals()方法調用draw()方法發起繪製該View樹,值得注意的是每次發起繪圖時,並不會從新繪製每一個View樹的視圖,而只會從新繪製那些「須要重繪」的視圖,View類內部變量包含了一個標誌位DRAWN,當該視圖須要重繪時,就會爲該View添加該標誌位。

調用流程 :

          1 、繪製該View的背景

          2 、爲顯示漸變框作一些準備操做(大多數狀況下,不須要改漸變框)          

          三、調用onDraw()方法繪製視圖自己(每一個View都須要重載該方法,ViewGroup不須要實現該方法)

          四、調用dispatchDraw ()方法繪製子視圖(若是該View類型不爲ViewGroup,即不包含子視圖,不須要重載該方法)

值得說明的是,ViewGroup類已經爲咱們重寫了dispatchDraw ()的功能實現,應用程序通常不須要重寫該方法,但能夠重載父類函數實現具體的功能。

參考blog分享:http://blog.csdn.net/qinjuning/article/details/7110211

5、Android中的事件處理

一、Handler機制

Android中主線程也叫UI線程,那麼從名字上咱們也知道主線程主要是用來建立、更新UI的,而其餘耗時操做,好比網絡訪問,或者文件處理,多媒體處理等都須要在子線程中操做,之因此在子線程中操做是爲了保證UI的流暢程度,手機顯示的刷新頻率是60Hz,也就是一秒鐘刷新60次,每16.67毫秒刷新一次,爲了避免丟幀,那麼主線程處理代碼最好不要超過16毫秒。當子線程處理完數據後,爲了防止UI處理邏輯的混亂,Android只容許主線程修改UI,那麼這時候就須要Handler來充當子線程和主線程之間的橋樑了。

咱們一般將Handler聲明在Activity中,而後覆寫Handler中的handleMessage方法,當子線程調用handler.sendMessage()方法後handleMessage方法就會在主線程中執行。

這裏面除了Handler、Message外還有隱藏的Looper和MessageQueue對象。

在主線程中Android默認已經調用了Looper.preper()方法,調用該方法的目的是在Looper中建立MessageQueue成員變量並把Looper對象綁定到當前線程中。當調用Handler的sendMessage(對象)方法的時候就將Message對象添加到了Looper建立的MessageQueue隊列中,同時給Message指定了target對象,其實這個target對象就是Handler對象。主線程默認執行了Looper.looper()方法,該方法從Looper的成員變量MessageQueue中取出Message,而後調用Message的target對象的handleMessage()方法。這樣就完成了整個消息機制。

二、事件分發機制

2.1 事件分發中的onTouch和onTouchEvent有什麼區別,又該如何使用?

這兩個方法都是在View的dispatchTouchEvent中調用的,onTouch優先於onTouchEvent執行。若是在onTouch方法中經過返回true將事件消費掉,onTouchEvent將不會再執行。

另外須要注意的是,onTouch可以獲得執行須要兩個前提條件,第一mOnTouchListener的值不能爲空,第二當前點擊的控件必須是enable的。所以若是你有一個控件是非enable的,那麼給它註冊onTouch事件將永遠得不到執行。對於這一類控件,若是咱們想要監聽它的touch事件,就必須經過在該控件中重寫onTouchEvent方法來實現。

2.2 請描述一下Android的事件分發機制

Android的事件分發機制主要是Touch事件分發,有兩個主角:ViewGroup和View。Activity的Touch事件事實上是調用它內部的ViewGroup的Touch事件,能夠直接當成ViewGroup處理。

View在ViewGroup內,ViewGroup也能夠在其餘ViewGroup內,這時候把內部的ViewGroup當成View來分析。

先分析ViewGroup的處理流程:首先得有個結構模型概念:ViewGroup和View組成了一棵樹形結構,最頂層爲Activity的ViewGroup,下面有若干的ViewGroup節點,每一個節點之下又有若干的ViewGroup節點或者View節點,依次類推。如圖:

 

當一個Touch事件(觸摸事件爲例)到達根節點,即Acitivty的ViewGroup時,它會依次下發,下發的過程是調用子View(ViewGroup)的dispatchTouchEvent方法實現的。簡單來講,就是ViewGroup遍歷它包含着的子View,調用每一個View的dispatchTouchEvent方法,而當子View爲ViewGroup時,又會經過調用ViwGroup的dispatchTouchEvent方法繼續調用其內部的View的dispatchTouchEvent方法。上述例子中的消息下發順序是這樣的:①-②-⑤-⑥-⑦-③-④。dispatchTouchEvent方法只負責事件的分發,它擁有boolean類型的返回值,當返回爲true時,順序下發會中斷。在上述例子中若是⑤的dispatchTouchEvent返回結果爲true,那麼⑥-⑦-③-④將都接收不到本次Touch事件。

1.Touch事件分發中只有兩個主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個相關事件。View包含dispatchTouchEvent、onTouchEvent兩個相關事件。其中ViewGroup又繼承於View。

2.ViewGroup和View組成了一個樹狀結構,根節點爲Activity內部包含的一個ViwGroup。

3.觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個,Move有若干個,能夠爲0個。

4.當Acitivty接收到Touch事件時,將遍歷子View進行Down事件的分發。ViewGroup的遍歷能夠當作是遞歸的。分發的目的是爲了找到真正要處理本次完整觸摸事件的View,這個View會在onTouchuEvent結果返回true。

5.當某個子View返回true時,會停止Down事件的分發,同時在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進行處理。因爲子View是保存在ViewGroup中的,多層ViewGroup的節點結構時,上級ViewGroup保存的會是真實處理事件的View所在的ViewGroup對象:如ViewGroup0-ViewGroup1-TextView的結構中,TextView返回了true,它將被保存在ViewGroup1中,而ViewGroup1也會返回true,被保存在ViewGroup0中。當Move和UP事件來時,會先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。

6.當ViewGroup中全部子View都不捕獲Down事件時,將觸發ViewGroup自身的onTouch事件。觸發的方式是調用super.dispatchTouchEvent函數,即父類View的dispatchTouchEvent方法。在全部子View都不處理的狀況下,觸發Acitivity的onTouchEvent方法。

7.onInterceptTouchEvent有兩個做用:1.攔截Down事件的分發。2.停止Up和Move事件向目標View傳遞,使得目標View所在的ViewGroup捕獲Up和Move事件。

 

6、Android簽名

一、簡單描述下Android 數字簽名

在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係。

Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序。

這個數字證書並不須要權威的數字證書籤名機構認證(CA),它只是用來讓應用程序包自我認證的。

同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處。

(1)有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本。若是新版程序和舊版程序的數字證書不相同,則Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名。

(2)有利於程序的模塊化設計和開發。Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序。因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊。

在簽名時,須要考慮數字證書的有效期:

(1)數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級。

(2)若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期。

(3)Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。

Android數字證書包含如下幾個要點:

 (1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序

 (2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證

 (3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。

 (4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。

二、使用Eclipse如何生成數字簽名

能夠經過Eclipse導出工程時爲當前工程設置簽名證書。File -> Export ->Export Android Application ->Create New keystore ....

7、Android中的動畫

一、Android中的動畫有哪幾類,它們的特色和區別是什麼

Android中動畫分爲兩種,一種是Tween動畫、還有一種是Frame動畫。

Tween動畫,這種實現方式能夠使視圖組件移動、放大、縮小以及產生透明度的變化;

Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。

二、如何修改Activity進入和退出動畫

能夠經過兩種方式,一是經過定義Activity的主題,二是經過覆寫Activity的overridePendingTransition方法。

 經過設置主題樣式

在styles.xml中編輯以下代碼:

@anim/slide_in_left @anim/slide_out_left @anim/slide_in_right @anim/slide_out_right " v:shapes="_x0000_s1034">

添加themes.xml文件:

@style/AnimationActivity true " v:shapes="_x0000_s1033">

在AndroidManifest.xml中給指定的Activity指定theme。

 覆寫overridePendingTransition方法

 overridePendingTransition(R.anim.fade, R.anim.hold);

8、其餘知識(非歸類內容)

一、AsyncTask如何使用

AsyncTask用於處理異步任務,該類是一個抽象的泛型類。類的簽名以下:public abstract class AsyncTask<Params, Progress, Result>。

三種泛型類型分別表明「啓動任務執行的輸入參數」、「後臺任務執行的進度」、「後臺計算結果的類型」。在特定場合下,並非全部類型都被使用,若是沒有被使用,能夠用java.lang.Void類型代替。

一個異步任務的執行通常包括如下幾個步驟:

1.execute(Params... params),執行一個異步任務,須要咱們在代碼中調用此方法,觸發異步任務的執行。

2.onPreExecute(),在execute(Params... params)被調用後當即執行,通常用來在執行後臺任務前對UI作一些標記。

3.doInBackground(Params... params),在onPreExecute()完成後當即執行,用於執行較爲費時的操做,此方法將接收輸入參數和返回計算結果。在執行過程當中能夠調用publishProgress(Progress... values)來更新進度信息。

4.onProgressUpdate(Progress... values),在調用publishProgress(Progress... values)時,此方法被執行,直接將進度信息更新到UI組件上。

5.onPostExecute(Result result),當後臺操做結束時,此方法將會被調用,計算結果將作爲參數傳遞到此方法中,直接將結果顯示到UI組件上。

在使用的時候,有幾點須要格外注意:

1.異步任務的實例必須在UI線程中建立。

2.execute(Params... params)方法必須在UI線程中調用。

3.不要手動調用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)這幾個方法。

4.不能在doInBackground(Params... params)中更改UI組件的信息。

5.一個任務實例只能執行一次,若是執行第二次將會拋出異常。

我寫一個簡單的例子來演示AsyncTask的用法。

  • MainActivity.java

asyncTask = new MyAsyncTask(); asyncTask.execute(100); } class MyAsyncTask extends AsyncTask<integer, integer,="" string="">{ /** * 該方法在子線程中運行,所以不能有任何修改UI操做 */ @Override protected String doInBackground(Integer... params) { for(int i=0;i<params[0];i++){ try="" {="" 模擬耗時操做="" thread.sleep(100);="" }="" catch="" (interruptedexception="" e)="" e.printstacktrace();="" 發送進度="" publishprogress(i);="" return="" "任務已經完成";="" **="" *="" 任務執行前在ui線程中調用="" "="">

 

* @param result 正是doInBackground的返回值 */ @Override protected void onPostExecute(String result) { Toast.makeText(MainActivity.this, result, 0).show(); super.onPostExecute(result); } /** * 在UI線程中執行 * 當doInBackground執行publishProgress時調用該方法 */ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); tv.setText("當前進度:"+values[0]); } } } " v:shapes="_x0000_s1031">

activity_main.xml

相關文章
相關標籤/搜索