1. 程式人生 > 實用技巧 >【客戶端學習】Kotlin Android 學習筆記

【客戶端學習】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,可用於簡單地顯示一段文字
  • LayoutInflatorinflate()方法接受 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 編譯器會自動檢查該密封類有哪些子類,並強制要求將每一個子類所對應的條件全部處理