Android基礎總結

Android基礎總結

1、方法重載與覆蓋的區別?( Overload與Override的區別)


答: 方法的重載屬於編譯時多態,方法名相同參數列表不同,返回值必須相同或都沒有返回值類型。方法的覆蓋屬於運行時多態,子類覆蓋父類的方法,子類指向父類引用,在調用方法的時候用父類的引用調用。

2、String 和StringBuffer的區別

答: STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法。

3、字符串“abcde”通過寫一個函數不讓調用第三方的字符串,實現一個字符串倒序,比如字符串“abcde” 變成“edcba”

答: String src = "ABCDEF ";

String dst  =  new  StringBuffer(src).reverse().toString();

4、抽象類與接口的區別(abstract與interface的區別)

答:abstract可以修飾抽象方法,而一個類只要有一個抽象方法,就必須用abstract定義該類,即抽象類。

用interface修飾的類,裏面的方法都是抽象方法,因此在定義接口的時候,可以直接不加那些修飾,系統會默認的添上去。接口裏面的字段都是公有常量,即public static final修飾的字段。

5、集合的實現類與區別?

答:Collection接口,集合結構總的父接口,有兩個子接口list和set

  List接口 元素有序可重複.

  實現類有:ArrayList 數組實現輕量級,運行快,線程不安全。JDK1.2 查詢快

 Vector   數組實現重量級,運行慢,線程安全。JDK1.0

 LinkedList鏈表實現 常用語堆棧與隊列的實現 增刪操作快

Set 接口 元素無序不可重複

實現類有:HashSet,底層用hashCode()算法實現,保證元素的無序唯一,自定義對象存進HashSet爲了保證元素內容不重複需要覆蓋hashCode()與equals()方法。

         SortedSet(不重要) 元素有序(Unicode升序)唯一

 TreeSet要求元素有序,自定義的對象需要實現Comparable接口的 compareTo(object o)方法

Map(接口): 與Collection接口無關,有一個子接口SortedMap特點: 元素是key-value, key

唯一,無序; value可重複

實現類: HashMap 輕量級 線程不安全的,允許key或value爲null JDK1.2

       HashTable 重量級 線程安全的 不允許key或value爲null   JDK1.0

      Properties是HashTable的子類,主鍵和值都是字符串

SortedMap:(不重要)

特點: key唯一,有序(Unicode升序)

實現類:TreeMap

6、線程有幾種狀態,分別是哪些?(調用run()和調用start()的區別)

答:1)、新建狀態(New):新創建了一個線程對象。

  2)、就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待獲取CPU的使用權。

  3)、運行狀態(Running):就緒狀態的線程獲取了CPU,執行run()方法。

  4)、阻塞狀態(Blocked):阻塞狀態是線程因爲某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,纔有機會轉到運行狀態。阻塞的情況分三種:

  (一)、等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。

  (二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池中。

  (三)、其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置爲阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。

5)、死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命週期。

當調用start方法的時候,該線程就進入就緒狀態。等待CPU進行調度執行,此時還沒有真正執行線程。

當調用run方法的時候,是已經被CPU進行調度,執行線程的主要任務。

7、線程的實現方式

答:線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口

8、sleep() 與 wait()的區別

答:1.這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object

類。

2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可

以使用同步控制塊或者方法。sleep不出讓系統資源;wait是進入線程等待池

等待,出讓系統資源,其他線程可以佔用CPU。一般wait不會加時間限制,

因爲如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用

notify/notifyAll喚醒等待池中的所有線程,纔會進入就緒隊列等待OS分配系

統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到

只能調用interrupt()強行打斷。

3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而

sleep可以在任何地方使用

4. Sleep需要捕獲異常,而wait不需要

9、線程中wait,join,sleep,yield, notify,notifyall,synchronized,區別及聯繫

答:1).sleep()方法

在指定時間內讓當前正在執行的線程暫停執行,但不會釋放“鎖標誌”。不推薦使用。sleep()使當前線程進入阻塞狀態,在指定時間內不會執行。

