Android求職之面試總結

一、 方法重載與覆蓋的區別?( Overload與Override的區別) 3
二、 String 和StringBuffer的區別 3
三、 字符串「abcde」經過寫一個函數不讓調用第三方的字符串,實現一個字符串倒序,好比字符串「abcde」 變成「edcba」 3
四、 抽象類與接口的區別(abstract與interface的區別) 3
五、 集合的實現類與區別? 3
六、 線程有幾種狀態,分別是哪些?(調用run()和調用start()的區別) 3
七、 線程的實現方式 4
八、 sleep() 與 wait()的區別 4
九、 線程中wait,join,sleep,yield, notify,notifyall,synchronized,區別及聯繫 4
十、 Final、finally、finanlize()的區別 4
十一、 經常使用設計模式及應用場景,用兩種方式實現單例模式,要求線程安全? 5
十二、 經常使用排序算法,時間複雜度,實現思路 5
1三、 android系統架構? 6
1四、 Activity生命週期?保存activity的一些信息在哪一個生命週期方法中? 6
1五、 Activity的 onSaveInstanceState() 和 onRestoreInstanceState() 6
1六、 Android的四大組件是什麼?它們的做用是什麼? 6
1七、 廣播如何調用,有什麼方式,各自的區別? 7
1八、 Android中asset文件夾和raw文件夾區別? 7
1九、 Android中的五種存儲方式及其應用場景 7
20、 什麼是ANR 如何避免它?(Android線程間的通訊方式? ) 8
2一、 Handler的運行機制(運行原理)(Handler,Looper,MessageQueue,Message之間的關係) 8
2二、 listview優化策略? 8
2三、 ListView分頁加載實現思路? 8
2四、 ListView圖片異步加載實現思路? 8
2五、 Intent的原理,做用,能夠傳遞哪些類型的參數? 8
2六、 如何實現屏幕分辨率的自適應? 9
2七、 簡述Android中的IPC機制 9
2八、 Android程序入口如何判斷? 9
2九、 android哪幾種方式訪問網絡? 9
30、 說說HttpClient的通訊過程 9
3一、 移動互聯數據交互格式有哪些及其區別?(Json與xml的區別?) 10
3二、 XML解析有哪幾種?各自優缺點,官方推薦使用哪一種? 10
3三、 百度地圖核心類,及實現的功能? 10
3四、 GC內存泄露在什麼狀況下回出現?怎麼解決? 10
3五、 android內存的優化 10
3六、 加載大圖片的時候如何防止內存溢出 10
3七、 Android緩存機制 11
3八、 如何實現消息推送,有哪些方式,各自優缺點,最常使用哪一種? 11
3九、 MVC在Android中的應用 12
40、 Android自定義組件實現思路 12
4一、 版本更新的實現思路 12
4二、 播放視頻有哪些實現方式? 12
4三、 NDK開發流程?(JNI運行原理) 12
4四、 如何實現一鍵退出? 12
4五、 AndroidManifest.xml清單文件標籤中屬性android:excludeFromRecents="true" android:screenOrientation="portrait"     android:configChanges="orientation|locale"的含義 13
4六、 如何將一個Activity設置成窗口的樣式 13
4七、 談談UI中, Padding和Margin有什麼區別,gravity與layout_gravity的區別 13
4八、 哪一個組件能夠實現手風琴效果,用來實現設置界面的類,實現抽屜效果, 懸浮窗口? 13
4九、 Android SDK 3.0(HoneyComb)及4.0(Ice Cream)新特性 13
50、 android客戶端如何實現自動登陸 13
一、方法重載與覆蓋的區別?( Overload與Override的區別)
答: 方法的重載屬於編譯時多態,方法名相同參數列表不一樣,返回值必須相同或都沒有返回值類型。方法的覆蓋屬於運行時多態,子類覆蓋父類的方法,子類指向父類引用,在調用方法的時候用父類的引用調用。
二、String 和StringBuffer的區別
答: STRING的長度是不可變的,STRINGBUFFER的長度是可變的。若是你對字符串中的內容常常進行操做,特別是內容要修改時,那麼使用StringBuffer,若是最後須要String,那麼使用StringBuffer的toString()方法。 
三、字符串「abcde」經過寫一個函數不讓調用第三方的字符串,實現一個字符串倒序,好比字符串「abcde」 變成「edcba」
答: String src = "ABCDEF ";
String dst  =  new  StringBuffer(src).reverse().toString();
四、抽象類與接口的區別(abstract與interface的區別)
答:abstract能夠修飾抽象方法,而一個類只要有一個抽象方法,就必須用abstract定義該類,即抽象類。
用interface修飾的類,裏面的方法都是抽象方法,所以在定義接口的時候,能夠直接不加那些修飾,系統會默認的添上去。接口裏面的字段都是公有常量,即public static final修飾的字段。
五、集合的實現類與區別?
答: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
六、線程有幾種狀態,分別是哪些?(調用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進行調度,執行線程的主要任務。
七、線程的實現方式
答:線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口
八、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不須要
九、線程中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則會執行完畢,致使結果不可預測。
十、Final、finally、finanlize()的區別
答:final?用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不
可繼承。
finally是異常處理語句結構的一部分,表示老是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。
十一、經常使用設計模式及應用場景,用兩種方式實現單例模式,要求線程安全?
答:  經常使用設計模式: 
    單例模式: 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;
}
}
十二、經常使用排序算法,時間複雜度,實現思路
答: 冒泡排序 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趟比較,直到全部記錄排序完成爲止。
1三、android系統架構?
答:1)應用程序層      java語言    應用程序開發
2)應用程序框架層  java語言    OS定製  framework層開發
3)系統運行庫層    C C++ 實現   so庫
4)Linux內核層
1四、Activity生命週期?保存activity的一些信息在哪一個生命週期方法中?
答:共有七個周期函數: 
void onCreate(Bundle savedInstanceState) 第一次建立時調用
void onStart()   被用戶可見時調用
void onRestart()  當Activity處於stop狀態又被從新啓動時調用
void onResume() 當得到焦點便可與用戶交互時調用
void onPause()  當失去焦點時調用
void onStop()   當不可見時調用
void onDestroy()  當銷燬時調用
1五、Activity的 onSaveInstanceState() 和 onRestoreInstanceState()
答: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並非生命週期方法,它們不一樣於 onCreate()、onPause()等生命週期方法,它們並不必定會被觸發。當應用遇到意外狀況(如:內存不足、用戶直接按Home鍵)由系統銷燬 一個Activity時,onSaveInstanceState() 會被調用。可是當用戶主動去銷燬一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。由於在這種情 況下,用戶的行爲決定了不須要保存Activity的狀態。一般onSaveInstanceState()只適合用於保存一些臨時性的狀態,而 onPause()適合用於數據的持久化保存。
另外,當屏幕的方向發生了改變, Activity會被摧毀而且被從新建立,若是你想在Activity被摧毀前緩存一些數據,而且在Activity被從新建立後恢復緩存的數據。能夠重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
1六、Android的四大組件是什麼?它們的做用是什麼?
答:Android有四大組件:Activity、Service、Broadcast Receiver、Content Provider。 
Activity :應用程序中,一個Activity一般就是一個單獨的屏幕,它上面能夠顯示一些控件也能夠監聽並處理用戶的事件作出響應。Activity之間經過Intent進行通訊。
Service 服務:一個Service 是一段長生命週期的,沒有用戶界面的程序,能夠用來開發如監控類程序。
BroadcastReceive廣播接收器:你的應用可使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並作出響應。廣播接收器沒有用戶界面。然而,它們能夠啓動一個activity或serice 來響應它們收到的信息。
Content Provider內容提供者 :主要用於多個應用間數據共享。這些數據能夠存儲在文件系統中或SQLite數據庫。
1七、廣播如何調用,有什麼方式,各自的區別?
答:程序中發送廣播經過sendBroadcastReceiver()實現
接收廣播經過定義一個類繼承BroadcastReceiver並重寫onReceive()方法實現
註冊廣播有兩種方式:
第一種靜態方式:在清單文件中經過標籤聲明
第二種代碼動態方式:
IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
1)第一種不是常駐型廣播,也就是說廣播跟隨activity的生命週期。注意: 在activity結束前,移除廣播接收器。
2)第二種是常駐型,也就是說當應用程序關閉後,若是有信息廣播來,程序也會被系統調用自動運行。
1八、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"); 
1九、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
2一、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域。
2二、listview優化策略?
答:1)、對convetView進行判空,是當convertView不爲空的時候直接從新使用convertView
從而減小了不少沒必要要的View的建立 
2)定義一個ViewHolder,將convetView的tag設置爲ViewHolder,不爲空時從新使用便可
3)、當ListView加載數據量較大時能夠採用分頁加載和圖片異步加載
2三、ListView分頁加載實現思路?
實現OnScrollListener 接口重寫onScrollStateChanged 和onScroll方法,使用onscroll方法實現」滑動「後處理檢查是否還有新的記錄,若是有,調用 addFooterView,添加記錄到adapter, adapter調用 notifyDataSetChanged 更新數據;若是沒有記錄了,把自定義的mFooterView去掉。使用onScrollStateChanged能夠檢測是否滾到最後一行且中止滾動而後執行加載   
2四、ListView圖片異步加載實現思路?
1.先從內存緩存中獲取圖片顯示(內存緩衝) 
2.獲取不到的話從SD卡里獲取(SD卡緩衝,,從SD卡獲取圖片是放在子線程裏執行的,不然快速滑屏的話會不夠流暢) 
3.都獲取不到的話從網絡下載圖片並保存到SD卡同時加入內存並顯示(視狀況看是否要顯示)
2五、Intent的原理,做用,能夠傳遞哪些類型的參數?
答:intent是鏈接Activity, Service, BroadcastReceiver, ContentProvider四大組件的信使,,能夠傳遞八種基本數據類型以及string, Bundle類型,以及實現了Serializable或者Parcelable的類型。
Intent能夠劃分紅顯式意圖和隱式意圖。 
顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent爲顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪一個組件。 
隱式意圖:沒有明確指定組件名的Intent爲隱式意圖。 Android系統會根據隱式意圖中設置的動做(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。
2六、如何實現屏幕分辨率的自適應?
答: 最好能夠經過權重(layout_weight)的方式來分配每一個組件的大小,也能夠經過具體的像素(dip)來肯定大小。
儘可能使用Relativelayout  。
已知應用支持平臺設備的分辨率,能夠提供多個layout_320*480  ...
drawable-hdpi,drawable-mdpi,drawable-ldpi分別表明分辨率爲480*800,360*480,240*360, 放置圖片大小相差1.5倍
最後還須要在AndroidManifest.xml裏添加下面一段,沒有這一段自適應就不能實現:
android:largeScreens="true"
android:normalScreens="true"
  android:anyDensity = "true"/>
在標籤和 標籤之間添加上面那段代碼。便可。
備註:三者的解析度不同,就像你把電腦的分辨率調低,圖片會變大同樣,反之分辨率高,圖片縮小
還能夠經過.9.png實現圖片的自適應
2七、簡述Android中的IPC機制
IPC(Inter-Process Communication,進程間通訊),aidl是 Android Interface definition language的縮寫,它是一種android內部進程通訊接口的描述語言,經過它咱們能夠定義進程間的通訊接口.編譯器能夠經過擴展名爲aidl的文件生成一段代碼,經過預先定義的接口達到兩個進程內部通訊進程的目的.
BroadcastReceiver也能夠實現進程間通訊
ContentProvider 提供進程間數據共享
2八、Android程序入口如何判斷?
action節點中的android.intent.action.MAIN代表它所在的Activity是整個應用程序的入口點
2九、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.最後關閉過時鏈接
3一、移動互聯數據交互格式有哪些及其區別?(Json與xml的區別?)
移動互聯數據交互格式有XML和JSON
1.JSON和XML的數據可讀性基本相同
2.JSON和XML一樣擁有豐富的解析手段
3.JSON相對於XML來說,數據的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對數據的描述性比XML較差
6.JSON的速度要遠遠快於XML
3二、XML解析有哪幾種?各自優缺點,官方推薦使用哪一種?
基本的解析方式有三種: DOM,SAX,Pull
1.dom解析解析器讀入整個文檔,而後構建一個駐留內存的樹結構,而後代碼就可使用 DOM 接口來操做這個樹結構的優勢是對文檔增刪改查比較方便,缺點佔用內存比較大。
2.sax解析基於事件驅動型,優勢佔用內存少,解析速度快,缺點是隻適合作文檔的讀取,不適合作文檔的增刪改查。
3.pull解析一樣基於事件驅動型,android 官方API提供,可隨時終止
3三、百度地圖核心類,及實現的功能?
BMapManager:地圖引擎管理類,負責初始化,開啓地圖API,終止百度地圖API等工做
MKSearch:搜索服務.用於位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索
MKSearchListener搜索結果通知接口。該接口返回poi搜索,公交搜索,駕乘路線,步行路線結果
MapView:顯示地圖的View
MyLocationOverlay:一個負責顯示用戶當前位置的Overlay。
Overlay:Overlay是一個基類,它表示能夠顯示在地圖上方的覆蓋物。
3四、GC內存泄露在什麼狀況下回出現?怎麼解決?
(一) 查詢數據庫沒有關閉遊標
(二) 構造Adapter時,沒有使用緩存的 convertView
(三) Bitmap對象不在使用時調用recycle()釋放內存
(四) 不用的對象沒有及時釋放對象的引用
3五、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成員變量引用資源耗費過多的實例。
3六、加載大圖片的時候如何防止內存溢出
答: 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()  //提醒系統及時回收
   } 
