Android開發:從新認識我所知道的Android(一)

1.四大組件:

簡單介紹四大組件的基礎知識(是個Android開發就能倒背如流),之后會根據自己的知識量和學習計劃單獨詳細的分別寫一篇。

Activity:

activity的知識點很多,作為MVC中的C,是Android程序的根本組件。一個activity可以認為是一個窗口,作為展示視圖的基礎。Android應用的多個窗口切換既是activity之間跳轉,通信的表現。每個存在跳轉關系的activity都需要在manifest文件聲明,同時可以給activity添加其他屬性或修改樣式。

生命周期:onCreate,(onReStart)onStart,onResume,onPause,onStop,onDestroy。在onCreate時開始執行需要的設置,例如定義布局文件。在onDestroy時需要釋放所有資源。而另一對onStart和onStop之間是activity的可見生命周期,在activity被切入后臺時調用onStop方法則不可見,從后臺再次切換到前臺調用onReStart方法后再次調用onStart方法變為可見。onStart方法后如果activity可以和用戶發生交互就會調用onResume,這時可以處理一些數據更新操作。例如activity觸發一個透明或者dialog樣式的activity覆蓋以后,原activity會調用onPause暫停。當覆蓋的activity結束返回時就會調用onResume。


service:

Service(服務)是一個一種可以在后臺執行長時間運行操作而沒有用戶界面的應用組件。可以認為是一個不可見的窗口,需要通過其他組件來啟動。跟activity類似,也需要在Manifest文件中注冊才可以被啟動。

啟動方式:分為startService和bindService兩種,通過startService方法啟動的service會一直在后臺運行,直到調用stopService方法后才會停止。而通過bindService方法與某個組件(例如activity)綁定后啟動的service則需要在組件中調用unBindService才能關閉。

生命周期:由于存在兩種啟動方式,因此存在兩種生命周期。

這是Google對于service生命周期的示意圖



BroadcastReceiver:

廣播接收器,在Android中是一個全局的監聽器。可以在同應用/不同應用間使用,可以實現多進程通信,也可以實現activity和service通信。

注冊:提到四大組件中的BroadcastReceiver肯定要提到兩種注冊方式,靜態注冊和動態注冊。

同activity和service一樣,在Manifest文件中注冊廣播即為靜態注冊。靜態注冊可以使廣播常駐,即使其他組件都被關閉也能繼續存在,通常用來接收后臺服務消息。

在代碼中調用registerReceiver方法即為動態注冊,受到組件的生命周期影響。不同于靜態注冊,動態注冊的廣播需要手動銷毀,而在activity生命周期的說明中可知onPause方法在activity銷毀前肯定會調用,因此通常在onResume中注冊,在onPause中銷毀廣播。這類廣播接收器通常用來處理應用內消息的接收,比較靈活。


ContentProvider:

存儲和獲取數據提供統一的接口,可以在不同的應用程序之間共享數據。實話實說這是大部分Android開發者最少接觸的組件,包括我自己。因此在這篇文章中我打算依樣畫葫蘆的講述一遍基礎知識,在之后的文章中再著重學習并記錄。

ContentProvider是Android提供給上層的一個組件,主要用于實現數據訪問的統一管理和數據共享。這里的數據管理是通過定義統一的訪問接口來完成,如增刪改查。同時,它采用了類似Internet的URL機制,將數據以URI的形式來標識,這樣其他App就可以采用一套標準的URI規范來訪問同一處數據,而不用關心具體的實現細節。我們知道在Android系統中可能會涉及到一個App的數據被其他App使用的情況,比如通訊錄,日歷,短信等,這時就需要一套能實現數據共享的機制,這里的ContentProvider就可以提供該功能,其底層使用了binder來完成App進程之間的通信,同時使用匿名共享內存來作為共享數據的載體。當然為了保證數據訪問的安全性,ContentProvider還對每處的數據URI增加了權限管理機制,以控制該數據的訪問者及訪問方式。



2.五大布局:

FrameLayout:

FrameLayout是五大布局中最簡單的一個布局,整個界面被當成一塊空白區域,在其中的子布局都會被放在左上角,后面的元素會覆蓋在前面的元素之上并遮擋。一般用于開發簡單布局,在相同層級的布局中FrameLayout的效率是最高的。


LinearLayout:

線性布局,可以說是使用最多的布局。LinearLayout按照垂直或者水平的順序依次排列子元素,每一個子元素都位于前一個元素之后。如果是垂直排列,那么將是一個N行單列的結構,每一行只會有一個元素,而不論這個元素的寬度為多少;如果是水平排列,那么將是一個單行N列的結構。如果搭建兩行兩列的結構,通常的方式是先垂直排列兩個元素,每一個元素里再包含一個LinearLayout進行水平排列。

一般來說同層級的情況下LinearLayout效率低于FrameLayout而高于RelaviteLayout。


RelativeLayout:

相對布局,與FrameLayout類似卻又不同,RelativeLayout中各個子元素之間可以根據指定的位置進行排列,更容易實現一些相對復雜的界面。在我們創建新的項目時第一個acitivity_main.xml文件中,Google默認設置了RelativeLayout布局,因為Google希望開發者更合理的布局,減少無用層級。

在同層級的情況下RelativeLayout的效率是大于LinearLayout和FrameLayout的。當然這里的效率比較只是講一個第一印象,后續會通過源碼和實際測試給出誠意十足的理由。


AbsoluteLayout:

絕對布局,在此布局中的子元素的android:layout_x和android:layout_y屬性將生效,用于描述該子元素的坐標位置。屏幕左上角為坐標原點(0,0),第一個0代表橫坐標,向右移動此值增大,第二個0代表縱坐標,向下移動,此值增大。在此布局中的子元素可以相互重疊。

由于安卓廠家太多,各種屏幕比例層出不窮導致這個布局基本被棄用了,畢竟現在適配問題很是重要。


TableLayout:

表格布局,適用于N行N列的布局格式。一個TableLayout由許多TableRow組成,一個TableRow就代表TableLayout中的一行。TableRow是LinearLayout的子類,它的android:orientation屬性值恒為horizontal,并且它的android:layout_width和android:layout_height屬性值恒為MATCH_PARENT和WRAP_CONTENT。所以它的子元素都是橫向排列,并且寬高一致的。這樣的設計使得每個TableRow里的子元素都相當于表格中的單元格一樣。在TableRow中,單元格可以為空,但是不能跨列。

也是一個可用可不用的布局,只在當年寫計算器demo的時候使用過。現在的應用界面設計更靈活多變,很少再見到規規矩矩的表格布局了。


? 文章寫的不多,不過希望從這幾篇簡單的基礎知識開始讓自己的寫作能力有所提升。四大組件和五大布局已經是早幾年面試時才會去硬背的知識點了,現在來寫發現這些知識早已如吃飯喝水般順手寫來。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容