2).wait()方法

在其他線程調用對象的notify或notifyAll方法前,導致當前線程等待。線程會釋放掉它所佔有的“鎖標誌”,從而使別的線程有機會搶佔該鎖。

喚醒當前對象鎖的等待線程使用notify或notifyAll方法,waite() 和notify()必須在synchronized函數或synchronized block中進行調用。3.yield方法

暫停當前正在執行的線程對象。yield()只是使當前線程重新回到可執行狀態,所以執行3)yield()的線程有可能在進入到可執行狀態後馬上又被執行。yield()只能使同優先級或更高優先級的線程有執行的機會。

4).join方法

等待該線程終止。等待調用join方法的線程結束,再繼續執行。如:t.join();//主要用於等待t線程運行結束,若無此句,main則會執行完畢,導致結果不可預測。

10、Final、finally、finanlize()的區別

答:final?用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不

可繼承。

finally是異常處理語句結構的一部分,表示總是執行。

finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。

11、常用設計模式及應用場景,用兩種方式實現單例模式,要求線程安全?

答:  常用設計模式:

   單例模式: Calendar實例的獲取

   適配器模式: Adapter爲ListView GridView等添加數據

工廠模式: Spring IOC 反轉控制

代理模式: Spring AOP 面向切面編程

觀察者模式: ContentObserver監聽內容改變

(懶漢式)程序執行過程中需要這個類的對象時再實例化該類的對象

步驟1.定義靜態私有對象

2. 構造方法私有化保證在類的外部無法實例化該類的對象

   3. 定義對外開放的靜態方法在調用方法是判斷對象是否爲空,爲空再創建對象返回

public class Singleton {

private static Singleton singleton;

// 構造方法私有化,保證在類的外部無法實例化該類的對象

private Singleton() {

}

public static synchronized Singleton getSingletonInstance() {

 if (singleton == null) {

  singleton = new Singleton();

 }

 return singleton;

}

}

(餓漢式)類加載的時候就實例化該類的對象

public class Singleton {

private static Singleton  singleton = new Singleton();

// 構造方法私有化,保證在類的外部無法實例化該類的對象

private Singleton() {

}

public static Singleton getSingletonInstance() {

 return singleton;

}

}

12、常用排序算法,時間複雜度,實現思路

答: 冒泡排序 O(n^2) : 冒泡排序也是最簡單最基本的排序方法之一。冒泡排序的思想很簡單,就是以此比較相鄰的元素大小,將小的前移,大的後移,就像水中的氣泡一樣,最小的元   素經過幾次移動,會最終浮到水面上。

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

// 內循環控制比較後移位      

for (int j = num.length-1; j > i ; j--) {      

               if (num[j-1]>num[j]) {      

                   temp = num[j-1];      

                   num[j-1] = num[j];      

                   num[j] = temp;      

               }      

           }  

快速排序O(n log n)  : 快速排序採用的思想是分治思想。快速排序算法的核心算法是分區操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞歸。

插入排序 O(n^2) :將新來的元素按順序放入一個已有的有序序列當中。

選擇排序 O(n^2) :第i趟簡單選擇排序是指通過n-i次關鍵字的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i個記錄進行交換。共需進行i-1趟比較,直到所有記錄排序完成爲止。

13、android系統架構?

答:1)應用程序層      java語言    應用程序開發

2)應用程序框架層  java語言    OS定製  framework層開發

3)系統運行庫層    C C++ 實現   so庫

4)Linux內核層

14、Activity生命週期?保存activity的一些信息在哪個生命週期方法中?

答:共有七個周期函數:

void onCreate(Bundle savedInstanceState) 第一次創建時調用

void onStart()   被用戶可見時調用

void onRestart()  當Activity處於stop狀態又被重新啓動時調用

void onResume() 當獲得焦點即可與用戶交互時調用

void onPause()  當失去焦點時調用

