首页 > 其他分享 >Android开发笔记[15]-设置页

Android开发笔记[15]-设置页

时间:2024-03-22 21:34:11浏览次数:34  
标签:compose 15 androidx MMKV 笔记 mmkv import Android android

摘要

使用MMKV数据框架实现设置页数据同步,设置页可以对其他页面进行设置;设置页数据通过MMKV框架持久化存储,重启APP不丢失.

关键信息

  • Android Studio:Iguana | 2023.2.1
  • Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zip
  • jvmTarget = '1.8'
  • minSdk 24
  • targetSdk 34
  • compileSdk 34
  • 开发语言:Kotlin,Java
  • ndkVersion = '21.1.6352462'
  • kotlin版本:1.9.20
  • kotlinCompilerExtensionVersion '1.5.4'
  • com.android.library:8.3

原理简介

MMKV框架

[https://juejin.cn/post/7230649998870396983]
[https://github.com/tencent/mmkv]
MMKV作为一种高性能大量数据的存储组件,对比Android传统的存储方式SharedPreferences和SQLite确实有不少优势。核心是使用mmap内存映射文件,对比传统IO,在性能上有很大优势,并且将读写文件的操作变得和操作内存一样简单。
MMKV引入增量写入,重整内存,通过文件大小校验对多进程操作感知,多进程读写锁等等。但它的缺点是可能造成内存的浪费,因为必须映射内存页的整数倍,如果只存储很少量的数据,则显得大材小用。因此,可以作为一种数据存储的选择方案,在一些需要大量存储数据场景时,替代SharedPreferences。
通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。

安卓App的设置页开发

[https://juejin.cn/post/7130609032447918110]
[https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_5434129139457149730]

实现

核心代码

  1. 添加KKVM依赖
    build.gradle
/* start 数据同步框架相关 */
implementation 'com.tencent:mmkv:1.3.4'
/* end 数据同步框架相关 */
  1. 新建BootApp类继承自Application类
    BootApp.kt
package cn.qsbye.grape_yolov5_detect_android

import android.app.Application
import android.graphics.Bitmap
import android.util.Log
import com.tencent.mmkv.MMKV
import com.zynksoftware.documentscanner.ui.DocumentScanner


// 需要设置AndroidManifest.xml文件使用.BootApp启动以在应用初始化时自动调用
class BootApp:Application() {
    companion object {
        private const val FILE_SIZE = 1000000L
        private const val FILE_QUALITY = 100
        private val FILE_TYPE = Bitmap.CompressFormat.JPEG
    }

    override fun onCreate() {
        super.onCreate()
        /* start 初始化MMKV库 */
        // 初始化,默认的保存地址是: /data/user/0/应用包名/files/mmkv
        val rootDir = MMKV.initialize(this)
        Log.d("MMKV","mmkv root:$rootDir")
        /* end 初始化MMKV库 */
    }
}
  1. 修改AndroidManifest.xml让BootApp类随应用启动;注册设置页.
    AndroidManifest.xml
<application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/grape_icon_round"
        android:label="@string/app_name"
        android:requestLegacyExternalStorage="true"
        android:supportsRtl="true"
        android:name=".BootApp"
        android:theme="@style/Theme.Grapeyolov5detectandroid"
        tools:targetApi="31">
        <activity
            android:name=".SettingsActivity"
            android:exported="false"
            android:label="@string/title_activity_settings"
            android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
</application>
  1. 设置页
    Settings.kt
package cn.qsbye.grape_yolov5_detect_android

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import cn.qsbye.grape_yolov5_detect_android.ui.theme.Grapeyolov5detectandroidTheme
import com.tencent.mmkv.MMKV

class SettingsActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            Grapeyolov5detectandroidTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    SettingsPage()
                }
            }
        }
    }
}

