需求:对Settings主界面进行管控,输入某串暗码,Settings中指定项隐藏(如Wifi、Bluetooth);输入另一串暗码,Settings中隐藏项恢复显示。
/packages/app/Settings/com/android/settings/SettingsActivity.java
在SettingsActivity中会有部分item的控制:
doUpdateTilesList(){
PackageManager pm = getPackageManager();
final UserManager um = UserManager.get(this);
final boolean isAdmin = um.isAdminUser();
String packageName = getPackageName();
setTileEnabled(new ComponentName(packageName, WifiSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_WIFI), isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.BluetoothSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.DataUsageSummaryActivity.class.getName()),
Utils.isBandwidthControlEnabled(), isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.SimSettingsActivity.class.getName()),
Utils.showSimCardTile(this), isAdmin, pm);
//location
setTileEnabled(new ComponentName(packageName,
Settings.LocationSettingsActivity.class.getName()),
false, isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.PowerUsageSummaryActivity.class.getName()),
mBatteryPresent, isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.UserSettingsActivity.class.getName()),
UserHandle.MU_ENABLED && UserManager.supportsMultipleUsers()
&& !Utils.isMonkeyRunning(), isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.WirelessSettingsActivity.class.getName()),
!UserManager.isDeviceInDemoMode(this), isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.DateTimeSettingsActivity.class.getName()),
!UserManager.isDeviceInDemoMode(this), isAdmin, pm);
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
setTileEnabled(new ComponentName(packageName,
Settings.PaymentSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_NFC)
&& pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
&& adapter != null && adapter.isEnabled(), isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.PrintSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_PRINTING), isAdmin, pm);
final boolean showDev = mDevelopmentPreferences.getBoolean(
DevelopmentSettings.PREF_SHOW, android.os.Build.TYPE.equals("eng"))
&& !um.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES);
setTileEnabled(new ComponentName(packageName,
Settings.DevelopmentSettingsActivity.class.getName()),
showDev, isAdmin, pm);
if(!SystemProperties.get("ro.build.characteristics","null").equals("tablet")) {
setTileEnabled(new ComponentName(packageName,
Settings.ScreenshotSettingsActivity.class.getName()),
false, isAdmin, pm);
}
}
可在此处自行增加缺失的settings项来控制显示/隐藏。也可查找上游。
其中显示则为pm.hasSystemFeature(PackageManager.FEATURE_PRINTING)如此类型,隐藏则为false。但是通过对代码解读发现,此处只可控制部分item的显示与隐藏,无法达到对所有item的管控。所以此处不是正确修改点。
继续追踪Settings的显示流程,发现其中所有的item都是继承SettingsActivity,并通过AndroidManifest.xml中的配置项来分配指定fragment。这是有读取
<activity android:name="Settings"
android:taskAffinity="com.android.settings"
android:label="@string/settings_label_launcher"
android:launchMode="singleTask">
<intent-filter android:priority="1">
<action android:name="android.settings.SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
类似这样的属性值来完成此项操作的。具体的流程追踪此处不做详。
在framework中的TileUtils.java类中会对Category进行获取、创建等操作,这是绘制到Settings中的主要属性。
public static List<DashboardCategory>getCategories(Context context,
HashMap<Pair<String, String>, Tile> cache) {
final long startTime = System.currentTimeMillis();
boolean setup = Global.getInt(context.getContentResolver(), Global.DEVICE_PROVISIONED, 0)
!= 0;
ArrayList<Tile> tiles = new ArrayList<>();
UserManager userManager = UserManager.get(context);
for (UserHandle user : userManager.getUserProfiles()) {
// TODO: Needs much optimization, too many PM queries going on here.
if (user.getIdentifier() == ActivityManager.getCurrentUser()) {
// Only add Settings for this user.
getTilesForAction(context, user, SETTINGS_ACTION, cache, null, tiles, true);
getTilesForAction(context, user, OPERATOR_SETTINGS, cache,
OPERATOR_DEFAULT_CATEGORY, tiles, false);
getTilesForAction(context, user, MANUFACTURER_SETTINGS, cache,
MANUFACTURER_DEFAULT_CATEGORY, tiles, false);
}
if (setup) {
getTilesForAction(context, user, EXTRA_SETTINGS_ACTION, cache, null, tiles, false);
}
}
boolean isSupportBluetooth = "true".equals(SystemProperties.get("ro.rk.bt_enable"));
HashMap<String, DashboardCategory> categoryMap = new HashMap<>();
for (Tile tile : tiles) {
DashboardCategory category = categoryMap.get(tile.category);
if (category == null) {
category = createCategory(context, tile.category);
if (category == null) {
Log.w(LOG_TAG, "Couldn't find category " + tile.category);
continue;
}
categoryMap.put(category.key, category);
}
Intent tileIntent = tile.intent;
if(!isSupportBluetooth && tileIntent != null && tileIntent.toString().contains("com.android.settings/.Settings$BluetoothSettingsActivity"))
continue;
category.addTile(tile);
}
ArrayList<DashboardCategory> categories = new ArrayList<>(categoryMap.values());
for (DashboardCategory category : categories) {
Collections.sort(category.tiles, TILE_COMPARATOR);
}
Collections.sort(categories, CATEGORY_COMPARATOR);
if (DEBUG_TIMING) Log.d(LOG_TAG, "getCategories took "
+ (System.currentTimeMillis() - startTime) + " ms");
return categories;
}
可以通过getCategories()中的tile来获取到Component信息: tile.intent.getComponent()
通过对需要屏蔽的Component进行筛选,不走这个流程就可以完成对相关item的屏蔽操作。
暗码可以通过计算器中的onEquals或拨号器来获取到输入的指定字符串,通过SystemProperties可以进行控制,对Settings的隐藏和显示做管控。
分享到:
相关推荐
在Android操作系统中,Settings模块是用户与系统设置进行交互的核心组件。它包含了各种系统级别的配置选项,如Wi-Fi、蓝牙、屏幕亮度、日期与时间等。对于非英语国家和地区,Android支持多语言环境,以便为用户提供...
settings模块UI介绍
对于Android 4.2.2_r1版本的Settings模块源码分析,我们可以深入理解Android系统的内部工作原理,特别是用户界面和系统配置的管理。这篇分析将涵盖以下几个关键知识点: 1. **设置框架(Setting Framework)**: ...
"android 源码settings 导入eclipse"这个主题聚焦于如何将Android系统的Settings模块源码导入到Eclipse IDE中,以便进行学习和分析。下面我们将详细介绍这一过程,并探讨相关知识点。 1. **Android Settings模块**...
SettingsActivity 是 Settings 模块的核心组件,负责管理 Settings 模块的启动流程。我们来看一下 SettingsActivity 的 onCreate 方法,这是 Activity 的生命周期第一步。在这里,SettingsActivity 做了些什么?首先...
在Android系统中,"Settings"是用户界面的核心部分,它提供了对设备各种功能和设置的访问,如Wi-Fi、蓝牙...通过深入分析Settings模块,我们可以更好地理解Android系统的运行机制,并且能更有效地进行系统级应用开发。
4. **编译源码**:运行编译脚本,如`mm`或`mmm`命令,针对Settings模块进行编译。 5. **测试和调试**:编译完成后,可以在模拟器或真实设备上运行编译后的Settings应用,进行测试和调试。 总的来说,要成功编译...
在Android 4.0(Ice Cream Sandwich)系统中,`settings`模块是核心组件之一,它负责提供系统设置界面和管理各种系统级别的配置选项。这个模块的源代码深入揭示了Android如何处理用户对设备的各种个性化设定。让我们...
`django-extrasettings`正是为了解决这个问题而诞生的,它允许我们将settings模块分解为多个文件,从而提高代码的可读性和可维护性。 `django-extrasettings`的工作原理是通过一个元类(metaclass)来合并多个...
这个库将Pydantic的易用性和强类型验证功能引入到Django的settings模块,从而提高了代码的可读性、可维护性和安全性。 ### Pydantic简介 Pydantic是Paul Ross开发的一个Python库,用于从JSON或其他数据源解析和...
在本教程中,我们将深入探讨如何使用Qt QML和Settings模块来实现这一功能,特别是在Qt 5.15.2版本与Visual Studio 2019集成的环境下。 首先,让我们理解`Settings`类的作用。`QSettings`是Qt提供的一种方便的方式来...
为了在Eclipse中编辑和构建Settings模块,你需要将源代码复制到一个新的工作空间,比如/home/xxx/Settings。然后在Eclipse中通过File > New > Android Project,选择"Create project from existing source",指定...
这是一个环境变量,用于指示Python查找settings模块的路径。在开发环境中,通常不需要设置,因为当你在项目根目录下运行命令时,Python可以自动找到`settings.py`。但在生产环境中,特别是当你的项目部署在服务器上...
通过Settings模块、Sensitivity Analysis模块和Perforation Evaluation模块,计算不同射孔参数下的产能和表皮系数,以此评估参数的优劣。这个案例涉及的是一口顶部深度1900米、产层厚度8米、孔隙度30%的油井。分析...
1. **Settings模块中的数据业务设置**: - 在`SimManagement`类中,`mGprsSimSetting`是用于设置数据业务的偏好设置。在`onPreferenceChange`方法中,当`KEY_GPRS_SIM_SETTING`被改变时,会触发数据业务的切换。 -...
这里使用Django的settings模块来配置Celery,确保环境变量'DJANGO_SETTINGS_MODULE'已设置正确。 三、创建与执行任务 创建一个Celery任务非常简单,只需要定义一个装饰器函数即可。例如: ```python from celery ...
Android 5.0的`Settings`应用主要由多个模块组成,如`PreferenceManager`、`PreferenceFragment`和`PreferenceScreen`等,它们协同工作以展示和处理用户设置。这些模块通过XML资源文件定义设置项,并在Java代码中...
9. **模块化**:大型应用如Settings通常会遵循模块化设计,每个设置类别或功能作为一个单独的模块,这有助于代码的组织和复用。 10. **测试**:源码中包含了大量的JUnit和Espresso测试用例,用于确保设置功能的正确...
4. **src**下的子目录如`com.android.settings`、`com.android.settingslib`等,分别包含不同的功能模块,如网络设置、音量控制、隐私设置等。 5. **providers**:这部分涉及到ContentProvider,例如`...