void onStop()   當不可見時調用

void onDestroy()  當銷燬時調用

15、Activity的 onSaveInstanceState() 和 onRestoreInstanceState()

答: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命週期方法,它們不同於 onCreate()、onPause()等生命週期方法,它們並不一定會被觸發。當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷燬一個Activity時,onSaveInstanceState() 會被調用。但是當用戶主動去銷燬一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因爲在這種情況下,用戶的行爲決定了不需要保存Activity的狀態。通常onSaveInstanceState()只適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。

另外,當屏幕的方向發生了改變, Activity會被摧毀並且被重新創建,如果你想在Activity被摧毀前緩存一些數據,並且在Activity被重新創建後恢復緩存的數據。可以重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。

16、Android的四大組件是什麼?它們的作用是什麼?

答:Android有四大組件:Activity、Service、Broadcast Receiver、Content Provider。

Activity :應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。

Service 服務:一個Service 是一段長生命週期的,沒有用戶界面的程序,可以用來開發如監控類程序。

BroadcastReceive廣播接收器:你的應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啓動一個activity或serice 來響應它們收到的信息。

Content Provider內容提供者 :主要用於多個應用間數據共享。這些數據可以存儲在文件系統中或SQLite數據庫。

17、廣播如何調用,有什麼方式,各自的區別?

答:程序中發送廣播通過sendBroadcastReceiver()實現

接收廣播通過定義一個類繼承BroadcastReceiver並重寫onReceive()方法實現

註冊廣播有兩種方式:

第一種靜態方式:在清單文件中通過<receive>標籤聲明

第二種代碼動態方式:

IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomgSMSReceiver();

registerReceiver(receiver.filter);

1)第一種不是常駐型廣播,也就是說廣播跟隨activity的生命週期。注意: 在activity結束前,移除廣播接收器。

2)第二種是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。

18、Android中asset文件夾和raw文件夾區別?

答:res/raw和assets的相同點:

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

res/raw和assets的不同點:

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

2)res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾

3)讀取文件資源舉例:

讀取res/raw下的文件資源,通過以下方式獲取輸入流來進行寫操作

InputStream is = getResources().openRawResource(R.raw.filename);

讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作

AssetManager am = null;

am = getAssets();

InputStream is = am.open("filename");

19、Android中的五種存儲方式及其應用場景

答:1)SharedPreferences  

存儲路徑:(data/data/packagename/shares_prefs), 輕量級存儲,以鍵值對的形式存儲在xml中,一般用來保存應用中的設置屬性

   2)文件存儲             ;opSD卡存儲多媒體文件, 文件緩存

   3) Sqlite數據庫        存儲路徑:(data/data/packagename/databases), 一種嵌入式數據庫,支持sql語言,存儲大量結構性數據

   4)ContentProvider  進程(應用程序)間數據共享,數據源可以是sqlite,也可以是xml,相關類: ContentResolver(內容解析器), ContentObserver(數據                        觀察者)

   5) 網絡存儲    天氣數據的xml,json格式等等,通過HttpUrlConnection,HttpClient,或者SOAP協議獲取數據

20、什麼是ANR 如何避免它?(Android線程間的通信方式? )

答:ANR:Application Not Responding(應用程序無響應).當出現下列情況時,Android就會顯示ANR對話框了:   對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒 意向接受器(intentReceiver)超過10秒鐘仍未執行完畢Android應用程序完全運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,需要消耗大量時間的操作都會引發ANR。

解決方案有兩種:

1. AsyncTask異步任務中,doInBackground()和onPostExecute(Result)兩個方法非常重要

doInBackground() 這個方法運行在後臺線程中,主要負責執行那些很耗時的操作,如移動護理系統中的網絡連接、解析XML等操作。該方法必須重載。

onPostExecute(Result) 這個方法也運行於UI線程,在doInBackground(Params…)方法執行後調用,該方法用於處理後臺任務執行後返回的結果。

2.  子thread + handler

