面試筆試1

1.請解釋下在單線程模型中Message,Handler,Message Queue,Looper之間的關係。
 拿主線程來說,主線程啓動時會調用Looper.prepare()方法,會初始化一個Looper,放入Threadlocal中接着調用Looper.loop()不斷遍歷Message Queue。
 Handler的創建依賴與當前線程中的Looper,如果當前線程沒有Looper則必須調用Looper.prepare()。
 Handler通過調用sendMessage()方法講消息放入MessageQueue中, MessageQueue是一個先進先出的隊列,Looper不斷從MessageQueue中取出消息,把消息交給消息對應的Handler對象進行分發處理。

2.內存溢出和內存泄漏有什麼區別?何時會產生內存泄漏?內存優化有哪些方法?
 內存溢出通俗理解就是軟件(應用)運行需要的內存,超出了它可用的最大內存。
 內存泄漏就是我們對某一內存空間的使用,使用完成後沒有釋放。
 內存優化:Android中容易內存溢出的部分,就是圖片的加載,我們可以使用對圖片的壓縮並且使用LruCache緩存的目的來控制圖片所能夠使用的內存。對比較耗資源的對象及時的關閉,例如Database Conn ,流對象,遊標,各種傳感器,Service等等。

3.AsyncTask使用在哪些場景?它的缺陷是什麼?如何解決?
 AsyncTask 運用的場景就是我們需要進行一些耗時的操作,耗時操作完成後更新主線程,或者在操作過程中對主線程的UI進行更新。
 缺陷:AsyncTask中維護着一個長度爲128的線程池,同時可以執行5個工作線程,還有一個緩衝隊列,當線程池中已有128個線程,緩衝隊列已滿時,此時如果仍然向線程提交任務,將會拋出RejectedExecutionException。
 解決:由一個控制線程來處理AsyncTask的調用判斷線程池是否滿了,如果滿了則線程睡眠否則請求AsyncTask繼續處理。

4.同一個程序,但不同的Activity是否可以放在不同的Task任務棧中?
 可以放在不同的Task中。需要爲不同的activity設置不同的affinity屬性,啓動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標記。

5.assets資源文件夾和res資源文件夾的區別?
 assets:所有資源不會在R.java文件下生成相應的標記,assets文件夾可以自己創建文件夾,必須使用AssetsManager類進行訪問,存放到這裏的資源在運行打包的時候都會直接打入程序安裝包中,
 res:所有資源會在R.java文件下生成標記,這裏的資源會在運行打包操作的時候判斷哪些被使用到了,沒有被使用到的文件資源是不會打包到安裝包中的。資源會編譯成二進制文件進行打包。
 在res文件夾下還可以定義一下目錄: res/anim:這裏存放的是動畫資源。 res/xml:可以在Activity中使用getResource().getXML()讀取這裏的資源文件 res/raw:該目錄下的文件可以直接複製到設備上,不能有子文件夾,編譯軟件時,這裏的數據不需要編譯,直接加入到程序安裝包中,使用方法是getResource().OpenRawResources(ID),其中參數ID的形式是R.raw.XXX.

6.橫豎屏切換時候Activity的生命週期?
 不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
 設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次。
 設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法。4.0之後多配置一個屬性screenSize。

7.AIDL的全稱是什麼?如何工作?
 全稱是:Android Interface Define Language
 AIDL是一種接口描述語言。編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉化成AIDL可識別的參數(可能是多個參數), 然後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成自己需要的對象.AIDL的IPC的機制是基於接口,輕量級的。它使用代理類在客戶端和實現層間傳遞值。
 使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關類. 2. 調用aidl產生的class文件。

8.ANR異常是什麼?如何解決?
 在Android上,如果你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應(ANR:Application Not Responding)對話框。用戶可以選擇“等待”而讓程序繼續運行,也可以選擇“強制關閉”。所以一個流暢的合理的應用程序中不能出現ANR,而讓用戶每次都要處理這個對話框。因此,在程序裏對響應性能的設計很重要,這樣系統不會顯示ANR給用戶。默認情況下,在android中Activity的最長執行時間是5秒,BroadcastReceiver的最長執行時間則是10秒。
 ANR異常也是在程序中自己經常遇到的問題,主要的解決辦法自己最常用的就是不要在主線程中做耗時的操作,而應放在子線程中來實現,比如採用Handler+mesage的方式,或者是有時候需要做一些和網絡相互交互的耗時操作就採用asyntask異步任務的方式(它的底層其實Handler+mesage有所區別的是它是線程池)等,在主線程中更新UI。

9.OOM異常是什麼?如何解決?
 OOM就是內存溢出,即Out Of Memory。也就是說內存佔有量超過了VM所分配的最大。
 使用Bitmap的時候容易出現OOM
解決辦法:
 進行圖片壓縮
 採用LruCache進行內存管理。LruCache實現原理是LinkedHashMap存儲,當內存不夠用的時候,將近期最少使用的數據從緩存中移除,保留使用最頻繁的數據。
 異步加載。

10.做過哪些ListView的內存優化?
 複用convertView
 綁定ViewHolder,減少findViewById()的次數
 Listview的分頁顯示,實現上拉加載和下來刷新。
 網絡圖片的異步加載和三級緩存。

11.如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?
 onSaveInstanceState()方法
 當你的程序中某一個Activity A在運行時,主動或被動地運行另一個新的Activity B,這個時候A會執行onSaveInstanceState()。B完成以後又會來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啓動的是這回onCreate()裏是帶上了參數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。

12、NDK是什麼?
 NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java 應用打成apk包。
 NDK集成了交叉編譯器,並提供了相應的mk文件和隔離cpu、平臺等的差異,開發人員只需簡單的修改mk文件就可以創建出so。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章