3七、Android緩存機制
答: 客戶端緩存機制是android應用開發中很是重要的一項工做,使用緩存機制不只僅能夠爲用戶節省3G流量,同時在用戶體驗方面也是很是好的選擇,好比有 些新聞客戶端支持離線模式,也是經過緩存機制實現的.緩存機制分爲兩部分,一部分是文字緩存,另外一部分是多媒體文件緩存.
文字緩存有兩種實現:
1)能夠將與服務器交互獲得的json數據或者xml數據存入sd卡中,並在數據庫添加該數據的記錄.添加數據庫記錄時,提供兩個關鍵字段,一個是請求的URL,另外一個則是本地保存後的文件地址,每次加載數據以前都會根據URL在數據庫中檢索
2)將JSON數據解析後裝入List對象中,而後遍歷List,將數據通通寫入相應的數據庫表結構中,之後每次向服務器發起請求以前能夠先在數據庫中檢索,若是有直接返回.
多媒體文件緩存:主要指圖片緩存
圖片的緩存能夠根據當前日期,時間爲名字緩存到SD卡中的指定圖片緩存目錄,同時數據庫中作相應記錄,記錄辦法能夠採用兩個關鍵字段控制,一個字段是該圖 片的URL地址,另外一個字段是該圖片的本機地址.取圖片時根據URL在數據中檢索,若是沒有則鏈接服務器下載,下載以後再服務器中做出相應記錄
緩存文件刪除策略:
1. 每個模塊在每次客戶端自動或者用戶手動更新的時候刪除相應模塊的緩存文件,並從新下載新的緩存文件.
2. 在設置界面中提供刪除緩存的功能,點擊後刪除本機全部緩存.
3八、如何實現消息推送,有哪些方式,各自優缺點,最常使用哪一種?
答:實現消息推送的方式有五種,分別是輪詢,SMS,C2DM,MQTT,XMPP最常使用的是XMPP, 咱們作項目時採用的是XMPP協議
1.XMPP協議,它是一種基於XML的傳遞協議,具備很強的靈活性和可擴展性。它的特色是將複雜性從客戶端轉移到了服務器端。GTalk、QQ、IM等都用這個協議。
2.輪詢:客戶端定時去服務端取或者保持一個長Socket,從本質講這個不叫推送,    而是去服務端拽數據。可是實現簡單,主要缺點:耗電,浪費用戶流量等
3.Google的C2DM,具體不細說,缺點,服務器在國外,不是很穩定。
4.經過短信方式, 可是很難找到免費短信平臺
5. MQTT協議, IBM提供的一種推送服務,不太靈活
3九、MVC在Android中的應用
答: Android中界面部分也採用了當前比較流行的MVC框架,在Android中: 
  1) 視圖層(View):通常採用XML文件進行界面的描述,使用的時候能夠很是方便的引入。也可使用JavaScript+HTML等的方式做爲View層,經過WebView組件加載,同時能夠實現Java和JavaScript之間的通訊。     
  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()方法,實現本身繪製組件,如翻頁效果組件