21、Handler的運行機制(運行原理)(Handler,Looper,MessageQueue,Message之間的關係)

一個Handler允許你發送和處理Message和Runable對象,每個線程都有自己的Looper,每個Looper中封裝着MessageQueue。Looper負責不斷的從自己的消息隊列裏取出隊頭的任務或消息執行。每個handler也和線程關聯,Handler負責把Message和Runable對象傳遞給MessageQueue(用到post ,sendMessage等方法),而且在這些對象離開MessageQueue時,Handler負責執行他們(用到handleMessage方法)。

其中Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域。

22、listview優化策略?(現在使用RecycleView的比較多了,但是優化原理差不多)

答:1)、對convetView進行判空,是當convertView不爲空的時候直接重新使用convertView

從而減少了很多不必要的View的創建

2)定義一個ViewHolder,將convetView的tag設置爲ViewHolder,不爲空時重新使用即可

3)、當ListView加載數據量較大時可以採用分頁加載和圖片異步加載

23、ListView分頁加載實現思路?

實現OnScrollListener 接口重寫onScrollStateChanged 和onScroll方法,使用onscroll方法實現”滑動“後處理檢查是否還有新的記錄,如果有,調用 addFooterView,添加記錄到adapter, adapter調用 notifyDataSetChanged 更新數據;如果沒有記錄了,把自定義的mFooterView去掉。使用onScrollStateChanged可以檢測是否滾到最後一行且停止滾動然後執行加載  

24、ListView圖片異步加載實現思路?()

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

2.獲取不到的話從SD卡里獲取(SD卡緩衝,,從SD卡獲取圖片是放在子線程裏執行的,否則快速滑屏的話會不夠流暢)

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

25、Intent的原理,作用,可以傳遞哪些類型的參數?

答:intent是連接Activity, Service, BroadcastReceiver, ContentProvider四大組件的信使,,可以傳遞八種基本數據類型以及string, Bundle類型,以及實現了Serializable或者Parcelable的類型。

Intent可以劃分成顯式意圖和隱式意圖。

顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent爲顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。

隱式意圖:沒有明確指定組件名的Intent爲隱式意圖。 Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。

26、如何實現屏幕分辨率的自適應?

答: 最好可以通過權重(layout_weight)的方式來分配每個組件的大小,也可以通過具體的像素(dip)來確定大小。

儘量使用Relativelayout  。

已知應用支持平臺設備的分辨率,可以提供多個layout_320*480  ...

drawable-hdpi,drawable-mdpi,drawable-ldpi分別代表分辨率爲480*800,360*480,240*360, 放置圖片大小相差1.5倍

最後還需要在AndroidManifest.xml裏添加下面一段,沒有這一段自適應就不能實現:

<supports-screens

android:largeScreens="true"

android:normalScreens="true"

 android:anyDensity = "true"/>

在</application>標籤和</manifest> 標籤之間添加上面那段代碼。即可。

備註:三者的解析度不一樣,就像你把電腦的分辨率調低,圖片會變大一樣,反之分辨率高,圖片縮小

還可以通過.9.png實現圖片的自適應

27、簡述Android中的IPC機制

IPC(Inter-Process Communication,進程間通信),aidl是 Android Interface definition language的縮寫,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口.編譯器可以通過擴展名爲aidl的文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的.

BroadcastReceiver也可以實現進程間通信

ContentProvider 提供進程間數據共享

28、Android程序入口如何判斷?

action節點中的android.intent.action.MAIN表明它所在的Activity是整個應用程序的入口點

29、android哪幾種方式訪問網絡?

HttpURLConnection

HttpClient方式(HttpGet和HttpPost類)

30、說說HttpClient的通信過程

1.生成請求對象(HttpGet get,HttpPost post)

2.生成客戶端對象 HttpClient client

3.執行請求接收相應 HttpResponse response = client.execute(post)

                    HttpEntity entity = response.getEntity()

4.得到數據流

InputStream inputStream = entity.getContent();

