Android系统中增加Settings中的自定义Key值

Settings Provider系统设置数据表中保存系统中偏好设置,应用可通过Settings的API访问对应偏好设置,主要Settings.Global、 Settings.Secure、 Settings.System三种类型的设置。
Settings.Global:全局系统设置,包含始终以相同方式应用于所有已定义用户的偏好设置。 应用程序可以读取这些内容,但不允许写入;与“安全”设置一样,这些设置适用于用户必须通过系统 UI 或这些值的专用 API 显式修改的首选项。常用设置项有蓝牙开关状态、adb开关状态等。
Settings.Secure:安全系统设置,包含应用程序可以读取但不允许写入的系统首选项。 这些首选项适用于用户必须通过系统 UI 或这些值的专用 API 显式修改的首选项,而不是由应用程序直接修改。常用设置项有无障碍、VPN状态等。
Settings.System:系统设置,包含混杂的系统偏好设置。 此表包含简单的名称/值对。 有一些方便的方法可用于访问各个设置条目。常用设置项有铃声、亮度、时间制式等。
下面介绍自定义一个Settings.Global的key的流程,自定义Settings.Secure、 Settings.System的方式类似。

Settings中的修改

源码路径 :

frameworks/base/core/java/android/provider/Settings.java

Settings的内部类Global中增加自定义Key的常量值,可以是String、int、boolean等常用类型。

 public static final class Global extends NameValueTable {
        /**
         * @hide
         */
        public static final String CUSTOM_KEY = "your_custom_key";
 }

MOVED_TO_GLOBAL列表中添加对应自定义Key:

        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        private static final HashSet<String> MOVED_TO_GLOBAL;
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        private static final HashSet<String> MOVED_TO_SECURE_THEN_GLOBAL;
        static {
            MOVED_TO_GLOBAL = new HashSet<>();
            MOVED_TO_SECURE_THEN_GLOBAL = new HashSet<>();

            // these were originally in system but migrated to secure in the past,
            // so are duplicated in the Secure.* namespace
            MOVED_TO_SECURE_THEN_GLOBAL.add(Global.ADB_ENABLED);
            MOVED_TO_SECURE_THEN_GLOBAL.add(Global.BLUETOOTH_ON);
            ...省略
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_NFC);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_CELL);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_WIFI);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_BLUETOOTH);
            MOVED_TO_GLOBAL.add(Settings.Global.RADIO_WIMAX);
            MOVED_TO_GLOBAL.add(Settings.Global.SHOW_PROCESSES);
            
            /** 添加你的自定义Keys */
            MOVED_TO_GLOBAL.add(Settings.Global.CUSTOM_KEY);

        }

再将自定义Key添加到PUBLIC_SETTINGS的公共系统key列表中:


        /**
         * @hide
         */
        public static final String CUSTOM_KEY = Global.CUSTOM_KEY;

        /**
         * These are all public system settings
         *
         * @hide
         */
        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
        public static final Set<String> PUBLIC_SETTINGS = new ArraySet<>();
        static {
            PUBLIC_SETTINGS.add(END_BUTTON_BEHAVIOR);
            PUBLIC_SETTINGS.add(WIFI_USE_STATIC_IP);
            PUBLIC_SETTINGS.add(WIFI_STATIC_IP);
            PUBLIC_SETTINGS.add(WIFI_STATIC_GATEWAY);
            PUBLIC_SETTINGS.add(WIFI_STATIC_NETMASK);
            ...省略
            PUBLIC_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED);
            PUBLIC_SETTINGS.add(SHOW_WEB_SUGGESTIONS);
            PUBLIC_SETTINGS.add(VIBRATE_WHEN_RINGING);
            PUBLIC_SETTINGS.add(APPLY_RAMPING_RINGER);
            
            /** 添加你的自定义Keys*/
            PUBLIC_SETTINGS.add(CUSTOM_KEY);
        }