4一、版本更新的實現思路
答:在服務器相應URL上有版本文件, 客戶端同時存儲該應用當前版本號  (SharedPreferences/Sqlite), 每次打開應用,去檢測服務器版本號與本地版本號是否一致,若是不一 致,則自定義對話框提示是否下載更新
4二、播放視頻有哪些實現方式?
答: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來實現,這種方式很靈活,能夠自定義視頻播放的大小和位置。
4三、NDK開發流程?(JNI運行原理)
答: NDK應用的開發流程(在應用中定義本地接口(native), 編譯成.h頭文件,交由C程序員實現,將.c實現經過NDK編譯成.so動態連接庫,導入項目中libs/armeabi,代碼中調用該本地接口)
應用場景: 音頻,視頻解碼,拍攝車牌號,識別車牌號
4四、如何實現一鍵退出?
答:定義一個類繼承Application,定義一個集合存放全部的activity, 
定義一個添加的方法,再寫一個退出的方法,使用for循環所有調用finish方法,然
後在每一個Activity的onCreate方法中調用自定義類裏的添加方法,而後在須要使用一
鍵退出的地方調用類中的退出方法便可。
4五、AndroidManifest.xml清單文件標籤中屬性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語言環境發生改變時
4六、如何將一個Activity設置成窗口的樣式
答:在清單文件AndroidManifest.xml中相應的標籤內設置屬性android:theme=」@android:style/Theme.Dialog」
4七、談談UI中, Padding和Margin有什麼區別,gravity與layout_gravity的區別
答:Padding 用來指定組件內的內容距離組件邊界的距離;
    Margin用來指定控件與控件之間的距離
Gravity用來指定組件內的內容相對於組件自己的位置
Layout_gravity用來指定組件相對於其父組件的位置
4八、哪一個組件能夠實現手風琴效果,用來實現設置界面的類,實現抽屜效果, 懸浮窗口?
答:實現手風琴效果(ExpandableListView)
設置界面的類(preferenceActivity)保存到sharedpreference中
抽屜效果(slidingDrawer)組件
    懸浮窗口: PopWindow,能夠實現相似Dialog和菜單的效果
4九、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存儲用戶名,密碼,當存儲不爲空時實現自動登陸功能java

相關文章
相關標籤/搜索