5.最後關閉過期連接

31、移動互聯數據交互格式有哪些及其區別?(Json與xml的區別?)

移動互聯數據交互格式有XML和JSON

1.JSON和XML的數據可讀性基本相同

2.JSON和XML同樣擁有豐富的解析手段

3.JSON相對於XML來講,數據的體積小

4.JSON與Javas cript的交互更加方便

5.JSON對數據的描述性比XML較差

6.JSON的速度要遠遠快於XML

32、XML解析有哪幾種?各自優缺點,官方推薦使用哪種?

基本的解析方式有三種: DOM,SAX,Pull

1.dom解析解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM 接口來操作這個樹結構的優點是對文檔增刪改查比較方便,缺點佔用內存比較大。

2.sax解析基於事件驅動型,優點佔用內存少,解析速度快,缺點是隻適合做文檔的讀取,不適合做文檔的增刪改查。

3.pull解析同樣基於事件驅動型,android 官方API提供,可隨時終止

33、百度地圖核心類,及實現的功能?

BMapManager:地圖引擎管理類,負責初始化,開啓地圖API,終止百度地圖API等工作

MKSearch:搜索服務.用於位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索

MKSearchListener搜索結果通知接口。該接口返回poi搜索,公交搜索,駕乘路線,步行路線結果

MapView:顯示地圖的View

MyLocationOverlay:一個負責顯示用戶當前位置的Overlay。

Overlay:Overlay是一個基類,它表示可以顯示在地圖上方的覆蓋物。

34、GC內存泄露在什麼情況下回出現?怎麼解決?

(一) 查詢數據庫沒有關閉遊標

(二) 構造Adapter時,沒有使用緩存的 convertView

(三) Bitmap對象不在使用時調用recycle()釋放內存

(四) 不用的對象沒有及時釋放對象的引用

35、android內存的優化

答:android內存泄露容易導致內存溢出,又稱爲OOM。

Android內存優化策略:

1)在循環內儘量不要使用局部變量

2)不用的對象即時釋放,即指向NULL

3)數據庫的cursor即時關閉。

4)構造adapter時使用緩存contentview

5)調用registerReceiver()後在對應的生命週期方法中調用unregisterReceiver()

6)即時關閉InputStream/OutputStream。

7)android系統給圖片分配的內存只有8M, 圖片儘量使用軟引用, 較大圖片可通過BitmapFactory縮放後再使用,並及時recycle

8)儘量避免static成員變量引用資源耗費過多的實例。

36、加載大圖片的時候如何防止內存溢出

答: android系統給圖片分配的內存只有8M,當加載大量圖片時往往會出現OOM。

Android加載大量圖片內存溢出解決方案:

1)儘量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,因爲這些函數在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多內存,可以通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設爲ImageView的 source  

2)使用BitmapFactory.Options對圖片進行壓縮

InputStream is = this.getResources().openRawResource(R.drawable.pic1);

    BitmapFactory.Options options=new BitmapFactory.Options();

    options.inJustDecodeBounds = false;

    options.inSampleSize = 10;   //width,hight設爲原來的十分一

    Bitmap btp =BitmapFactory.decodeStream(is,null,options);

3)運用Java軟引用,進行圖片緩存,將需要經常加載的圖片放進緩存裏,避免反覆加載

及時銷燬不再使用的Bitmap對象

  if(!bmp.isRecycle() ){

        bmp.recycle()   //回收圖片所佔的內存

        system.gc()  //提醒系統及時回收

  }

37、Android緩存機制

答: 客戶端緩存機制是android應用開發中非常重要的一項工作,使用緩存機制不僅僅可以爲用戶節省3G流量,同時在用戶體驗方面也是非常好的選擇,比如有些新聞客戶端支持離線模式,也是通過緩存機制實現的.緩存機制分爲兩部分,一部分是文字緩存,另一部分是多媒體文件緩存.

文字緩存有兩種實現:

1)可以將與服務器交互得到的json數據或者xml數據存入sd卡中,並在數據庫添加該數據的記錄.添加數據庫記錄時,提供兩個關鍵字段,一個是請求的URL,另一個則是本地保存後的文件地址,每次加載數據之前都會根據URL在數據庫中檢索

2)將JSON數據解析後裝入List<Map>對象中,然後遍歷List,將數據統統寫入相應的數據庫表結構中,以後每次向服務器發起請求之前可以先在數據庫中檢索,如果有直接返回.

多媒體文件緩存:主要指圖片緩存

圖片的緩存可以根據當前日期,時間爲名字緩存到SD卡中的指定圖片緩存目錄,同時數據庫中做相應記錄,記錄辦法可以採用兩個關鍵字段控制,一個字段是該圖片的URL地址,另一個字段是該圖片的本機地址.取圖片時根據URL在數據中檢索,如果沒有則連接服務器下載,下載之後再服務器中作出相應記錄

緩存文件刪除策略:

1. 每一個模塊在每次客戶端自動或者用戶手動更新的時候刪除相應模塊的緩存文件,並重新下載新的緩存文件.

2. 在設置界面中提供刪除緩存的功能,點擊後刪除本機所有緩存.

38、如何實現消息推送,有哪些方式,各自優缺點,最常使用哪種?

答:實現消息推送的方式有五種,分別是輪詢,SMS,C2DM,MQTT,XMPP最常使用的是XMPP, 我們做項目時採用的是XMPP協議

1.XMPP協議,它是一種基於XML的傳遞協議,具有很強的靈活性和可擴展性。它的特點是將複雜性從客戶端轉移到了服務器端。GTalk、QQ、IM等都用這個協議。

2.輪詢:客戶端定時去服務端取或者保持一個長Socket,從本質講這個不叫推送,    而是去服務端拽數據。但是實現簡單,主要缺點:耗電,浪費用戶流量等

3.Google的C2DM,具體不細說,缺點,服務器在國外,不是很穩定。

4.通過短信方式, 但是很難找到免費短信平臺

5. MQTT協議, IBM提供的一種推送服務,不太靈活

39、MVC在Android中的應用(現在主流框架是mvp+retrofit+rxjava+dagger2,MVC已經不太常用了)

答: Android中界面部分也採用了當前比較流行的MVC框架,在Android中:

  1) 視圖層(View):一般採用XML文件進行界面的描述,使用的時候可以非常方便的引入。也可以使用Javas cript+HTML等的方式作爲View層,通過WebView組件加載,同時可以實現Java和Javas cript之間的通信。    

  2) 控制層(Controller):這句話也就暗含了不要在Acitivity中寫代碼,要通過Activity交割Model業務邏輯層處理,這樣做的另外一個原因是Android中的Acitivity的響應時間是5s,如果耗時的操作放在這裏,Android的控制層的重任通常落在了衆多的Acitvity的肩上,程序就很容易被回收掉。

3) 模型層(Model):對數據庫的操作、對網絡等的操作都應該在Model裏面處理,當然對業務計算等操作也是必須放在的該層的。

     在Android SDK中的數據綁定,也都是採用了與MVC框架類似的方法來顯示數據。在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,從而實現了數據綁定。比如顯示Cursor中所有數據的ListActivity,其視圖層就是一個ListView,將數據封裝爲ListAdapter,並傳遞給ListView,數據就在ListView中顯示。

40、Android自定義組件實現思路

答: Android自定義組件有三種實現思路:

1) 繼承某個現有組件,在其基礎上添加額外功能,如繼承Gallery實現CoverFlow效果

2) 繼承某個Layout,實現複合組件自定義,如TextView和EditText組合實現登錄註冊組件

3) 繼承View,實現onDraw()方法,實現自己繪製組件,如翻頁效果組件

41、版本更新的實現思路

