Kotlin Android 開發腳手架封裝

Kotlin Android 開發腳手架封裝(模塊化版本)

我將按照模塊化設計原則,將腳手架拆分為多個文件,每個文件負責特定功能領域:

1. 核心初始化模塊

文件路徑: core/AppScaffold.kt

object AppScaffold {lateinit var context: Contextprivate setfun initialize(appContext: Context) {context = appContext.applicationContextinitLogger()NetworkModule.init(context)DatabaseModule.init(context)PreferencesModule.init(context)WorkManagerModule.init(context)AnalyticsModule.init()CrashReportingModule.init()}private fun initLogger() {Timber.plant(if (BuildConfig.DEBUG) Timber.DebugTree() else ReleaseLogTree())}private class ReleaseLogTree : Timber.Tree() {override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {// 生產環境日志實現(可集成Firebase/Crashlytics等)}}
}

2. 網絡模塊

文件路徑: network/NetworkModule.kt

object NetworkModule {lateinit var retrofit: Retrofitprivate setfun init(context: Context) {retrofit = Retrofit.Builder().baseUrl(BuildConfig.BASE_URL).client(createOkHttpClient(context)).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(CoroutineCallAdapterFactory()).build()}private fun createOkHttpClient(context: Context): OkHttpClient {return OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).addInterceptor(LoggingInterceptor()).addInterceptor(AuthInterceptor()).addInterceptor(ConnectivityInterceptor(context)).build()}inline fun <reified T> createService(): T = retrofit.create(T::class.java)
}

3. 數據庫模塊

文件路徑: persistence/DatabaseModule.kt

object DatabaseModule {lateinit var database: AppDatabaseprivate setfun init(context: Context) {database = Room.databaseBuilder(context,AppDatabase::class.java, "app-database").fallbackToDestructiveMigration().build()}
}

4. 偏好設置模塊

文件路徑: persistence/PreferencesModule.kt

object PreferencesModule {lateinit var preferences: SharedPreferencesprivate setfun init(context: Context) {preferences = EncryptedSharedPreferences.create(context,"secure_preferences",MasterKey.Builder(context).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build(),EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM)}
}// 文件路徑: `persistence/SessionManager.kt`
object SessionManager {var accessToken: String?get() = PreferencesModule.preferences.getString("access_token", null)set(value) = PreferencesModule.preferences.edit().putString("access_token", value).apply()var userId: Longget() = PreferencesModule.preferences.getLong("user_id", -1L)set(value) = PreferencesModule.preferences.edit().putLong("user_id", value).apply()
}

5. 后臺任務模塊

文件路徑: work/WorkManagerModule.kt

object WorkManagerModule {lateinit var workManager: WorkManagerprivate setfun init(context: Context) {workManager = WorkManager.getInstance(context)}fun schedulePeriodicSync() {val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).setRequiresBatteryNotLow(true).build()val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(repeatInterval = 1, repeatIntervalTimeUnit = TimeUnit.HOURS).setConstraints(constraints).build()workManager.enqueueUniquePeriodicWork("syncWork",ExistingPeriodicWorkPolicy.KEEP,syncRequest)}
}

6. 分析模塊

文件路徑: analytics/AnalyticsModule.kt

