安卓開發第一步:安卓面試題

十步一坑發表於2020-11-14

安卓基礎

四大元件

Android 開發的四大元件分別是:活動(activity),用於表現功能;服務(service),後臺執行服務,不提供介面呈現;廣播接收者(Broadcast Receive),用於接收廣播;內容提供者(Content Provider)

activity
1、一個Activity通常就是一個單獨的螢幕(視窗)。
2、Activity之間通過Intent進行通訊。
3、android應用中每一個Activity都必須要在AndroidManifest.xml配置檔案中宣告,否則系統將不識別也不執行該Activity。

Activity 生命週期

onCreate--------建立活動
onStart-----------開始
onResume------初始化,經過這一步之後就是我們能看到的影像層了
onPause---------暫停,依舊在使用者可見狀態,但是介面焦點已經失去,此Activity無法與使用者進行互動
onStop-----------使用者看不到當前介面,也無法與使用者進行互動 完全被覆蓋
onDestroy-------activity被銷燬,kill
onRestart

Activity 啟動模式
standard模式
standard是活動預設的啟動模式,在不進行顯式指定的情況下,所有活動都會自動使用這種啟動模式。因此,到目前為止我們寫過的所有活動都是使用的standard模式。Android 是使用返回棧來管理活動的,在standard模式(即預設情況)下,每當啟動一個新的活動,它就會在返回棧中人棧,並處於棧頂的位置。對於使用standard模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會建立該活動的一個新的例項。
singleTop模式
可能在有些情況下,你會覺得standard模式不太合理。活動明明已經在棧頂了,為什麼再次啟動的時候還要建立一個新的活動例項呢?彆著急,這只是系統預設的一種啟動模式而已,你完全可以根據自己的需要進行修改,比如說使用singleTop 模式。當活動的啟動模式指定為singleTop,在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用它,不會再建立新的活動例項。
singleTask模式
使用singleTop模式可以很好地解決重複建立棧頂活動的問題,但是正如你在上一節所看到的,如果該活動並沒有處於棧頂的位置,還是可能會建立多個活動例項的。那麼有沒有什麼辦法可以讓某個活動在整個應用程式的上下文中只存在-一個例項呢?這就要藉助singleTask模式來實:現了。當活動的啟動模式指定為singleTask, 每次啟動該活動時系統首先會在返回棧中檢查是否存在該活動的例項,如果發現已經存在則直接使用該例項,並把在這個活動之上的所有活動統統出棧,如果沒有發現就會建立- -個新的活動例項。
singlelnstance模式
singleInstance模式應該算是4種啟動模式中最特殊也最複雜的-個了,你也需要多花點功夫來理解這個模式。不同於以上3種啟動模式,指定為singleInstance模式的活動會啟用-個新的返回棧來管理這個活動(其實如果single Task模式指定了不同的taskffinity,也會啟動一個新的返回棧)。那麼這樣做有什麼意義呢?想象以下場景,假設我們的程式中有一個活動是允許其他程式呼叫的,如果我們想實現其他程式和我們的程式可以共享這個活動的例項,應該如何實現呢?使用前面3種啟動模式肯定是做不到的,因為每個應用程式都會有自己的返回棧,同一個活動在不同的返回棧中人棧時必然是建立了新的例項。而使用singleInstance模式就可以解決這個問題,在這種模式下會有一個單獨的返回棧來管理這個活動,不管是哪個應用程式來訪問這個活動,都共用的同一個返回棧,也就解決了共享活動例項的問題。

傳遞資料-----顯示intent
在這裡插入圖片描述
傳遞資料-----隱式intent
在這裡插入圖片描述
在這裡插入圖片描述
訊息處理機制
Hamendler物件建立一個looper物件,looper物件建立一個訊息佇列,訊息佇列無線迴圈接受執行緒來的訊息,經過dispatchmessage方法,將訊息返回發放給對應的處理物件handler,再呼叫對應的handlermessage方法
在這裡插入圖片描述
Activity-Window-View三者的關係
Activity:是安卓四大元件之一,負責介面展示、使用者互動與業務邏輯處理;
Window:是負責介面展示以及互動的職能部門,就相當於Activity的下屬,Activity的生命週期方法負責業務的處理;
View:是放在Window容器的元素,Window是View的載體,View是Window的具體展示。
Activity通過Window來實現檢視元素的展示,window可以理解為一個容器,盛放著一個個的view,用來執行具體的展示工作。