答:在服務器相應URL上有版本文件, 客戶端同時存儲該應用當前版本號  (SharedPreferences/Sqlite), 每次打開應用,去檢測服務器版本號與本地版本號是否一致,如果不一 致,則自定義對話框提示是否下載更新

42、播放視頻有哪些實現方式?

答:1.使用系統自帶的播放器來播放,指定Action爲ACTION_VIEW,Data爲Uri,Type爲其MIME類型。

//調用系統自帶的播放器    

         Intent intent = new Intent(Intent.ACTION_VIEW);    

         intent.setDataAndType(uri, "video/mp4");    

         startActivity(intent);

2. 使用VideoView組件來播放, 可以結合MediaController來實現播控, 只是不能隨意更改視頻的大小及位置。

3. 使用MediaPlayer和SurfaceView來實現,這種方式很靈活,可以自定義視頻播放的大小和位置。

43、NDK開發流程?(JNI運行原理)

答: NDK應用的開發流程(在應用中定義本地接口(native), 編譯成.h頭文件,交由C程序員實現,將.c實現通過NDK編譯成.so動態鏈接庫,導入項目中libs/armeabi,代碼中調用該本地接口)

應用場景: 音頻,視頻解碼,拍攝車牌號,識別車牌號

44、如何實現一鍵退出?

答:定義一個類繼承Application,定義一個集合存放所有的activity,

定義一個添加的方法,再寫一個退出的方法,使用for循環全部調用finish方法,然

後在每個Activity的onCreate方法中調用自定義類裏的添加方法,然後在需要使用一

鍵退出的地方調用類中的退出方法即可。

45、AndroidManifest.xml清單文件<Activity>標籤中屬性android:excludeFromRecents="true" android:screenOrientation="portrait"     android:configChanges="orientation|locale"的含義

答: android:excludeFromRecents表示是否可被顯示在最近打開的activity列表裏,true表示否,false表示是

android:screenOrientation表示activity顯示的模式, 一般用來設置activity橫屏顯示(horizontal)或豎屏顯示(portrait)

android:configChanges=[oneormoreof:"mcc""mnc""locale""touchscreen""keyboard""keyboardHidden""navigation""orientation""fontScale"]

是當所指定屬性(Configuration Changes)發生改變時,通知程序調用 onConfigurationChanged()函數,比如orientation屏幕方向發生改變,locale語言環境發生改變時

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

答:在清單文件AndroidManifest.xml中相應的<activity>標籤內設置屬性android:theme=”@android:style/Theme.Dialog”

47、談談UI中, Padding和Margin有什麼區別,gravity與layout_gravity的區別

答:Padding 用來指定組件內的內容距離組件邊界的距離;

   Margin用來指定控件與控件之間的距離

Gravity用來指定組件內的內容相對於組件本身的位置

Layout_gravity用來指定組件相對於其父組件的位置

48、哪個組件可以實現手風琴效果,用來實現設置界面的類,實現抽屜效果, 懸浮窗口?

答:實現手風琴效果(ExpandableListView)

設置界面的類(preferenceActivity)保存到sharedpreference中

抽屜效果(slidingDrawer)組件

   懸浮窗口: PopWindow,可以實現類似Dialog和菜單的效果

49、Android SDK 3.0(HoneyComb)及4.0(Ice Cream)新特性

答:新版SDK發佈的同時也發佈了一個擴展包android-support-v4,把部分特性單獨的抽出來,使低版本的SDK也可以使用這些特性,主要支持以下特性:

Fragment: 3.0引入,碎片管理,可以局部刷新UI,它設計的功能和Activity一樣強大,包括生命週期、導航等,Fragment的每次導航都可以記錄下來用於返回。

ViewPager: 提供了多界面切換的新效果

GridLayout: 4.0引入, 網格佈局, android第六大布局

Loader: 裝載器從android3.0開始引進。它使得在activity或fragment中異步加載數據變得簡單

50、android客戶端如何實現自動登錄

答: 通過SharedPreferences存儲用戶名,密碼,當存儲不爲空時實現自動登錄功能
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章