`
永远吃不饱
  • 浏览: 10106 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Settings模块

阅读更多
需求:对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的隐藏和显示做管控。
分享到:
评论

相关推荐

    缅甸语字串_Settings模块

    在Android操作系统中,Settings模块是用户与系统设置进行交互的核心组件。它包含了各种系统级别的配置选项,如Wi-Fi、蓝牙、屏幕亮度、日期与时间等。对于非英语国家和地区,Android支持多语言环境,以便为用户提供...

    androidN settings模块

    settings模块UI介绍

    Android4.2 Settings 系统设置模块源码

    对于Android 4.2.2_r1版本的Settings模块源码分析,我们可以深入理解Android系统的内部工作原理,特别是用户界面和系统配置的管理。这篇分析将涵盖以下几个关键知识点: 1. **设置框架(Setting Framework)**: ...

    android 源码settings 导入eclipse

    "android 源码settings 导入eclipse"这个主题聚焦于如何将Android系统的Settings模块源码导入到Eclipse IDE中,以便进行学习和分析。下面我们将详细介绍这一过程,并探讨相关知识点。 1. **Android Settings模块**...

    android L Setting模块分析1

    SettingsActivity 是 Settings 模块的核心组件,负责管理 Settings 模块的启动流程。我们来看一下 SettingsActivity 的 onCreate 方法,这是 Activity 的生命周期第一步。在这里,SettingsActivity 做了些什么?首先...

    Settings代码

    在Android系统中,"Settings"是用户界面的核心部分,它提供了对设备各种功能和设置的访问,如Wi-Fi、蓝牙...通过深入分析Settings模块,我们可以更好地理解Android系统的运行机制,并且能更有效地进行系统级应用开发。

    android4.4.2 settings源码本地编译所需要的包

    4. **编译源码**:运行编译脚本,如`mm`或`mmm`命令,针对Settings模块进行编译。 5. **测试和调试**:编译完成后,可以在模拟器或真实设备上运行编译后的Settings应用,进行测试和调试。 总的来说,要成功编译...

    android4.0 settings 设置 模块 源代码

    在Android 4.0(Ice Cream Sandwich)系统中,`settings`模块是核心组件之一,它负责提供系统设置界面和管理各种系统级别的配置选项。这个模块的源代码深入揭示了Android如何处理用户对设备的各种个性化设定。让我们...

    Python库 | django-extrasettings-0.1.tar.gz

    `django-extrasettings`正是为了解决这个问题而诞生的,它允许我们将settings模块分解为多个文件,从而提高代码的可读性和可维护性。 `django-extrasettings`的工作原理是通过一个元类(metaclass)来合并多个...

    Python库 | django_pydantic_settings-0.3.0-py3-none-any.whl

    这个库将Pydantic的易用性和强类型验证功能引入到Django的settings模块,从而提高了代码的可读性、可维护性和安全性。 ### Pydantic简介 Pydantic是Paul Ross开发的一个Python库,用于从JSON或其他数据源解析和...

    Qt Qml Setings方式保存窗口位置和大小 记录后下次启动再次使用

    在本教程中,我们将深入探讨如何使用Qt QML和Settings模块来实现这一功能,特别是在Qt 5.15.2版本与Visual Studio 2019集成的环境下。 首先,让我们理解`Settings`类的作用。`QSettings`是Qt提供的一种方便的方式来...

    ubuntu11.10(64位)虚拟linux系统下 ---修改编译android工程

    为了在Eclipse中编辑和构建Settings模块,你需要将源代码复制到一个新的工作空间,比如/home/xxx/Settings。然后在Eclipse中通过File &gt; New &gt; Android Project,选择"Create project from existing source",指定...

    django中的setting最佳配置小结

    这是一个环境变量,用于指示Python查找settings模块的路径。在开发环境中,通常不需要设置,因为当你在项目根目录下运行命令时,Python可以自动找到`settings.py`。但在生产环境中,特别是当你的项目部署在服务器上...

    PERF-OPT案例分析.ppt

    通过Settings模块、Sensitivity Analysis模块和Perforation Evaluation模块,计算不同射孔参数下的产能和表皮系数,以此评估参数的优劣。这个案例涉及的是一口顶部深度1900米、产层厚度8米、孔隙度30%的油井。分析...

    Android 中关于数据业务常开,不让关闭的一些处理

    1. **Settings模块中的数据业务设置**: - 在`SimManagement`类中,`mGprsSimSetting`是用于设置数据业务的偏好设置。在`onPreferenceChange`方法中,当`KEY_GPRS_SIM_SETTING`被改变时,会触发数据业务的切换。 -...

    celery_task.rar

    这里使用Django的settings模块来配置Celery,确保环境变量'DJANGO_SETTINGS_MODULE'已设置正确。 三、创建与执行任务 创建一个Celery任务非常简单,只需要定义一个装饰器函数即可。例如: ```python from celery ...

    android 5.0 Settings源码

    Android 5.0的`Settings`应用主要由多个模块组成,如`PreferenceManager`、`PreferenceFragment`和`PreferenceScreen`等,它们协同工作以展示和处理用户设置。这些模块通过XML资源文件定义设置项,并在Java代码中...

    Android 8.1 Settings 源码下载

    9. **模块化**:大型应用如Settings通常会遵循模块化设计,每个设置类别或功能作为一个单独的模块,这有助于代码的组织和复用。 10. **测试**:源码中包含了大量的JUnit和Espresso测试用例,用于确保设置功能的正确...

    Android5.0 Settings源码

    4. **src**下的子目录如`com.android.settings`、`com.android.settingslib`等,分别包含不同的功能模块,如网络设置、音量控制、隐私设置等。 5. **providers**:这部分涉及到ContentProvider,例如`...

Global site tag (gtag.js) - Google Analytics