在 设置/显示 中增加是否一直显示状态栏的选项

本文介绍如何通过修改Android系统源码,在设置中增加一个选项,允许用户选择是否禁止所有应用进入全屏模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码: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 中增加如下:

[html]  view plain copy
  1. <CheckBoxPreference  
  2.     android:key="statusbar_show_setting"  
  3.     android:title="Always show StatusBar"/>  

2。packages\apps\Settings\src\com\android\settings\DisplaySettings.java 中增加如下:

声明一个变量:

// 被充一下,重新做的时候发现忘记写这个了,还要声明一个常量字符串

KEY_STATUSBAR_SHOW =  = "statusbar_show_setting"

[java]  view plain copy
  1. private CheckBoxPreference mStatusBarShow;  


在onCreate中初始化变量:

[java]  view plain copy
  1.       mStatusBarShow = (CheckBoxPreference) findPreference(KEY_STATUSBAR_SHOW);  
  2. mStatusBarShow.setPersistent(false);  
  3. mStatusBarShow.setOnPreferenceClickListener(new CheckBoxPreference.OnPreferenceClickListener(){  
  4.     @Override    
  5.     public boolean onPreferenceClick(Preference preference) {  
  6.         if (mStatusBarShow.isChecked()) {  
  7.             Settings.System.putInt(getContentResolver(), Settings.System.STATUSBAR_SHOW,1);  
  8.         }  
  9.         else {  
  10.             Settings.System.putInt(getContentResolver(), Settings.System.STATUSBAR_SHOW,0);  
  11.         }  
  12.         return false;  
  13.     }  
  14. });  


注意这里使用了Settings.System.STATUSBAR_SHOW,这个系统属性是我自已加的,在后面会讲到怎么增加。

在onResume()中增加初始化选中状态的代码(我这里在onResume中调用了另一个函数,所以我写在另一个函数里,但意思一样,就是显示前判断一下是否为选中)

[java]  view plain copy
  1. mStatusBarShow.setChecked(Settings.System.getInt(  
  2.                         getContentResolver(),  
  3.                         Settings.System.STATUSBAR_SHOW, 0) != 0);  

 

三。在frameworks\base\core\java\android\view\Window.java 中增加判断是否可以全屏的代码,这个类中的函数修改如下:

[java]  view plain copy
  1. public void setFlags(int flags, int mask) {  
  2.     if (Settings.System.getInt(mContext.getContentResolver(), Settings.System.STATUSBAR_SHOW,1) == 1) {  
  3.         if (flags == mask && flags == WindowManager.LayoutParams.FLAG_FULLSCREEN) {  
  4.             return;  
  5.         }  
  6.     }  
  7.     final WindowManager.LayoutParams attrs = getAttributes();  
  8.     attrs.flags = (attrs.flags&~mask) | (flags&mask);  
  9.     mForcedWindowFlags |= mask;  
  10.     if (mCallback != null) {  
  11.         mCallback.onWindowAttributesChanged(attrs);  
  12.     }  
  13. }  


做到这里,设置/显示这部份的内容就完成了,不过由于我使用了自已增加的一个系统属性来记录是否总是显示状态栏,所以下面写怎么实现这个功能。

一。在frameworks\base\packages\SettingsProvider\res\values\defaults.xml 中增加自定义系统属性的初始值

[html]  view plain copy
  1. <integer name="def_statusbar_show_setting">1</integer>  


二。在frameworks\base\core\java\android\provider\Settings.java 中增加自定义的系统变量

我是在1580多行写入这个:

[javascript]  view plain copy
  1. public static final String STATUSBAR_SHOW = "statusbar_show_setting";   


然后在1772行这个数组中加入这个成员:(要注意,好像有个同名的数组在下面,它是删除的,不要写到那里面去)

[java]  view plain copy
  1. public static final String[] SETTINGS_TO_BACKUP = {  
  2.     STATUSBAR_SHOW,  


三。在frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java 中,初始化数据库的时候,加入我们自定义的系统变量。

[java]  view plain copy
  1. private void loadSystemSettings(SQLiteDatabase db) {  
  2.     SQLiteStatement stmt = null;  
  3.     try {  
  4.         stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"  
  5.                 + " VALUES(?,?);");  
  6.               
  7.         // cj  
  8.         loadIntegerSetting(stmt, Settings.System.STATUSBAR_SHOW,  
  9.                 R.integer.def_statusbar_show_setting);  


 

好了,全部完成。主要是三方面,一个在设置中增加一个选择框,二是在window中增加一个判断是否可以全屏的步骤,三是增加自定义的系统属性。(为了保存设置,下次启动时读取)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值