最近在项目中遇到要设置默认值的。就拿它举个例子吧。
假设我们要把Settings->Display->Daydream->menu->When to daydream-> 弹出菜单的默认值从While docked改为While charging.
OK, let's begin.
首先找到DreamSettings类的createWhenToDreamDialog方法。发现默认选定值来自于initialSelection这个变量,它作为下标,而它的取值是通过
int initialSelection = mBackend.isActivatedOnDock() && mBackend.isActivatedOnSleep() ? 2 : mBackend.isActivatedOnDock() ? 0 : mBackend.isActivatedOnSleep() ? 1 : -1;
这样判断的。
继续追踪到DreamBackend类的
isActivatedOnDock
方法,记下key值
SCREENSAVER_ACTIVATE_ON_DOCK
然后走到getBoolean方法,由
return Settings.Secure.getInt(mContext.getContentResolver(), key, def ? 1 : 0) == 1;
发现是从数据库取值。于是我们搜索之前记下的key值,迅速找到DatabaseHelper类,从
loadBooleanSetting(stmt, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
发现默认值是从一个布尔值中得到的,于是我们搜config_dreamsActivatedOnDockByDefault找到一个frameworks/base/core/res...底下的一个config.xml文件。
其中有这样两项
<!-- If supported and enabled, are dreams activated when docked? (by default) --> <bool name="config_dreamsActivatedOnDockByDefault">false</bool> <!-- If supported and enabled, are dreams activated when asleep and charging? (by default) --> <bool name="config_dreamsActivatedOnSleepByDefault">true</bool>
OK!这正是我们要找的地方。我把上面的false和true交换掉。mmm编译frameworks/base/core/res/生成frameworks-res.apk.把它push进手机重启。验证发现并没有效果。
那么我们的问题来了!
于是我查找数据库,用sqlite3工具在 data/data/com.android.providers.settings/databases/settings.db中的secure表里面找到两项(这种查找数据库的方法很重要!!!)
17|screensaver_activate_on_dock|1 18|screensaver_activate_on_sleep|0
他们的值并没有变过来。
然后,我在单编frameworks/base/core/res/之后进行打包,如下
mmm frameworks/base/core/res/ snod
生成system.img镜像,全擦手机并刷入。启动以后发现数据库中的值成功的变成了
17|screensaver_activate_on_dock|0 18|screensaver_activate_on_sleep|1
我进入Setting目录查看,也确实默认勾选了While charging.问题成功解决!!
那么我们可以总结以下原因:
手机在烧写版本之后第一次开机,会把形如config.xml/defaults.xml等我们的默认值一次性写到数据库里。然后像Settings这些应用再从这些数据库中取值。我们
所以以后要是修改了这些默认值,验证的时候需要通过单编打包的方式验证。简单的单编这个模块并push并不能影响到数据库,所以没用。
今天是帮一个同事走读代码的时候发现在布局上简单的删去一个item是没用的,需要深追下去,找到item对应的功能的默认值。引起了我的兴趣,然后,用我的方法成功解决问题并成功验证。也让我搞通了android数据库与默认值这块。收获颇丰,大快人心!
相关推荐
在Android应用开发中,SQLite是默认的轻量级数据库,用于存储应用程序的数据。当需要对已存在的数据库进行升级,比如给旧表添加新的字段,同时要确保原有的数据不受影响时,需要遵循一定的步骤和策略。以下就是关于...
以上就是Android数据库升级,增加字段的基本步骤和注意事项。在实际开发中,还要考虑更多细节,比如在大量用户数据的情况下,升级操作的性能优化,以及如何避免因升级导致的用户数据丢失等问题。理解并熟练掌握这些...
在Android开发中,SQLite是一个至关重要的组件,它是一个轻量级的、开源的、关系型数据库,被广泛用于存储和管理应用程序中的结构化数据。SQLite支持标准的关系数据库特性,如SQL语法、事务处理和预编译语句,使得在...
本篇“Android数据库升级demos”旨在通过实例展示如何在Android中优雅地处理数据库升级问题。 首先,Android使用SQLite作为默认的本地关系型数据库,它支持SQL语法,方便进行数据操作。当数据库升级时,我们通常会...
这些操作对于理解和实践Android数据库编程至关重要。 1. 数据库简介: Android系统支持SQLite数据库,这是一个轻量级的、关系型的数据库,适合嵌入式设备使用。SQLite数据库的所有操作都是通过SQL语句来完成的。 ...
Android应用与远程数据库的连接方式 #### 直接连接远程数据库的限制 尽管Android平台自带了java.sql包,理论上支持多种数据库的JDBC Driver,但在实际应用中,由于设备兼容性、性能、安全性和网络限制等问题,...
SQLite是一个轻量级的、嵌入式的、关系型数据库,它允许开发者在Android设备上存储和管理数据。随着应用的迭代和功能的增加,可能需要对数据库进行升级,比如添加新的表格、修改现有表格结构或者增加字段。本文将...
在Android应用开发中,数据库是存储持久化数据的重要手段之一。GreenDao是一个高效、轻量级的对象关系映射(ORM)框架,它使得开发者能够方便地将Java对象与SQLite数据库中的表进行映射,从而避免繁琐的SQL操作。在...
SettingsProvider 修改默认值数据及更新数值SettingsProvider数据存储强制更新数据 SettingsProvider数据存储 frameworks\base\packages\SettingsProvider中android6.0之后用不在用settings.db这个数据了,会存储在/...
在Android应用开发中,构建一个登录模块并连接到MySQL数据库是一项常见的需求,特别是在需要处理用户数据和服务端交互的场景。本文作者通过三个星期的努力,成功实现了这一功能,并在此分享了他的经验与遇到的问题。...
在Android开发中,使用预先制作好的SQLite数据库是一个常见的需求,特别是在应用启动时需要加载大量预设数据的情况下。本文将详细讲解如何将一个已创建的SQLite数据库集成到Android应用中。 首先,我们需要创建并预...
#### 二、数据库与表的创建 1. **创建数据库**: ```sql createdatabaseMyLibary GO ``` 这条语句用于创建名为`MyLibary`的数据库。 2. **使用数据库**: ```sql useMyLibary GO ``` 使用创建好的数据库...
在Android开发中,数据存储是不可或缺的一部分,而K-V(Key-Value)型数据库因其简单易用、轻量级的特点,常被用于保存应用程序中的临时或小型数据。本篇文章将详细探讨Android Studio中Hawk这一K-V数据库的工具类...
本文主要介绍了基于 Android 平台的在线音乐客户端的设计与实现,涵盖了项目背景、系统需求分析、数据库设计等方面的知识点。 一、项目背景 在移动互联网时代,音乐播放器已经成为人们日常生活的一部分。随着 ...
10. **数据同步**:Android支持数据同步框架,如SyncAdapter,可以将本地数据库数据与远程服务器进行同步。 在实际开发中,理解这些知识点有助于开发者有效地使用Android系统的内置数据库,创建高效、可靠的本地...
另一个是简化版的构造函数,只接受上下文和数据库名,其他参数使用默认值。`onCreate()`方法在数据库首次创建时被调用,用于创建表。在这里,我们执行了创建`book`表的SQL语句。`onUpgrade()`方法则在数据库版本升级...
- `android.os.UserManager`:提供了与用户管理相关的公共接口。 - `com.android.server.pm.UserManagerService`:实现了用户管理的核心服务逻辑。 - `com.android.server.am.ActivityManagerService`:负责处理用户...
Spinner允许用户从一组预定义的选项中选择一个,并且在选择时可以显示默认值或者一个下拉箭头,用户点击后会展开选项列表。在Xamarin.Android框架中,Spinner的使用极大地提升了用户体验,使得应用程序界面更加互动...
在Android开发中,协程常用于处理耗时操作,如网络请求和数据库操作。 8. **Anko库**: Anko是JetBrains为Kotlin开发的一个库,简化了Android开发中的许多常见任务,如意图创建、对话框操作、JSON解析等。 9. **...