SettingsProvider中的修改

1.在SettingsProvider的系统应用模块中添加默认值
源码路径:

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

代码如下:

<resources>
    <bool name="def_dim_screen">true</bool>
    <integer name="def_screen_off_timeout">60000</integer>
    <integer name="def_sleep_timeout">-1</integer>
    <bool name="def_airplane_mode_on">false</bool>
    <bool name="def_theater_mode_on">false</bool>
    <!-- Comma-separated list of bluetooth, wifi, and cell. -->
    <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi,nfc,wimax</string>
    <string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi,nfc</string>
    <string name="def_bluetooth_disabled_profiles" translatable="false">0</string>
    <bool name="def_auto_time">true</bool>
    <bool name="def_auto_time_zone">true</bool>
    <bool name="def_accelerometer_rotation">false</bool>
    <!-- Default screen brightness, from 0 to 255.  102 is 40%. -->
    <integer name="def_screen_brightness">102</integer>
    <bool name="def_screen_brightness_automatic_mode">false</bool>
    <fraction name="def_window_animation_scale">100%</fraction>
    <fraction name="def_window_transition_scale">100%</fraction>
    <bool name="def_haptic_feedback">true</bool>
    ...省略

    <!-- 添加你的自定义Keys -->
    <string name="def_custom_key">key1</bool>

2.通过loadGlobalSettings加载自定义的Keys到SettingsProvider系统应用模块的数据库中。
源码路径:

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

代码如下:

    private void loadGlobalSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = null;
        final Resources res = mContext.getResources();
        try {
            stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
                    + " VALUES(?,?);");

            // --- Previously in 'system'
            loadBooleanSetting(stmt, Settings.Global.AIRPLANE_MODE_ON,
                    R.bool.def_airplane_mode_on);
   
            ...省略
            loadSetting(stmt, Settings.Global.LID_BEHAVIOR, defaultLidBehavior);
            
            //添加你的自定义Keys
            loadStringSetting(stmt, Settings.Global.CUSTOM_KEY, R.string.def_custom_key);
        } finally {
            if (stmt != null) stmt.close();
        }
    }

    private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
        loadSetting(stmt, key, mContext.getResources().getString(resid));
    }

结语

完成以上修改后,即可在任一系统应用中使用自定义的Key:

     String value = Settings.Global.getString(getContentResolver(), Settings.Global.CUSTOM_KEY);

     Settings.Global.putString(getContentResolver(), Settings.Global.CUSTOM_KEY, " ");

更多请参考另一篇博客中对于SettingsProvider的相关介绍:浅谈android系统应用中的数据共享

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是在Android 11使用代码实现定时开关机功能的示例: 1. 首先,我们需要获得设置定时开关机的权限。在AndroidManifest.xml文件添加以下权限: ```xml <uses-permission android:name="android.permission.SET_ALARM"/> ``` 2. 创建一个定时开关机的方法: ```java private void setPowerOffAlarm() { // 获取AlarmManager实例 AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // 创建PendingIntent,用于启动定时开关机时要执行的操作 Intent intent = new Intent(this, PowerOffReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); // 获取当前时间 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); // 设置定时开关机的时间,这里设置为明天凌晨2点 calendar.set(Calendar.HOUR_OF_DAY, 2); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.DAY_OF_MONTH, 1); // 设置定时开机 alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } ``` 3. 创建一个BroadcastReceiver,用于接收定时开关机时要执行的操作: ```java public class PowerOffReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 执行关机操作 PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); powerManager.shutdown(); } } ``` 4. 在需要设置定时开关机的地方调用setPowerOffAlarm()方法即可。 请注意,为了确保定时开关机功能能够正常工作,您需要在AndroidManifest.xml文件声明PowerOffReceiver,并向系统注册它。例如: ```xml <receiver android:name=".PowerOffReceiver"/> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言并肃

感谢大哥支持!您的鼓励是我动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值