【客戶端學習】Kotlin Android 學習筆記
Android 應用的基本元件
1. Activity 和 View
Activity 是 Android 應用中負責與使用者互動的元件
View 元件是所有 UI 控制元件、容器控制元件的基類
2. Service
Service 通常位於後臺執行,它一般不需要與使用者互動,因此 Service 元件沒有圖形使用者介面
3. BroadcastReceiver
類似於事件程式設計中的監聽器,監聽 Android 應用中的其他元件,相當於一個全域性的事件監聽器
4. ContentProvider
用於 Android 應用間進行實時的資料交換,通常結合 ContentResolver 來使用
5. Intent 和 IntentFilter
實現不同元件之間通訊,可以啟動 Activity 和 Service,也可以觸發 BroadcastReceiver
檢視元件與容器元件
Android 應用的絕大部分 UI 元件都放在 android.widget 和 android.view 包及它們的子包中,所有 UI 元件都繼承了 View 類
View 類重要的子類 ViewGroup 通常是作為其他元件的容器使用
佈局管理器
**1. 線性佈局 **
可以控制橫向排列或縱向排列,不會換行顯示
**2. 表格佈局 **
3. 幀佈局
Android 的 View 和 UI 元件不是執行緒安全的,所以 Android 不允許開發者啟動執行緒訪問使用者介面的 UI 元件
如果直接使用物件表示式(相當於 Java 的匿名內部類)定義 Handler 類的例項,如果該 Handler 直接使用主執行緒的 Looper 或 MessageQueue,就可能導致記憶體洩漏。因此,為 Handler 派生一個子類,並讓該子類例項持有它所在 Activity 的弱引用(WeakReference)可以更好地避免記憶體洩漏
4. 相對佈局
5. 網格佈局
6. 絕對佈局 ( deprecated )
在 Android 中一般支援如下常用的佈局單位:
- px: 每個 px 對應螢幕上一個點
- dp: 基於螢幕密度的抽象單位。在每英寸 160 點的顯示器上,1dp = 1px。但隨著螢幕密度的改變,dp 與 px 的換算會發生改變,主要用於控制元件的固定尺寸
- sp: 主要處理字型的大小,可以根據使用者字型大小首選項進行縮放
- in: 標準長度單位
- mm: 標準長度單位
- pt: 標準長度單位,1/72 英寸
7. Android 8 的約束佈局
每個元件都可以在上、下、左、右四個
Activity 狀態
1. 執行狀態:Activity 處於棧頂
2. 暫停狀態:Activity 不再處於棧頂,但依然可見(不是每個 Activity 都會佔滿整個螢幕,比如對話方塊形式的 Activity 只會佔用螢幕中間的部分割槽域)
3. 停止狀態:不處於棧頂,完全不可見
4. 銷燬狀態:從返回棧中移除
Activity 生存期
onCreate()
:第一次被建立,應該在此完成初始化操作,如載入佈局、繫結事件
onStart()
:由不可見變為可見
onResume()
:準備好和使用者進行互動。此時它一定位於棧頂,並且處於執行狀態
onPause()
:準備去啟動或者恢復另一個 Activity,一般用來把一些消耗 CPU 的資源釋放掉,以及儲存一些關鍵資料。這個方法的執行速度一定要快
onStop()
:在 Activity 完全不可見時呼叫。和onPause()
的主要區別在於,如果啟動的新 Activity 是一個對話方塊式的 Activity,那麼onPause()
方法會執行,而onStop()
方法不會執行
onDestroy()
:在 Activity 被銷燬之前呼叫,之後 Activity 的狀態變為銷燬狀態
onRestart()
:在 Activity 由停止狀態變為執行狀態之前呼叫
可以將 Activity 分為以下 3 種生存期:
完整生存期:onCreate()
初始化 --> onDestroy()
釋放記憶體
可見生存期:onStart()
--> onStop()
前臺生存期:onResume()
--> onPause()
Activity 被回收了怎麼辦
使用onSaveInstanceState()
方法儲存臨時資料,在onCreate()
方法中取出資料
ListView
android.R.layout.simple_list_item_1
是一個 Android 內建的佈局檔案,裡面只有一個 TextView,可用於簡單地顯示一段文字LayoutInflator
的inflate()
方法接受 3 個引數,第三個引數指定成false
,表示只讓我們在父佈局中宣告的layout
屬性生效,但不會為這個 View 新增父佈局。因為一旦 View 有了父佈局之後,它就不能再新增到 ListView 中了- kotlin-android-extensions 外掛在 ListView 的介面卡中是無法工作的,它的主要應用場景是在 Activity 以及 Fragment 當中
RecyclerView
onCreateViewHolder()
:用於建立 ViewHolder 例項(載入 item 佈局)onBindViewHolder()
:對 RecyclerView 子項的資料進行賦值getItemCount()
:返回資料來源長度
Kotlin 相關語法
internal:用於限制跨 module 方法呼叫的關鍵字
if語句: Kotlin 中的 if 語句是可以有返回值的,返回值就是 if 語句中每個條件最後一行程式碼的返回值
建立區間:..
用於建立閉區間,until
用於建立左閉右開的區間
如果一個 Java 方法的引數列表中不存在一個以上 Java 單抽象方法介面引數,我們還可以將介面名進行省略,例子如下:
省略前
Thread(Runnable {
println("Thread is running")
}).start()
省略後
Thread({
println("Thread is running")
}).start()
lateinit:延遲初始化,可結合!::adapter.isInitialized
來判斷變數是否已經初始化
sealed class:密封類,使用後 Kotlin 編譯器會自動檢查該密封類有哪些子類,並強制要求將每一個子類所對應的條件全部處理