当用户通过系统设置(设置 > 应用 > 存储 > 清除数据)操作时,系统会执行以下操作:
/data/data/<包名>/
下的所有文件(含数据库、SharedPreferences、缓存等)存储类型 | 受影响范围 | 恢复难度 |
---|---|---|
Internal Storage | 应用私有目录全部清除 | |
External Storage | 需申请MANAGE_EXTERNAL_STORAGE权限 | |
SQLite数据库 | 完全删除 | |
SharedPreferences | 完全删除 |
由于Android系统未提供直接监听”清除数据”事件的API,需采用以下替代方案:
利用文件系统监控
FileObserver
监控应用私有目录变化数据库重建标记
// 在SQLiteOpenHelper中添加版本控制 public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE config (key TEXT, value TEXT)"); // 新增标记字段 db.execSQL("INSERT INTO config (key, value) VALUES('is_first_run', 'true')"); }
云端同步机制
WorkManager
定期同步关键配置val workRequest = PeriodicWorkRequest.Builder(SyncWorker::class.java, 15, TimeUnit.MINUTES) .setConstraints(Constraints.getNetwork()) .build() WorkManager.getInstance(context).enqueue(workRequest)
数据类型 | 保护方案 |
---|---|
用户配置 | 实时加密后存储至云端(推荐使用Firebase Remote Config) |
本地缓存 | 使用MMKV 框架的云同步功能 |
业务关键数据 | 通过Room 数据库的TypeConverter 实现自动备份 |
文件类数据 | 压缩后分片上传至对象存储(如AWS S3),使用MD5校验完整性 |
冷启动恢复流程
public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 检查首次运行标记 if (isFirstRun()) { initDefaultConfig(); } else { restoreFromCloud(); } } }
增量更新策略
VersionTable
记录配置版本# 云端配置合并伪代码 def merge_config(local, cloud): for key in cloud: if cloud[key]['version'] > local[key]['version']: local[key] = cloud[key] return local
多进程应用
ContentProvider
实现跨进程数据共享<provider android:name=".DataRecoveryProvider" android:exported="false" android:grantUriPermissions="true"> <pathPattern name="sync/" /> </provider>
WebView数据保护
WebView.clearCache(true)
强制清理缓存Q1:如何检测用户执行了”清除数据”操作?
A:目前没有官方API直接监听该事件,可通过以下方式间接判断:
PackageManager
检测应用安装时间变化Q2:能否完全阻止用户清除应用数据?
A:普通应用无法阻止系统级的数据清除操作,但可通过以下方式降低影响: