在安卓系统开发的过程中,常常需要写一下标志位来保存数据。通常会使用sharepreferences来写数据,但是存在一个问题,如果用户在setting中清除应用数据的话,相应的标志位也会被清除。这里我们提供一种写在系统里面标志位(系统全局变量)的方法。
一、在系统中添加自定义字段
第一步:
/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
class DatabaseHelper extends SQLiteOpenHelper{
//声明变量
private static final String SYSTEM_UI_ICON_SHOW = "system_ui_icon_show";
}
private void loadSystemSettings(SQLiteDatabase db) {
//添加下面的方法
loadStringSetting(stmt, SYSTEM_UI_ICON_SHOW, R.string.quick_settings_tiles_default_show_framework);
}
第二步:
/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<!--要写的数据-->
<string name="quick_settings_tiles_default_show_framework">wifi,location,cell,hotspot,sound,nfc,bt,rotation,airplane,screenshot,flashlight,more
</string>
很方便我们就写好了标志位,下面说一下如何读写相应的数据。
//这样很方便的话就可以获取系统中的数据,读数据
String show_new= Settings.System.getString(getContext().getContentResolver(),"system_ui_icon_show");
Log.e("whxwhx", "show_new" + show_new);
//写数据showStr
Settings.System.putString(mContext.getContentResolver(), "system_ui_icon_show",showStr);
这样很方便我们就在系统中创建了一个标志位。这种方法的标志位使用还是很常见的。上面只提供了String的相应操作的方法,int什么的都是一样的。
温馨提醒,如果是MTK平台的代码
vendor/mediatek/proprietary/packages/apps/SettingsProvider 里面去创建这个标志位。
因为在mk文件中我们可以看见下面的语句,使用MtkSettingsProvider去覆盖系统中的SettingsProvider。
LOCAL_PACKAGE_NAME := MtkSettingsProvider
LOCAL_OVERRIDES_PACKAGES := SettingsProvider
二、注意
如果实在普通的app中使用并修改某个值的时候,还应该注意要动态申请权限。
//申请权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(MainActivity.this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + MainActivity.this.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
还有一个权限
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
在获取到权限以后,我们就可以修改系统中的默认值,例如修改亮度。
private static final int MIN_SCREEN_TIMEOUT_VALUE = 15000;
//修改系统灭屏时间为15秒
Settings.System.putInt(getApplicationContext().getContentResolver(),
"screen_off_timeout", MIN_SCREEN_TIMEOUT_VALUE);