源码:2.3.4
知识点:禁止所有应用使用全屏功能。这个改动很简单,只需要在frameworks\base\core\java\android\view\Window.java 这个类中的 public void setFlags(int flags, int mask) 函数,判断一下 flags 和 mask是不是都是 WindowManager.LayoutParams.FLAG_FULLSCREEN,如果是,则直接退出。
然后正式开始:
一。在 设置/选项中增加一个 CheckBoxPreference,选中的时候状态栏一直存在,不选中的时候正常状态(全屏程序时,会自动隐藏)
过程:
1。packages\apps\Settings\res\xml\display_settings.xml 中增加如下:
- <CheckBoxPreference
- android:key="statusbar_show_setting"
- android:title="Always show StatusBar"/>
2。packages\apps\Settings\src\com\android\settings\DisplaySettings.java 中增加如下:
声明一个变量:
// 被充一下,重新做的时候发现忘记写这个了,还要声明一个常量字符串
KEY_STATUSBAR_SHOW = = "statusbar_show_setting"
- private CheckBoxPreference mStatusBarShow;
在onCreate中初始化变量:
- mStatusBarShow = (CheckBoxPreference) findPreference(KEY_STATUSBAR_SHOW);
- mStatusBarShow.setPersistent(false);
- mStatusBarShow.setOnPreferenceClickListener(new CheckBoxPreference.OnPreferenceClickListener(){
- @Override
- public boolean onPreferenceClick(Preference preference) {
- if (mStatusBarShow.isChecked()) {
- Settings.System.putInt(getContentResolver(), Settings.System.STATUSBAR_SHOW,1);
- }
- else {
- Settings.System.putInt(getContentResolver(), Settings.System.STATUSBAR_SHOW,0);
- }
- return false;
- }
- });
注意这里使用了Settings.System.STATUSBAR_SHOW,这个系统属性是我自已加的,在后面会讲到怎么增加。
在onResume()中增加初始化选中状态的代码(我这里在onResume中调用了另一个函数,所以我写在另一个函数里,但意思一样,就是显示前判断一下是否为选中)
- mStatusBarShow.setChecked(Settings.System.getInt(
- getContentResolver(),
- Settings.System.STATUSBAR_SHOW, 0) != 0);
三。在frameworks\base\core\java\android\view\Window.java 中增加判断是否可以全屏的代码,这个类中的函数修改如下:
- public void setFlags(int flags, int mask) {
- if (Settings.System.getInt(mContext.getContentResolver(), Settings.System.STATUSBAR_SHOW,1) == 1) {
- if (flags == mask && flags == WindowManager.LayoutParams.FLAG_FULLSCREEN) {
- return;
- }
- }
- final WindowManager.LayoutParams attrs = getAttributes();
- attrs.flags = (attrs.flags&~mask) | (flags&mask);
- mForcedWindowFlags |= mask;
- if (mCallback != null) {
- mCallback.onWindowAttributesChanged(attrs);
- }
- }
做到这里,设置/显示这部份的内容就完成了,不过由于我使用了自已增加的一个系统属性来记录是否总是显示状态栏,所以下面写怎么实现这个功能。
一。在frameworks\base\packages\SettingsProvider\res\values\defaults.xml 中增加自定义系统属性的初始值
- <integer name="def_statusbar_show_setting">1</integer>
二。在frameworks\base\core\java\android\provider\Settings.java 中增加自定义的系统变量
我是在1580多行写入这个:
- public static final String STATUSBAR_SHOW = "statusbar_show_setting";
然后在1772行这个数组中加入这个成员:(要注意,好像有个同名的数组在下面,它是删除的,不要写到那里面去)
- public static final String[] SETTINGS_TO_BACKUP = {
- STATUSBAR_SHOW,
三。在frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java 中,初始化数据库的时候,加入我们自定义的系统变量。
- private void loadSystemSettings(SQLiteDatabase db) {
- SQLiteStatement stmt = null;
- try {
- stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
- + " VALUES(?,?);");
- // cj
- loadIntegerSetting(stmt, Settings.System.STATUSBAR_SHOW,
- R.integer.def_statusbar_show_setting);