【Android進階】Android面試題目整理與講解
這一篇文章專門整理一下研究過的Android面試題,內容會隨著學習不斷的增加,如果答案有錯誤,希望大家可以指正
1.簡述Activity的生命週期
當Activity開始啟動的時候,首先呼叫onCreate(),onStart(),onResume()方法,此時Activity對使用者來說,是可見的狀態
當Activity從可見狀態變為被Dialog遮擋的狀態的時候,會呼叫onPause()方法,此時的Activity對使用者可見,但是不能相應使用者的點選事件
當Activity從可見狀態變為被其他的Activity完全覆蓋或者是點選Home進入後臺的時候,會依次呼叫onPause(),onStop()方法,如果在這個期間,系統記憶體不足,導致Activity被回收的話,還會呼叫onDestory()方法
當Activity從被Dialog遮擋的狀態恢復的時候,會呼叫onResume()方法,從而恢復可以點選的狀態
當Activity從被其他Activity遮擋或者是進入後臺狀態恢復,而且沒有被系統回收的時候,會依次呼叫onRestart(),onStart(),onResume(),恢復到可以與使用者進行互動的狀態
當Activity從被其他Activity遮擋或者進入後臺,而且被系統回收的時候,相當於重新開啟一個Activity,既呼叫onCreate(),onStart(),onResume()方法,從而可以與使用者進行互動
在onPause()方法執行後,系統會停止動畫等消耗 CPU 的操作,同時我們應該在這裡儲存資料,因為這個時候程式的優先順序降低,有可能被系統收回。在這裡儲存的資料,應該在 onResume 裡讀出來,幫使用者恢復之前的狀態。
在onDestroy()執行後,activity就被真的幹掉,可以用 isFinishing()來判斷它,如果此時有 Progress Dialog顯示,我們應該在onDestroy()裡 cancel 掉,否則執行緒結束的時候,呼叫Dialog 的 cancel 方法會拋異常。
2.Intent啟動Activity有幾種方式,如何實現?
Intent啟動Activity有兩種方式,分別為顯式意圖,隱式意圖
第一種,顯示意圖的實現。
1、Intent intent = new Intent(this,OtherActivity.class); 2、startActivity(intent);
顯式意圖還有另外一種形式。
1、Intent intent = new Intent(); 2、ComponentName component = new ComponentName(this,、OtherActivity.class); 3、intent.setComponent(component); 4、startActivity(intent);
其實這兩種形式其實是一樣的,我們看一下Intent建構函式的程式碼
1、public Intent(Context packageContext, Class<?> cls) { 2、 mComponent = new ComponentName(packageContext, cls); 3、}
這樣我們就一目瞭然了,其實我們經常使用的Intent的構造方法是第二種方式的簡化版
第二種,是隱式意圖的實現。
首先我們看一下隱式意圖的呼叫方式
1、Intent intent = new Intent(); 2、intent.setAction("other"); 3、startActivity(intent);
隱式意圖是通過setAction來進行區分到底跳轉到哪一個介面,那麼我們肯定要在需要跳轉的頁面設定一標誌,我們需要在AndroidManifest.xml中對這個進行設定
1、<activity android:name="com.example.lifecicledemo.OtherActivity" > 2、 <intent-filter> 3、 <action android:name="other" /> 4、 <category android:name="android.intent.category.DEFAULT" /> 5、 </intent-filter>/6、</activity>
這樣當我們使用setAction的時候,就可以知道我們到底是想跳轉到哪一個頁面了。
3.Android中獲取圖片有哪幾種方式
方式一
1、Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher); 2、img.setImageDrawable(drawable);
方式二
1、Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 2、R.drawable.ic_launcher); 3、img.setImageBitmap(bitmap);
方式三
1、AssetManager assetManager = getResources().getAssets(); 2、try { 3、InputStream is = assetManager.open("ic_launcher.png"); 4、Bitmap bitmap = BitmapFactory.decodeStream(is); 5、img.setImageBitmap(bitmap); 6、} catch (IOException e) { 7、e.printStackTrace(); 8、}
方式四
1、AssetManager assetManager = getResources().getAssets(); 2、try { 3、InputStream is = assetManager.open("ic_launcher.png"); 4、Drawable drawable = Drawable.createFromStream(is, null); 5、img.setImageDrawable(drawable); 6、} catch (IOException e) { 7、e.printStackTrace(); 8、}
1. ArrayList,Vector, LinkedList 的儲存效能和特性
ArrayList 和 Vector 都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按 序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector 由於使用了 synchroni zed 方法(執行緒安全),通常效能上較 ArrayList 差,而 LinkedList 使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後 向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。
2.Collection 和 Collections 的區別
Collection 是集合類的上級介面,繼承與他的介面主要有 Set 和 List. Collections 是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
3.HashMap 和 Hashtable 的區別
HashMap 是 Hashtable 的輕量級實現(非執行緒安全的實現),他們都完成了 Map 介面,主要區別在於 HashMap 允許空(null)鍵值(key),由於非執行緒安全,效率上可能高於 Hashtable。 HashMap 允許將 null 作為一個 entry 的 key 或者 value,而 Hashtable 不允許。
HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因為 contains 方法容易讓人引起誤解。 Hashtable 繼承自 Dictionary 類,而 HashMap 是 Java1.2 引進的 Map interface 的一個實現。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多個執行緒訪問 Hashtable 時,不需要自己為它的 方法實現同步,而 HashMap 就必須為之提供外同步。
Hashtable 和 HashMap 採用的 hash/rehash 演算法都大概一樣,所以效能不會有很大的差異。
4.sleep() 和 wait() 有什麼區別
sleep 是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時 後會自動恢復。呼叫 sleep 不會釋放物件鎖。
wait 是 Object 類的方法,對此物件呼叫 wait 方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發 出 notify 方法(或 notifyAll)後本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。
5.Overload 和 Override 的區別
Overloaded 的方法是否可以改變返回值的型別? 方法的重寫 Overriding 和過載 Overloading 是 Java 多型性的不同表現。重寫 Overriding 是父類與子類之間多型性的一種表現,過載 Overloading 是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被"遮蔽"了。如果在一個類 中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloaded 的 方法是可以改變返回值的型別。
6.同步和非同步有何異同,在什麼情況下分別使用他們?
如果資料將線上程間共享。例如正在寫的資料以後可能被另一個執行緒讀到,或者正在讀的資料可能已經被另一個執行緒寫過了, 那麼這些資料就是共享資料,必須進行同步存取。 當應用程式在物件上呼叫了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法的返回時,就應該使用非同步程式設計, 在很多情況下采用非同步途徑往往更有效率。
原文:https://blog.csdn.net/jansin_love/article/details/26340787