object AnalyticsModule {fun init() {// 初始化Firebase/Mixpanel等分析工具}fun trackEvent(eventName: String, params: Map<String, Any> = emptyMap()) {// 事件跟蹤實現}
}

7. 崩潰報告模塊

文件路徑: crashreporting/CrashReportingModule.kt

object CrashReportingModule {fun init() {// 初始化Firebase Crashlytics/Sentry等}
}

8. 擴展函數模塊

文件路徑: extensions/ContextExtensions.kt

fun Context.showToast(message: String, duration: Int = Toast.LENGTH_SHORT) {Toast.makeText(this, message, duration).show()
}fun Context.isNetworkAvailable(): Boolean {val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerval network = connectivityManager.activeNetworkval capabilities = connectivityManager.getNetworkCapabilities(network)return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
}

9. 資源管理模塊

文件路徑: core/ResourceManager.kt

object ResourceManager {fun getString(@StringRes resId: Int, vararg args: Any): String {return AppScaffold.context.getString(resId, *args)}fun getColor(@ColorRes resId: Int): Int {return ContextCompat.getColor(AppScaffold.context, resId)}
}

10. 依賴注入模塊

文件路徑: di/ServiceLocator.kt

object ServiceLocator {private val services = mutableMapOf<String, Any>()inline fun <reified T : Any> register(instance: T) {services[T::class.java.name] = instance}inline fun <reified T : Any> get(): T {return services[T::class.java.name] as? T?: throw IllegalStateException("Service ${T::class.java.name} not registered")}
}

11. MVVM架構基礎

文件路徑: architecture/BaseActivity.kt

abstract class BaseActivity : AppCompatActivity() {abstract val layoutId: Intoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(layoutId)initView()initData()observeViewModel()}open fun initView() {}open fun initData() {}open fun observeViewModel() {}
}

文件路徑: architecture/BaseViewModel.kt

abstract class BaseViewModel : ViewModel() {private val _isLoading = MutableLiveData<Boolean>()val isLoading: LiveData<Boolean> = _isLoadingprivate val _errorMessage = MutableLiveData<String>()val errorMessage: LiveData<String> = _errorMessageprotected fun showLoading() {_isLoading.postValue(true)}protected fun hideLoading() {_isLoading.postValue(false)}protected fun showError(message: String) {_errorMessage.postValue(message)hideLoading()}
}

12. 工具類模塊

文件路徑: utils/SecurityUtils.kt

object SecurityUtils {fun encrypt(data: String): String {// AES加密實現}fun decrypt(encryptedData: String): String {// AES解密實現}
}

文件路徑: utils/ThemeManager.kt

object ThemeManager {fun applyTheme(context: Context, themeRes: Int) {context.setTheme(themeRes)// 動態主題應用邏輯}
}

使用示例

文件路徑: MyApplication.kt

class MyApp : Application() {override fun onCreate() {super.onCreate()AppScaffold.initialize(this)// 注冊服務ServiceLocator.register(DataRepositoryImpl())}
}

文件路徑: MainActivity.kt

class MainActivity : BaseActivity() {override val layoutId = R.layout.activity_mainprivate val viewModel: MainViewModel by viewModels()override fun initData() {viewModel.loadData()}override fun observeViewModel() {viewModel.data.observe(this) { data ->// 處理數據}}
}

項目結構

app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           ├── core/
│   │   │           │   ├── AppScaffold.kt
│   │   │           │   └── ResourceManager.kt
│   │   │           ├── network/
│   │   │           │   ├── NetworkModule.kt
│   │   │           │   └── interceptors/
│   │   │           ├── persistence/
│   │   │           │   ├── DatabaseModule.kt
│   │   │           │   ├── PreferencesModule.kt
│   │   │           │   └── SessionManager.kt
│   │   │           ├── work/
│   │   │           │   └── WorkManagerModule.kt
│   │   │           ├── analytics/
│   │   │           │   └── AnalyticsModule.kt
│   │   │           ├── crashreporting/
│   │   │           │   └── CrashReportingModule.kt
│   │   │           ├── di/
│   │   │           │   └── ServiceLocator.kt
│   │   │           ├── architecture/
│   │   │           │   ├── BaseActivity.kt
│   │   │           │   └── BaseViewModel.kt
│   │   │           ├── extensions/
│   │   │           │   └── ContextExtensions.kt
│   │   │           ├── utils/
│   │   │           │   ├── SecurityUtils.kt
│   │   │           │   └── ThemeManager.kt
│   │   │           ├── MyApplication.kt
│   │   │           └── MainActivity.kt
│   │   └── res/

這種模塊化設計具有以下優點:

  1. 高內聚低耦合:每個模塊專注于單一職責
  2. 易于維護:修改一個模塊不影響其他功能
  3. 可擴展性強:添加新功能只需添加新模塊
  4. 便于團隊協作:不同開發者可并行開發不同模塊
  5. 測試友好:模塊可單獨進行單元測試

這個腳手架封裝了Android開發的核心基礎設施,遵循現代Android開發最佳實踐,可顯著提高開發效率和代碼質量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917910.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flutter 報錯解析:No TabController for TabBar 的完整解決方案

目錄 Flutter 報錯解析&#xff1a;No TabController for TabBar 的完整解決方案 一、錯誤場景&#xff1a;當 TabBar 失去 "指揮官" 二、為什么 TabBar 必須依賴 Controller&#xff1f; 1. TabBar 與 TabController 的協作關系 2. 狀態管理的核心作用 3. 實戰…

【24】C++實戰篇——【 C++ 外部變量】 C++多個文件共用一個枚舉變量,外部變量 extern,枚舉外部變量 enum

文章目錄1 方法2 外部變量 應用2.1 普通外部全局變量2.2 枚舉外部全局變量 應用2.2.2 枚舉外部變量優化c多個文件中如何共用一個全局變量 c頭文件的使用和多個文件中如何共用一個全局變量 C共享枚舉類型給QML 1 方法 ①頭文件中 聲明外部全局變量&#xff1b; ②在頭文件對…

Linux SELinux 核心概念與管理

Linux SELinux 核心概念與管理一、SELinux 基本概念 SELinux 即安全增強型 Linux&#xff08;Security-Enhanced Linux&#xff09;&#xff0c;由美國國家安全局&#xff08;NSA&#xff09;開發&#xff0c;是一套基于強制訪問控制&#xff08;MAC&#xff09;的安全機制&…

Git 中**未暫存**和**未跟蹤**的區別:

文件狀態分類 Git 中的文件有以下幾種狀態&#xff1a; 工作區文件狀態&#xff1a; ├── 未跟蹤 (Untracked) ├── 已跟蹤 (Tracked)├── 未修改 (Unmodified) ├── 已修改未暫存 (Modified/Unstaged)└── 已暫存 (Staged)1. 未跟蹤 (Untracked) 定義&#xff1a;Gi…

前端1.0

目錄 一、 什么是前端 二、 HTML 1.0 概述 2.0 注釋 三、開發環境的搭建 1.0 插件 2.0 筆記 四、 常見標簽&#xff08;重點&#xff09; 四、案例展示&#xff08;圖片代碼&#xff09; 五、CSS引入 一、 什么是前端 web前端 用來直接給用戶呈現一個一個的網頁 …

Flutter鏡像替換

一、核心鏡像替換&#xff08;針對 Maven 倉庫&#xff09; Flutter 依賴的 Google Maven 倉庫&#xff08;https://maven.google.com 或 https://dl.google.com/dl/android/maven2&#xff09;可替換為國內鏡像&#xff0c;常見的有&#xff1a;阿里云鏡像&#xff08;推薦&am…

MATLAB實現的改進遺傳算法用于有約束優化問題

基于MATLAB實現的改進遺傳算法&#xff08;GA&#xff09;用于有約束優化問題的代碼&#xff0c;包括處理非線性約束。此代碼通過引入懲罰函數和修復機制&#xff0c;有效處理約束條件&#xff0c;提高算法的魯棒性和收斂速度。 1. 定義優化問題 % 定義目標函數 function f ob…

Qt子類化QWidget后,使用setStyleSheet設置樣式無效的解決方案

關鍵代碼&#xff1a; #include <QPainter> #include <QStyleOption>void paintEvent(QPaintEvent *e) {QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(e); }定義…

【python中級】關于Flask服務在同一系統里如何只被運行一次

【python中級】關于Flask服務在同一系統里如何只被運行一次 1.背景 2.方案1 2.方案2 1.背景 python Flask實現的一個http服務,打包成應用程序exe后在windows10系統運行; 由于我會不斷的更新這個http服務,我希望運行這個http服務的時候之前的http服務被停掉; 即實現 Pytho…

git配置公鑰/密鑰

遇到 “gitgithub.com: Permission denied (publickey)” 錯誤通常意味著你嘗試通過 SSH 連接到 GitHub 時&#xff0c;SSH 密鑰沒有被正確設置或者 GitHub 無法識別你的公鑰。這里有幾個步驟可以幫助你解決這個問題&#xff1a; 檢查 SSH 密鑰 首先&#xff0c;確保你已經在本…

【機器學習】“回歸“算法模型的三個評估指標:MAE(衡量預測準確性)、MSE(放大大誤差)、R2(說明模型解釋能力)

文章目錄一、MAE、MSE、r概念說明二、MAE&#xff08;平均絕對誤差&#xff09;&#xff1a;用"房價預測"理解誤差測量三、MSE&#xff08;均方誤差&#xff09;&#xff1a;誤差的"放大鏡"1、概念說明2、 sklearn代碼實踐3、流程總結四、R&#xff1a;理解…

智慧城市SaaS平臺|市容環衛管理系統

【生活垃圾中轉設施監管】1) 設施信息管理a) 設施基本信息支持記錄中轉設施的名稱、位置、類型、容量、負責人等基本信息。b) 設施分布地圖支持通過GIS地圖展示中轉設施的分布情況&#xff0c;支持地圖查詢和導航。2) 垃圾收運監控a) 垃圾收運記錄支持記錄垃圾收運的時間、車輛…

JAVA-13常用類(2025.08.02學習記錄)

String類String類equals方法String類compareTo方法String類valueOf方法boolean參數內存分析_字符串拼接只會在內存中開辟一個對象內存分析_字符串new創建對象內存分析_變量和字符串拼接字節碼執行過程String類內存分析package com.cn;public class test01 {public static void …

QT----簡單的htttp服務器與客戶端

HTTP協議學習 協議的相關學習可以參考這篇 csdn學習連接 總體流程如下 HTTP服務器 監聽ip和端口,有連接時接收請求,發送回復 server.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_httpServer.h" #include <QTcpServer> #include &l…

飛 算 JavaAI 解 析:有 了 它,麻 麻 再 也 不 用 擔 心 我 不 會 寫 代 碼 了!

聲 明&#xff1a;本 篇 博 客 為 測 評 體 驗 非 廣 告。 文 章 目 錄一、產 品 簡 介二、注 冊 與 上 手方 法 一 - - - 從 IDEA 插 件 市 場 安 裝方 法 二產 品 使 用三、產 品 體 驗智 能 引 導 功 能理 解 需 求設 計 接 口表 結 構 設 計處 理 邏 輯生 成 源 碼Java ch…

iOS混淆工具有哪些?在集成第三方 SDK 時的混淆策略與工具建議

許多 iOS 項目中&#xff0c;不可避免地會集成各種第三方 SDK&#xff0c;比如支付、統計、廣告、社交登錄等。這些 SDK 常常存在逆向被 Hook 或提取業務邏輯的風險&#xff0c;尤其是在流程敏感或要求合規的行業中。 當你無法對第三方源碼進行控制或重新編譯時&#xff0c;混淆…

【學習筆記之redis】刪除緩存

有一串這個代碼&#xff0c;staffEmailList這個key值里面的數據是錯誤的我需要刪除它&#xff0c;把數據新的數據加載到redis緩存中。 public EmailAddressRespDTO getAllEmailAddress() { List<EmailAddressRespDTO> staffEmailList redisCache.getCacheList("s…

Redis 持久化機制淺析

1. 持久化機制的作用 Redis 是基于內存的數據結構數據庫&#xff0c;雖然讀寫性能非常高&#xff0c;但所有數據默認保存在內存中。一旦服務器宕機、進程意外崩潰或容器重啟&#xff0c;內存中的數據將全部丟失。這對于生產環境的可用性與可靠性是極其危險的。因此&#xff0c;…

使用MatterJs物理2D引擎實現重力和鼠標交互等功能,有點擊事件(盒子堆疊效果)

使用MatterJs物理2D引擎實現重力和鼠標交互等功能&#xff0c;有點擊事件&#xff08;盒子堆疊效果&#xff09; 效果圖&#xff1a;直接上代碼&#xff0c;我是用的是html&#xff0c;使用了MatterJs的cdn&#xff0c;直接復制到html文件中然后在瀏覽器打開即可 <!DOCTYPE …

如何玩轉 Kubernetes K8S

在容器化時代&#xff0c;雖然Docker已經很強大了&#xff0c;但是在實際使用上還是有諸多不便&#xff0c;比如集群管理、資源調度、文件管理等等。 不過目前也涌現了很多解決方案&#xff0c;比如 Mesos、Swarm、Kubernetes 等等&#xff0c;其中谷歌開源的 Kubernetes就是其…