具體的呈現原理在接下來的篇章中更新
services
Service(服務)是一個一種可以在後臺執行長時間執行操作而沒有使用者介面的應用元件。服務可由其他應用元件啟動(如Activity),服務一旦被啟動將在後臺一直執行,即使啟動服務的元件(Activity)已銷燬也不受影響。 此外,元件可以繫結到服務,以與之進行互動,甚至是執行程式間通訊 (IPC)。 例如,服務可以處理網路事務、播放音樂,執行檔案 I/O 或與內容提供程式互動,而所有這一切均可在後臺進行,Service基本上分為兩種形式:
啟動狀態
  當應用元件(如 Activity)通過呼叫 startService() 啟動服務時,服務即處於“啟動”狀態。一旦啟動,服務即可在後臺無限期執行,即使啟動服務的元件已被銷燬也不受影響,除非手動呼叫才能停止服務, 已啟動的服務通常是執行單一操作,而且不會將結果返回給呼叫方。

繫結狀態
  當應用元件通過呼叫 bindService() 繫結到服務時,服務即處於“繫結”狀態。繫結服務提供了一個客戶端-伺服器介面,允許元件與服務進行互動、傳送請求、獲取結果,甚至是利用程式間通訊 (IPC) 跨程式執行這些操作。 僅當與另一個應用元件繫結時,繫結服務才會執行。 多個元件可以同時繫結到該服務,但全部取消繫結後,該服務即會被銷燬。
Service啟動服務
  首先要建立服務,必須建立 Service 的子類(或使用它的一個現有子類如IntentService)。SimpleService繼承了Service類,並重寫了onBind方法,該方法是必須重寫的,但是由於此時是啟動狀態的服務,則該方法無須實現,返回null即可,只有在繫結狀態的情況下才需要實現該方法並返回一個IBinder的實現類(這個後面會詳細說),接著重寫了onCreate、onStartCommand、onDestroy三個主要的生命週期方法

啟動服務使用startService(Intent intent)方法,僅需要傳遞一個Intent物件即可,在Intent物件中指定需要啟動的服務。而使用startService()方法啟動的服務,在服務的外部,必須使用stopService()方法停止,在服務的內部可以呼叫stopSelf()方法停止當前服務。如果使用startService()或者stopSelf()方法請求停止服務,系統會就會盡快銷燬這個服務。值得注意的是對於啟動服務,一旦啟動將與訪問它的元件無任何關聯,即使訪問它的元件被銷燬了,這個服務也一直執行下去,直到手動呼叫停止服務才被銷燬,至於onBind方法,只有在繫結服務時才會起作用,在啟動狀態下,無需關注此方法,ok~,我們執行程式並多次呼叫startService方法,最後呼叫stopService方法。

廣播broadcast
broadcast是一種廣泛運用在應用程式之間傳輸資訊的機制,android中的broadcast很像我們平時的廣播,一個廣播可以有多個收聽者,每個收聽到廣播的人都可以依據廣播做不同的行為,使用了觀察者設計模式,安卓的廣播包括三要素,傳送廣播的broadcast,接收廣播的broadcastReceiver,以及用於傳遞資訊的Intent。

分類:有序廣播、無須廣播
啟動方式:動態註冊、靜態註冊。動態註冊需要在程式碼中註冊,程式啟動才能接收到,靜態註冊註冊在配置檔案中,開機就能接收到。

內容提供者ContentProvider

是Android 的四大元件之一。內容提供者是應用程式之間共享資料的介面。應用程式建立的資料庫,預設情況下是私有的,別的應用程式訪問不到資料,如果想把資料對外提供,就要用到內容提供。ContentProvider遮蔽了資料儲存的細節,內部實現對使用者完全透明, 使用者只需要關心運算元據的uri就可以了,ContentProvider可以實現不同app之間共享。 Sql也有增刪改查的方法,但是sql只能查詢本應用下的資料庫。 而ContentProvider 還可以去增刪改查本地檔案/xml檔案的讀取等。Android 系統將這種機制應用到方方面面,比如:聯絡人(通訊錄應用程式)Provider 專為不同應用程式提供聯絡人資料;簡訊(簡訊應用程式)Provider 專為不同應用程式提供系統簡訊資訊。當應用繼承ContentProvider 類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共享其資料。雖然使用其他方法也可以對外共享資料,但資料訪問方式會因資料儲存的方式而不同,如:採用檔案方式對外共享資料,需要進行檔案操作讀寫資料;採用SharedPreferences 共享資料,需要使用SharedPreferences API 讀寫資料。而使用ContentProvider 共享資料的好處是統一了資料訪問方式。總之,內容提供者管理了對結構化資料最常見的就是資料庫中資料的訪問,操作內容提供者是不同程式之間以資料庫資料形式互動資料的標準方式。

需要了解的還有:
佈局—五種佈局與對應的不同之處
導致ANR的因素有哪些
ANR有哪些型別
自定義控制元件的實現方法

下一期:安卓日誌的解讀

相關文章