@Composable
fun SettingsPage() {
    // 定义用于存储开关状态的键
    val mmkv = MMKV.mmkvWithID("settings")
    // 用于记住开关状态的变量
     val isGrapeQualityEnabled = remember { mutableStateOf(mmkv.getBoolean("grape_quality_enabled", true)) }
     val isCpuInferenceEnabled = remember { mutableStateOf(mmkv.getBoolean("cpu_inference_enabled", true)) }
    // 设置页内容
    Column {
        // 葡萄品质开关
        SettingItem(
            title = "显示葡萄品质",
            isChecked = isGrapeQualityEnabled.value,
            onCheckedChange = {
                isGrapeQualityEnabled.value = it
                mmkv.putBoolean("grape_quality_enabled", it)
            }
        )
        // 仅使用CPU进行推理开关
        SettingItem(
            title = "仅使用CPU进行推理",
            isChecked = isCpuInferenceEnabled.value,
            onCheckedChange = {
                isCpuInferenceEnabled.value = it
                mmkv.putBoolean("cpu_inference_enabled", it)
            }
        )
    }
}
@Composable
fun SettingItem(title: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) {
    Row(modifier = Modifier.fillMaxWidth(),
        verticalAlignment = Alignment.CenterVertically,
        horizontalArrangement = Arrangement.SpaceBetween
    ) {
        Text(text = title)
        Switch(checked = isChecked, onCheckedChange = onCheckedChange)
    }
}

效果

设置页

标签:compose,15,androidx,MMKV,笔记,mmkv,import,Android,android
From: https://www.cnblogs.com/qsbye/p/18090449

相关文章

  • 【LeetCode-153.寻找旋转排序数组的最小值】
    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0],a[1],a[2],...,a[n-1......
  • [计算化学]分子动力学笔记
    本文为某计算机本科生的分子动力学学习笔记,在gpt4的辅助下,非体系化地整理相关生物、化学、统计力学知识。所有生成内容经过检查和调整,均直接代表本人观点。有科学性错误的话欢迎指教。什么是分子动力学定义:分子动力学是一门结合物理,数学和化学的综合技术。分子动力学是一套分子......
  • JavaWeb学习笔记——第一天
    Web开发什么是WebWeb:全球广域网,也称为万维网(wwwWorldWideWeb),能够通过浏览器访问的网站。Web网站的工作流程用户通过浏览器访问Web网站服务端的程序分为三部分:运行前端程序的前端服务器、运行Java后端程序的后端服务器和数据库服务器。用户通过浏览器对网站发起请求后,......
  • 洛谷题单指南-集合-P1525 [NOIP2010 提高组] 关押罪犯
    原题链接:https://www.luogu.com.cn/problem/P1525题意解读:有很多罪犯,要关到两座监狱,有一些罪犯之间有仇,并且可以量化出仇恨值,如果关在一起就会冲突,造成的影响就是仇恨值,要使得造成的影响最小,如果可以完全不起冲突,输出0。解题思路:首先,要让冲突影响最小化,显然应该把仇恨大的罪犯......
  • 蓝桥杯单片机快速开发笔记——利用定时器计数器设置定时器
    一、基本原理        参考本栏http://t.csdnimg.cn/iPHN0二、具体步骤三、主要事项    如果使用中断功能记得打开总中断EA四、示例代码voidTimer0_Isr(void)interrupt1{}voidTimer0_Init(void) //10毫秒@12.000MHz{ AUXR&=0x7F; //定时......
  • 蓝桥杯2015省B——生命之树
     蓝桥杯官网 洛谷[蓝桥杯2015省B]生命之树题目描述在X森林里,上帝创建了生命之树。他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。上帝要在这棵树内选出一个非空节点集 S(这里洛谷和蓝桥杯官网的不一样),使得对于S 中的任意两个点......
  • 代码随想录算法训练营第五十四天| ● 392.判断子序列 ● 115.不同的子序列
    判断子序列 题目链接:392.判断子序列-力扣(LeetCode)思路:从子串s开始遍历,查找t中是否存在,因为全程不需要回溯,因此两个for循环就解决了。只是要注意return的时机。(只要不想写的很简洁,逻辑挺简单的其实)classSolution{public:boolisSubsequence(strings,stringt){......
  • P2615 [NOIP2015 提高组] 神奇的幻方
    P2615[NOIP2015提高组]神奇的幻方[NOIP2015提高组]神奇的幻方题目背景NOIp2015提高组Day1T1题目描述幻方是一种很神奇的\(N\timesN\)矩阵:它由数字\(1,2,3,\cdots\cdots,N\timesN\)构成,且每行、每列及两条对角线上的数字之和都相同。当\(N\)为奇数时,我们......
  • 信息打点笔记
    信息打点第二期-源码获取知识点:1、CMS指纹识别源码获取方式2、习惯&配置&特性等获取方式3、托管资产平台资源搜索监控详细点:参考:https://www.secpulse.com/archives/124398.html源码泄漏原因:1、从源码本身的特性入口2、从管理员不好的习惯入口3、从管理员不好的配置入......
  • 【Python脚本随手笔记】 ---基于鸿蒙系统LiteOS实现差分编译脚本(下篇)
    ......