Android面試題知識點積累(三)
onNewIntent()呼叫時機
當activity設定啟動模式為singleTop和singleTask,啟動該activity,會呼叫onNewIntent();
ActivityManagerService的功能
1.統一管理應用的程式的Activity。
2.記憶體管理。Android官方聲稱,Activity退出後,其所在的程序並不會被立即殺死,從而在下次啟動該Activity時能夠提高啟動速度。
3.程序管理,ActivityManagerService向外提供了查詢系統正在執行的程序資訊的API。
Android中還了解哪些方便執行緒切換的類?
例如:RunnableAsyncTaskEventBusRxjava
什麼是Mac地址:
MAC地址採用十六進位制數表示,共六個位元組(48位),成為物理位置,它是一個用來確認網上裝置位置的地址。
MAC地址用於在網路中唯一標示一個網絡卡,一臺裝置若有一或多個網絡卡,則每個網絡卡都需要並會有一個唯一的MAC地址。
LruCache 實現原理
宣告的變數
private final LinkedHashMap<K, V> map;//存放資料的集合 private int size;//當前LruCahce的記憶體佔用大小 private int maxSize;//Lrucache的最大容量 private int putCount;//put的次數 private int createCount;//create的次數 private int evictionCount;//回收的次數 private int hitCount;//命中的次數 private int missCount;//丟失的次數
總述:例項化了一個LinkedHashMap物件,LinkedHashMap物件是實現Lru演算法的關鍵,Lru--Least Recently Used 是最近最少使用演算法的簡稱,意思呢就是查詢出最近的時間使用次數最少的那個物件。主要的功能是判斷當前容量時候已經超出最大的容量,如果超出了maxSize的話,就會迴圈移除map中的第一個元素,直到達到跳出迴圈的條件。由上面的分析知道,map中的第一個元素就是最近最少使用的那個元素。
make Project、clean Project、Rebuild Project的區別
Make Project:編譯Project下所有Module,一般是自上次編譯後Project下有更新的檔案,不生成apk。
Clean Project:刪除之前編譯後的編譯檔案,並重新編譯整個Project,比較花費時間,不生成apk。
Rebuild Project:同Clean Project一樣
Build APK:重新編譯生成apk
Android為什麼要加簽名機制
Android系統要求所有的程式通過數字簽名才能安裝。圖示、名字、包名可以被仿冒掉,但是根據簽名能唯一判別apk,簽名相同才會覆蓋安裝。防止被惡意替換掉;和加入開發方身份認證機制。注:平常開發除錯執行會有一個預設debug.key簽名檔案進行簽名打包。
簡要講述動畫的基本原理
其實就是利用插值器和估值器,來計算出各個時刻View的屬性,然後通過改變View的屬性來,實現View的動畫效果。
Java 中內部類為什麼可以訪問外部類
因為內部類建立的時候,需要外部類的物件,在內部類物件建立的時候會把外部類的引用傳遞進去。
string轉換成integer的方式及原理
public static int digit(int codePoint, int radix) { //基數必須再最大和最小基數之間 if (radix < MIN_RADIX || radix > MAX_RADIX) { return -1; } if (codePoint < 128) { // Optimized for ASCII int result = -1; //字元在0-9字元之間 if ('0' <= codePoint && codePoint <= '9') { result = codePoint - '0'; } //字元在a-z之間 else if ('a' <= codePoint && codePoint <= 'z') { result = 10 + (codePoint - 'a'); } //字元在A-Z之間 else if ('A' <= codePoint && codePoint <= 'Z') { result = 10 + (codePoint - 'A'); } return result < radix ? result : -1; } return digitImpl(codePoint, radix); }
Integer.parseInt(String str),用while迴圈獲取string中的每個字元,根據ascll碼進行判斷,如果大於'0'小於'9',就可以轉成數字,減去'0'字元就得到它對應的int值,如果有一個字元不能在0-9字元之間,就會丟擲數字型別轉換異常。
Application的生命週期有哪些?
public class LifeCycleApplication extends Application { @Override public void onCreate() { // 程式建立的時候執行 Log.d(TAG, "onCreate"); super.onCreate(); } @Override public void onTerminate() { // 程式終止的時候執行 Log.d(TAG, "onTerminate"); super.onTerminate(); } @Override public void onLowMemory() { // 低記憶體的時候執行 Log.d(TAG, "onLowMemory"); super.onLowMemory(); } @Override public void onTrimMemory(int level) { // 程式在記憶體清理的時候執行(回收記憶體) // HOME鍵退出應用程式、長按MENU鍵,開啟Recent TASK都會執行 Log.d(TAG, "onTrimMemory"); super.onTrimMemory(level); } }
應用安裝的流程及路徑
-
應用安裝涉及到如下幾個目錄:
system/app ---------------系統自帶的應用程式,獲得adb root許可權才能刪除
data/app---------------使用者程式安裝的目錄。安裝時把apk檔案複製到此目錄
data/data ---------------存放應用程式的資料
data/dalvik-cache--------將apk中的dex檔案安裝到dalvik-cache目錄下(dex檔案是dalvik虛擬機器的可執行檔案,其大小約為原始apk檔案大小的四分之一)
-
安裝過程:
複製APK安裝包到data/app目錄下,解壓並掃描安裝包,把dex檔案(Dalvik位元組碼)儲存到dalvik-cache目錄,並data/data目錄下建立對應的應用資料目錄。
-
解除安裝過程:
刪除安裝過程中在上述三個目錄下建立的檔案及目錄。
RecyclerView怎麼實現item拖拽?
只需要給recyclerView新增一個ItemTouchHelper物件就行
mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback());
mItemTouchHelper.attachToRecyclerView(mRecyclerView);
特殊域變數(volatile)關鍵字
通俗來說就是,執行緒A對一個volatile變數的修改,對於其它執行緒來說是可見的,即執行緒每次獲取volatile變數的值都是最新的。
a.volatile關鍵字為域變數的訪問提供了一種免鎖機制,
b.使用volatile修飾域相當於告訴虛擬機器該域可能會被其他執行緒更新,
c.因此每次使用該域就要重新計算,而不是使用暫存器中的值
d.volatile不會提供任何原子操作,它也不能用來修飾final型別的變數
//需要同步的變數加上volatile
private volatile int account = 100;
十六進位制資料怎麼和十進位制和二進位制之間轉換
System.out.println("十進位制10轉16進製為"+Integer.toHexString(10));
System.out.println("十進位制10轉二進位制為"+Integer.toBinaryString(10));
或者用10進位制轉換進行中轉
子view比父view大時,怎麼讓子view能超出父view?
在父佈局中,加上android:clipChildren="false"這個屬性,不限制子view大小,預設為true。
怎麼加速啟動activity?
1.初始化覺得會耗時的操作,可以開子執行緒去處理
2.儘量減少佈局層次
SharedPreferences的commit和apply的區別?
commit是原子提交到資料庫,所以從提交資料到存在Disk中都是同步過程,中間不可打斷。
apply方法的原子操作是原子提交的記憶體中,而非資料庫,所以在提交到記憶體中時不可打斷,之後再非同步提交資料到資料庫中,因此也不會有相應的返回值。
所有commit提交是同步過程,效率會比apply非同步提交的速度慢,但是apply沒有返回值,永遠無法知道儲存是否失敗。
如何控制某個方法允許併發訪問執行緒的個數
在Java中常使用Semaphore(訊號量)來進行併發程式設計,Semaphore控制的是執行緒併發的數量,例項化一個Semaphore物件,如Semaphoresemaphore = newSemaphore(5,true) ,其建立了物件semaphore,並初始化了5個訊號量,即最多允許5個執行緒併發訪問,在執行的任務中,呼叫semaphore的acquire()方法請求一個訊號量,這時訊號量個數就減1,(一旦沒有可使用的訊號量,再次請求就會阻塞),來執行任務,執行完任務,呼叫semaphore的release()方法釋放一個訊號量此時訊號量的個數就會加1 。就算門衛記錄該停車場的剩餘停車位。
原子性:
原子是世界上最小的物質單位,具有不可分割性,比如a=0,這個操作是不可分割的,那麼我們就會說這個操作是原子操作,再如a++,這個操作實際上是a=a+1,是可以分割的,所以他不是一個原子操作,非原子操作都會存線上程安全的問題,需要使用synchronized同步技術來使其變成一個原子操作,一個操作是原子操作,那麼我麼稱它具有原子性。
位元組流和字元流的區別?
字元流只能處理字元型別(char,純文字可以用字元流,比如漢字,傳輸的時候要查詢編碼表,得到漢字對應的字元),
而位元組流可以處理任何型別(比如圖片,視訊,是以二進位制傳輸的)
字元流(一次可以處理一個緩衝區)一次操作比位元組流(一次一個位元組)效率高。
位元組流在操作的時候本身是不會用到緩衝區(記憶體)的,是與檔案本身直接操作的
而字元流在操作的時候是使用到緩衝區的,需要呼叫flush()強制清空緩衝區才能輸出。