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/
這種模塊化設計具有以下優點:
- 高內聚低耦合:每個模塊專注于單一職責
- 易于維護:修改一個模塊不影響其他功能
- 可擴展性強:添加新功能只需添加新模塊
- 便于團隊協作:不同開發者可并行開發不同模塊
- 測試友好:模塊可單獨進行單元測試
這個腳手架封裝了Android開發的核心基礎設施,遵循現代Android開發最佳實踐,可顯著提高開發效率和代碼質量。