【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有兩種方式,分別爲顯式意圖,隱式意圖
第一種,顯示意圖的實現。
Intent intent = new Intent(this,OtherActivity.class);  
startActivity(intent);  
顯式意圖還有另外一種形式。
Intent intent = new Intent();  
ComponentName component = new ComponentName(this, OtherActivity.class);  
intent.setComponent(component);  
startActivity(intent);  
其實這兩種形式其實是一樣的,我們看一下Intent構造函數的代碼

public Intent(Context packageContext, Class<?> cls) {  
        mComponent = new ComponentName(packageContext, cls);  
}  

這樣我們就一目瞭然了,其實我們經常使用的Intent的構造方法是第二種方式的簡化版
第二種,是隱式意圖的實現。
首先我們看一下隱式意圖的調用方式
Intent intent = new Intent();
intent.setAction("other");
startActivity(intent);
隱式意圖是通過setAction來進行區分到底跳轉到哪一個界面,那麼我們肯定要在需要跳轉的頁面設置一標誌,我們需要在AndroidManifest.xml中對這個進行設置
<activity android:name="com.example.lifecicledemo.OtherActivity" >
     <intent-filter>
         <action android:name="other" />

         <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
</activity>

這樣當我們使用setAction的時候,就可以知道我們到底是想跳轉到哪一個頁面了。

3.Android中獲取圖片有哪幾種方式

方式一
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
		img.setImageDrawable(drawable);
方式二
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.ic_launcher);
img.setImageBitmap(bitmap);

方式三

AssetManager assetManager = getResources().getAssets();
try {
	InputStream is = assetManager.open("ic_launcher.png");
	Bitmap bitmap = BitmapFactory.decodeStream(is);
	img.setImageBitmap(bitmap);
} catch (IOException e) {
	e.printStackTrace();
}

方式四

AssetManager assetManager = getResources().getAssets();
try {
	InputStream is = assetManager.open("ic_launcher.png");
	Drawable drawable = Drawable.createFromStream(is, null);
	img.setImageDrawable(drawable);
} catch (IOException e) {
	e.printStackTrace();
}

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.同步和異步有何異同,在什麼情況下分別使用他們?

如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了, 那麼這些數據就是共享數據,必須進行同步存取。 當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程, 在很多情況下采用異步途徑往往更有效率。



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