数据存储之(三): Library/Preference路径的存储---NSUserDefaults

本文详细介绍了iOS应用如何利用UserDefaults实现偏好设置,包括如何保存、读取和强制写入用户设置,确保数据持久性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

偏好设置:

 

很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能

每个应用都有个NSUserDefaults实例,通过它来存取偏好设置

比如,保存用户名、字体大小、是否自动登录

 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:@"itcast"forKey:@"username"];

[defaults setFloat:18.0fforKey:@"text_size"];

[defaults setBool:YESforKey:@"auto_login"];

 

读取上次保存的设置

 

NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

NSString *username = [defaults stringForKey:@"username"];

float textSize = [defaults floatForKey:@"text_size"];

BOOL autoLogin = [defaults boolForKey:@"auto_login"];

注意:UserDefaults设置数据时,不是立即写入而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调synchornize方法强制写入

[defaults synchornize];

 

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/aidl LOCAL_AIDL_FILES := $(call all-aidl-files-under, $(LOCAL_PATH)/src/aidl) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := FactoryMode LOCAL_PRIVATE_PLATFORM_APIS := false LOCAL_PRIVILEGED_MODULE := true LOCAL_CERTIFICATE := platform LOCAL_USE_AAPT2 := true LOCAL_PROGUARD_ENABLED := disabled LOCAL_DEX_PREOPT := false LOCAL_STATIC_ANDROID_LIBRARIES += \ android-support-constraint-layout \ android-support-compat \ android-support-v4 \ android-support-v13 \ android-support-v7-appcompat \ android-support-v7-cardview \ android-support-v7-preference \ android-support-v14-preference \ androidx.recyclerview_recyclerview \ LOCAL_STATIC_JAVA_LIBRARIES += upgradeProxy \ zxing \ someip \ clusterKit \ wayto-annotation \ wayto-base \ mshi \ jwriter \ okio-jvm \ kotlin \ sshd-sftp \ sshd-core \ sshd-common \ slf4j-simple \ slf4j-api \ testsftp-client \ gson-jar \ lifecycle-jar \ LOCAL_JAVA_LIBRARIES += android.car #LOCAL_JNI_SHARED_LIBRARIES := jni include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += upgradeProxy:libs/upgradeProxy.jar \ zxing:libs/zxing.jar \ someip:libs/someip.jar \ clusterKit:libs/ClusterKit-debug.aar \ wayto-annotation:libs/wayto-annotation.jar \ wayto-base:libs/wayto-base-debug.aar \ mshi:libs/moshi-1.15.0.jar \ jwriter:libs/javawriter-2.1.1.jar \ moshi:libs/moshi-1.15.0.jar \ okio-jvm:libs/okio-jvm-2.10.0.jar \ kotlin:libs/kotlin-stdlib-1.9.24.jar \ sshd-sftp:libs/sshd-sftp-2.7.0.jar \ sshd-core:libs/sshd-core-2.7.0.jar \ sshd-common:libs/sshd-common-2.7.0.jar \ slf4j-simple:libs/slf4j-simple-2.0.7.jar \ slf4j-api:libs/slf4j-api-2.0.7.jar \ testsftp-client:libs/jsch-0.1.55.jar \ gson-jar:libs/gson-2.8.9.jar \ lifecycle-jar:libs/lifecycle-common-2.6.1.jar \ include $(BUILD_MULTI_PREBUILT) include $(call all-makefiles-under, $(LOCAL_PATH))
最新发布
07-18
<think>我们正在讨论Android构建系统中的Makefile配置,特别是针对Android模块的编译。用户询问的是关于LOCAL_PATH和BUILD_PACKAGE在Android.mk文件中的配置解析。根据用户提供的引用内容,我们可以总结如下: 1. **LOCAL_PATH**:每个Android.mk文件的开头必须定义LOCAL_PATH变量,它表示当前.mk文件所在的目录路径。通常通过`$(call my-dir)`来获取当前目录路径。例如: ```makefile LOCAL_PATH := $(call my-dir) ``` 2. **include $(CLEAR_VARS)**:这个语句用于清除除了LOCAL_PATH以外的所有LOCAL_xxx变量,为新的模块编译做准备。因为所有的编译控制文件都在同一个GNU Make执行环境中,变量是全局的,所以需要清除之前设置的变量,避免影响当前模块。 3. **BUILD_PACKAGE**:这是一个预定义的构建脚本,用于构建一个APK。在模块的变量设置完成后,通过`include $(BUILD_PACKAGE)`来触发构建APK的规则。它会根据之前设置的LOCAL_xxx变量来编译生成APK。 4. 其他常用变量: - **LOCAL_MODULE**:模块的名称,但注意在构建APK时,通常使用LOCAL_PACKAGE_NAME(引用[2]和引用[4]中都是使用LOCAL_PACKAGE_NAME)。 - **LOCAL_PACKAGE_NAME**:指定要构建的APK的名称,如SoundRecorder(引用[2])或Launcher3(引用[4])。 - **LOCAL_SRC_FILES**:指定源文件,可以使用函数如`$(call all-java-files-under, src)`来获取指定目录下的所有java文件。 - **LOCAL_MODULE_TAGS**:指定模块的标签,如optional(引用[2]和引用[4])。 - **LOCAL_PRIVILEGED_MODULE**:如果设置为true,表示该应用会被安装到系统的priv-app目录,具有更高的权限。 - **LOCAL_OVERRIDES_PACKAGES**:用于指定当前模块要覆盖的模块列表(引用[4])。例如,Launcher3会覆盖Home、Launcher2和CarLauncher模块。 根据引用[2]和引用[4]的示例,我们可以整理一个典型的Android.mk文件的结构: ```makefile # 设置当前模块的路径 LOCAL_PATH := $(call my-dir) # 清除除了LOCAL_PATH以外的所有LOCAL_xxx变量 include $(CLEAR_VARS) # 设置模块标签(optional表示该模块在默认编译下不会被编译,需要明确指定或包含在某个产品配置中) LOCAL_MODULE_TAGS := optional # 设置源文件,这里使用函数获取当前目录下所有子目录的java文件 LOCAL_SRC_FILES := $(call all-subdir-java-files) # 设置包名(即模块名) LOCAL_PACKAGE_NAME := SoundRecorder # 设置为特权模块(可选) LOCAL_PRIVILEGED_MODULE := true # 引入构建APK的规则 include $(BUILD_PACKAGE) ``` 另外,引用[4]中展示了一个更复杂的例子,其中还包含了一些额外的设置,比如: - `LOCAL_STATIC_JAVA_LIBRARIES`:指定依赖的静态Java库。 - `LOCAL_STATIC_ANDROID_LIBRARIES`:指定依赖的静态Android库(如AAR)。 - `LOCAL_PROGUARD_FLAG_FILES`:指定ProGuard配置文件。 - `LOCAL_SDK_VERSION`和`LOCAL_MIN_SDK_VERSION`:设置SDK版本。 ### 注意事项: 1. 每个模块的Android.mk文件必须以`LOCAL_PATH := $(call my-dir)`开始,紧接着通常是`include $(CLEAR_VARS)`。 2. 在设置完所有的LOCAL_xxx变量后,通过`include $(BUILD_XXX)`来指定构建类型,比如`BUILD_PACKAGE`表示构建APK,`BUILD_STATIC_LIBRARY`表示构建静态库等。 3. 变量设置顺序没有严格要求,但通常把重要的变量(如包名、源文件)放在前面。 ### 相关问题 1. 如何为Android模块添加依赖库? 2. 在Android.mk中如何指定资源文件和资源覆盖? 3. 如何配置模块仅针对特定平台(如x86)编译? 4. Android.mk中的LOCAL_MODULE和LOCAL_PACKAGE_NAME有什么区别? 5. 如何为Android模块配置ProGuard混淆规则?</think>### Android模块 Makefile 配置解析:LOCAL_PATH 与 BUILD_PACKAGE #### 1. **LOCAL_PATH 基础配置** **核心作用**:定义当前模块的根目录路径 **语法规范**: ```makefile LOCAL_PATH := $(call my-dir) # 必须放在文件开头 ``` - `$(call my-dir)`:NDK内置函数,自动获取当前.mk文件所在目录路径[^1] - **必须性**:每个Android.mk文件必须以该语句开头 - **全局唯一**:后续所有文件路径都基于此变量展开 > 示例: > 若模块路径为`packages/apps/SoundRecorder`,则`$(call my-dir)`返回该绝对路径[^2] #### 2. **BUILD_PACKAGE 关键配置** **核心作用**:声明当前模块为APK应用程序包 **触发方式**: ```makefile include $(BUILD_PACKAGE) # 放在文件末尾 ``` **关联变量**: | 变量名 | 作用 | 示例值 | |-----------------------|----------------------------------------------------------------------|---------------------------------| | `LOCAL_PACKAGE_NAME` | 定义APK包名(必须唯一) | `SoundRecorder`[^2] | | `LOCAL_SRC_FILES` | 指定Java源文件路径 | `$(call all-java-files-under, src)` | | `LOCAL_MODULE_TAGS` | 设置模块编译标签 | `optional`[^2] | | `LOCAL_PRIVILEGED_MODULE` | 标记为特权应用(安装到/system/priv-app) | `true`[^2] | | `LOCAL_OVERRIDES_PACKAGES` | 声明要覆盖的同名模块 | `Home Launcher2`[^4] | #### 3. **完整配置流程** ```makefile # 1. 必须首先定义路径 LOCAL_PATH := $(call my-dir) # 2. 清除历史变量(关键步骤!) include $(CLEAR_VARS) # 清空除LOCAL_PATH外的所有LOCAL_xxx变量[^1] # 3. 配置模块属性 LOCAL_PACKAGE_NAME := MyApp # 应用包名 LOCAL_MODULE_TAGS := optional # 编译标签 LOCAL_SRC_FILES := $(call all-subdir-java-files) # 包含所有Java文件[^2] # 4. 高级配置示例 LOCAL_PRIVILEGED_MODULE := true # 特权应用 LOCAL_OVERRIDES_PACKAGES := Home # 覆盖Home模块[^4] LOCAL_PROGUARD_FLAG_FILES := proguard.cfg # 混淆配置 # 5. 声明构建类型 include $(BUILD_PACKAGE) # 触发APK构建规则 ``` #### 4. **关键机制解析** 1. **CLEAR_VARS 的必要性** - 清除前一个模块设置的变量,避免污染当前模块[^1] - 必须紧跟在`LOCAL_PATH`后调用 2. **源文件收集函数** ```makefile $(call all-java-files-under, src) # 收集src目录下所有Java文件 $(call all-subdir-java-files) # 收集所有子目录Java文件[^2] ``` 3. **模块覆盖机制** `LOCAL_OVERRIDES_PACKAGES`用于解决同名模块冲突: ```makefile LOCAL_OVERRIDES_PACKAGES := Launcher2 CarLauncher # 覆盖指定模块[^4] ``` 当多个Launcher并存时,确保最终只编译当前模块 #### 5. **特殊场景处理** **预编译模块**: ```makefile include $(CLEAR_VARS) LOCAL_MODULE_CLASS := APPS # 必须显式声明类型[^3] LOCAL_MODULE := prebuilt-app LOCAL_SRC_FILES := prebuilt/app.apk include $(BUILD_PREBUILT) # 使用预编译构建 ``` **多模块管理**: 同一目录下多个模块需拆分.mk文件: ``` src/ ├── module1/ │ ├── Android.mk # LOCAL_PATH := $(call my-dir)/module1 ├── module2/ │ ├── Android.mk # LOCAL_PATH := $(call my-dir)/module2 ``` ### 常见配置问题 1. **变量未清空**:忘记`include $(CLEAR_VARS)`导致变量污染 2. **路径错误**:`LOCAL_PATH`未正确定义或未放在开头 3. **覆盖失效**:`LOCAL_OVERRIDES_PACKAGES`未正确定义覆盖目标 4. **预编译缺失**:`BUILD_PREBUILT`模块未设置`LOCAL_MODULE_CLASS`[^3] > 最佳实践:每个模块独立.mk文件,严格遵循`LOCAL_PATH -> CLEAR_VARS -> 变量配置 -> BUILD_xxx`流程[^1][^2] ### 相关问题 1. Android.mk中如何配置动态库依赖(`LOCAL_SHARED_LIBRARIES`)? 2. `LOCAL_MODULE_TAGS`的取值(optional, eng, tests等)有何区别? 3. 如何为系统应用配置签名(`LOCAL_CERTIFICATE`)? 4. 在模块覆盖场景中,`LOCAL_OVERRIDES_PACKAGES`和`LOCAL_REPLACE_PREBUILT`有何异同? 5. 如何为模块添加资源覆盖机制(`LOCAL_RESOURCE_DIR`)?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值