變量類型
var
和 val
的核心區別:
關鍵字 | 含義 | 能否重新賦值 | 類似概念(Java) |
| variable(可變變量) | 可以 | 普通變量(無 |
| value(不可變變量) | 不可以 | 被 |
var聲明的變量可以被修改
var age = 20
age = 21 // 合法,允許重新賦值
val 聲明的變量不能修改:
val name = "Kotlin"
name = "Java" // 編譯報錯!不允許重新賦值
val
聲明的變量雖然不能重新賦值,但如果它是對象(如集合、類實例),對象內部的屬性是可以修改的:val list = mutableListOf(1, 2, 3) list.add(4) // 合法,修改的是對象內部數據,不是重新賦值變量 // list = mutableListOf(5,6) // 編譯報錯,不允許重新賦值變量本身
Set?
定義了一個私有不可變接受Int類型的Set對象ACTION_IDS_DEFAULT,setOf(...)是Kotlin 的集合創建函數,用于初始化一個不可變集合,括號中是具體的事件 ID(通常來自枚舉的 id 屬性)。
private val ACTION_IDS_DEFAULT: Set<Int> = setOf(ActionTypeEnum.ACTION_START_CONNECTION.actionId,ActionTypeEnum.ACTION_STOP_SERVICE.actionId,ActionTypeEnum.ACTION_REFRESH_DATA.actionId,ActionTypeEnum.ACTION_CLEAR_CACHE.actionId,ActionTypeEnum.ACTION_UPDATE_SETTINGS.actionId,ActionTypeEnum.ACTION_SAVE_CONFIG.actionId,ActionTypeEnum.ACTION_RESET_DEVICE.actionId,ActionTypeEnum.ACTION_SYNC_STATUS.actionId
)
如何定義一個java的枚舉類型:
public enum EventIdEnum {// 事件類型枚舉值,包含事件ID和事件描述兩個成員變量EVENT_UPDATE_CONNECT_STATUS(1001, "連接狀態更新事件"),EVENT_UPDATE_DEVICE_INFO(1002, "設備信息更新事件"),EVENT_UPDATE_SUPPORT_DESKTOP(1003, "桌面支持狀態更新事件"),EVENT_UPDATE_HISTORY_DEVICE(1004, "歷史設備列表更新事件"),EVENT_UPDATE_APP_LIST(1005, "應用列表更新事件"),EVENT_UPDATE_APP_INFO_CHANGED(1006, "應用信息變更事件"),EVENT_UPDATE_LINK_APP_SHOW_ALL_MENU(1007, "鏈接應用菜單顯示事件"),EVENT_UPDATE_MEDIA_POSITION(1008, "媒體播放位置更新事件"),EVENT_UPDATE_MEDIA_STATUS(1009, "媒體播放狀態更新事件"),EVENT_UPDATE_MEDIA_MODE(1010, "媒體模式更新事件"),EVENT_UPDATE_MEDIA_META_DATA(1011, "媒體元數據更新事件");// 事件ID字段private final int eventId;// 事件描述字段private final String description;// 包含兩個參數的構造函數EventIdEnum(int eventId, String description) {this.eventId = eventId;this.description = description;}// 獲取事件ID的方法public int getEventId() {return eventId;}// 獲取事件描述的方法public String getDescription() {return description;}
}
構成一個java枚舉類型的部分:
成員變量,實現的類型,構造函數,get方法
單例對象:
kt可以使用object關鍵字直接定義一個單例對象,在別的函數中可以直接使用類名來獲得這個對象,不需要定義getInstance函數來獲取這個對象
// 使用 object 關鍵字創建單例
object AppConfig {// 單例中的成員變量var apiBaseUrl: String = "https://api.example.com"var timeout: Int = 30000 // 30秒// 單例中的方法fun init(baseUrl: String, timeout: Int) {this.apiBaseUrl = baseUrlthis.timeout = timeout}fun getFullUrl(endpoint: String): String {return "$apiBaseUrl/$endpoint"}
}
方法的重寫
使用override關鍵字
override fun onReceivedPublishedData(packageName: String?, eventIdentifier: Int, dataBytes: ByteArray?
) {// 重寫的方法實現邏輯// 可以調用父類實現(如果需要)
}
可以看出方法接受一個可以為空的String類型的packageName,Int 類型的eventIdentifier,可以為空的Byte類型數組(在上一節提過)
ByteArray?是一個字節數組類型,用于存儲原始的字節數據。它與 Java 中的 byte[] 是兼容的(可以直接互操作),常用于處理二進制數據,比如網絡傳輸、文件讀寫、加密解密等場景。
日志打印
Logger.warning(TAG, "Data is null!")
同java相似不贅述
主線操作
ThreadUtils.runOnMainThread { ... }:這是一個工具類方法,用于將代碼塊切換到主線程執行。
// 將 eventId 替換為 currentEvent,類型仍為 EventIdEnum
when (currentEvent) {EventIdEnum.EVENT_UPDATE_CONNECT_STATUS -> ThreadUtils.runOnMainThread {onConnectionStatusChanged(packageName, dataJson)}EventIdEnum.EVENT_UPDATE_DEVICE_INFO -> ThreadUtils.runOnMainThread {onDeviceInfoUpdated(packageName, dataJson)}EventIdEnum.EVENT_UPDATE_SUPPORT_DESKTOP -> ThreadUtils.runOnMainThread {onDesktopSupportChanged(packageName, dataJson)}EventIdEnum.EVENT_UPDATE_HISTORY_DEVICE -> ThreadUtils.runOnMainThread {onHistoryDeviceListUpdated(packageName, dataJson)}EventIdEnum.EVENT_UPDATE_APP_LIST -> ThreadUtils.runOnMainThread {onAppListUpdated(packageName, dataJson)}
}
什么操作需要放在主線程?
涉及到更新UI頁面的操作,這些調用的函數會引起UI界面的改變,所以需要放在主線程
其他長時間且不直接涉及UI界面改變的可以放在子線程
when語句
when (it.dataCategory) {CategoryTypeConfig.TYPE_FIRST_SYSTEM -> {DataSourceConstants.SOURCE_PRIMARY_SYSTEM}CategoryTypeConfig.TYPE_SECONDARY_TOOL -> {DataSourceConstants.SOURCE_AUXILIARY_TOOL}CategoryTypeConfig.TYPE_THIRD_PARTY -> {DataSourceConstants.SOURCE_EXTERNAL_MODULE}else -> {DataSourceConstants.SOURCE_EXTERNAL_MODULE}
}
when語句這一段實際上返回的是一個變量,所以when語句可以這么寫
var data = when (it.dataCategory) {CategoryTypeConfig.TYPE_FIRST_SYSTEM -> {DataSourceConstants.SOURCE_PRIMARY_SYSTEM}CategoryTypeConfig.TYPE_SECONDARY_TOOL -> {DataSourceConstants.SOURCE_AUXILIARY_TOOL}CategoryTypeConfig.TYPE_THIRD_PARTY -> {DataSourceConstants.SOURCE_EXTERNAL_MODULE}else -> {DataSourceConstants.SOURCE_EXTERNAL_MODULE}
}
也可以把它作為一個參數傳給一個函數
callback.onProgress(when (it.itemType) {ItemTypeConfig.TYPE_STANDARD -> {ResourceType.SOURCE_STANDARD}ItemTypeConfig.TYPE_ENHANCED -> {ResourceType.SOURCE_ENHANCED}ItemTypeConfig.TYPE_PREMIUM -> {ResourceType.SOURCE_PREMIUM}else -> {ResourceType.SOURCE_PREMIUM}}, 100
);
lambda表達式放在下一章