Android修改分析:删除设置中菜单
设置中的菜单主要分为两种添加方式:
``
1.静态加载
所谓自主添加,就是通过xml文件,自主通过添加布局到Fragment、Activity等加载到设置菜单中。一般每个自主添加菜单都拥有一个Controller。主要分为以下两种情况处理:
1.拥有Conroller
@Override
public boolean isAvailable() {
return false;
} // 通过继承类往上查找,发现实际上去除布局的方式仍然是调用了removePreference函数来删除控件
2.没有Controller
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle)
final PreferenceScreen screen = getPreferenceScreen();
Preference backupPref = screen.findPreference("backup_settings");
screen.removePreference(backupPref);
}
2.动态加载
所谓动态加载,就是说菜单不是通过xml文件自主定义添加的内容,而是通过Category来动态加载布置在各个应用下的菜单页面。
vendor
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/notification/SoundSettings.java
public class SoundSettings extends DashboardFragment implements OnActivityResultListener {
private static final String TAG = "SoundSettings";
......
}
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/dashboard/DashboardFragment.java
@VisibleForTesting
void refreshDashboardTiles(final String TAG) {
final PreferenceScreen screen = getPreferenceScreen();
final DashboardCategory category =
mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
if (category == null) {
Log.d(TAG, "NO dashboard tiles for " + TAG);
return;
}
final ListTile tiles = category.getTiles();
if (tiles == null) {
Log.d(TAG, "tile list is empty, skipping category " + category.key);
return;
}
// Create a list to track which tiles are to be removed.
final ListString remove = new ArrayList(mDashboardTilePrefKeys);
// There are dashboard tiles, so we need to install SummaryLoader.
if (mSummaryLoader != null) {
mSummaryLoader.release();
}
final Context context = getContext();
mSummaryLoader = new SummaryLoader(getActivity(), getCategoryKey());
mSummaryLoader.setSummaryConsumer(this);
// Install dashboard tiles.
final boolean forceRoundedIcons = shouldForceRoundedIcon();
for (Tile tile : tiles) {
final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
if (TextUtils.isEmpty(key)) {
Log.d(TAG, "tile does not contain a key, skipping " + tile);
continue;
}
if (!displayTile(tile)) {
continue;
}
if (mDashboardTilePrefKeys.contains(key)) {
// Have the key already, will rebind.
final Preference preference = screen.findPreference(key);
mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), forceRoundedIcons,
getMetricsCategory(), preference, tile, key,
mPlaceholderPreferenceController.getOrder());
} else {
// Don't have this key, add it.
final Preference pref = new Preference(getPrefContext());
mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), forceRoundedIcons,
getMetricsCategory(), pref, tile, key,
mPlaceholderPreferenceController.getOrder());
screen.addPreference(pref);
mDashboardTilePrefKeys.add(key);
}
remove.remove(key);
}
// Finally remove tiles that are gone.
for (String key : remove) {
mDashboardTilePrefKeys.remove(key);
final Preference preference = screen.findPreference(key);
if (preference != null) {
screen.removePreference(preference);
}
}
mSummaryLoader.setListening(true);
}
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
PARENT_TO_CATEGORY_KEY_MAP.put(AppAndNotificationDashboardFragment.class.getName(),
CategoryKey.CATEGORY_APPS);
PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(),
CategoryKey.CATEGORY_BATTERY);
PARENT_TO_CATEGORY_KEY_MAP.put(DisplaySettings.class.getName(),
CategoryKey.CATEGORY_DISPLAY);
PARENT_TO_CATEGORY_KEY_MAP.put(SoundSettings.class.getName(),
CategoryKey.CATEGORY_SOUND);
PARENT_TO_CATEGORY_KEY_MAP.put(StorageDashboardFragment.class.getName(),
CategoryKey.CATEGORY_STORAGE);
PARENT_TO_CATEGORY_KEY_MAP.put(SecuritySettings.class.getName(),
CategoryKey.CATEGORY_SECURITY);
PARENT_TO_CATEGORY_KEY_MAP.put(AccountDetailDashboardFragment.class.getName(),
CategoryKey.CATEGORY_ACCOUNT_DETAIL);
PARENT_TO_CATEGORY_KEY_MAP.put(AccountDashboardFragment.class.getName(),
CategoryKey.CATEGORY_ACCOUNT);
frameworks
frameworks/base/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
public static final String CATEGORY_STORAGE = "com.android.settings.category.ia.storage";
public static final String CATEGORY_SECURITY = "com.android.settings.category.ia.security";
packages
packages/apps/Car/Settings/res/xml/sound_settings_fragment.xml
com.android.car.settings.common.LogicalPreferenceGroup
android:key="@string/pk_sounds_extra_settings"
settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController"
intent android:action="com.android.settings.action.EXTRA_SETTINGS"
extra android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.sound"/
/intent
Android修改分析:删除设置中菜单 相关文章
持续集成CI入门篇(二)
WAR包 一丶修改.gitlab-ci.yml stages: - testtest: stage: test script: - echo 执行打包命令 - /usr/local/maven/apache-maven-3.6.3/bin/mvn package - echo 复制到docker目录 - cp target/TestCICD-1.0-SNAPSHOT.war docker/TestCICD.war - echo 停止服
使用 Android 的日志工具 Log
?Log简介 Android中的日志工具类是Log,这个类中提供了5个方法来供我们打印日志: 1. $Log.v()$ 用于打印那些最为琐碎的,意义最小的日志信息 对应级别 verbose,是 Android 日志里面级别最低的一种 2. $Log.d()$ 用于打印一些调试信息,这些信息对你调试程
Android Studio详解项目中的资源
?目录结构 ?作用 所有以 drawable 开头的文件都是用来放图片的; 所有以 mipmap 开头的文件都是用来放应用图标的; 所有以 value 开头的文件夹都是用来放字符串、样式、颜色等配置的; layout 文件夹用来放布局文件; 之所以有这么多 mipmap 开头的文件夹,
Android java层常见加密算法的hook自吐以及栈信息的打印
杂谈:其实原理并没有很难,本质就是hook Android的框架层中的api将我们想要的key和iv(也可以没有,就打个比方),但是目前的话,很多厂家已经不在直接调用java层的这些加密算法的api了, 很多都是使用自己实现的加密算法,要么就是放在so里面,要么就是java
CBlock类的GetHash函数分析
GetHash声明 src\primitives\block.h uint256 GetHash() const; GetHash定义 调用SerializeHash函数 *this指向CBlock对象 src\primitives\block.cpp uint256 CBlockHeader::GetHash() const{ return SerializeHash(*this);} SerializeHash函数 计算obj对象的
Linux 修改 ELF 解决 glibc 兼容性问题
Linux glibc 问题 相信有不少 Linux 用户都碰到过运行第三方(非系统自带软件源)发布的程序时的 glibc 兼容性问题,这一般是由于当前 Linux 系统上的 GNU C 库(glibc)版本比较老导致的,例如我在 CentOS 6 64 位系统上运行某第三方闭源软件时会报: [root
redis6.0.5之zset阅读笔记2--跳跃列表(zshiplist)之论文翻译2算法分析(这部分读的有点辛苦)
ANALYSIS OF SKIP LIST ALGORITHMS 跳跃链表的算法分析The time required to execute the Search, Delete and Insert operations is dominated by the time required to search for the appropriate element.For the Insert and Delete operations,there is
Apply Changes 在 Android 11 中的增强特性
简介 Apply Changes 是 Android Studio 中的一项功能,我们在 Android Studio 3.5 中引入了这项功能,以帮助开发者快速迭代您对应用所做的更改。Apply Changes 通过 JVMTI API 来判断是否可以使用此方式进行变更。在 Android 11 上,ART (Android 运行时) 扩
NB-IoT应用分类与技术特点分析
NB-Iot作为一种窄带物联网技术在各大行业脱颖而出,其应用涵盖多个领域。此文计讯小编将讲解NB-IoT的主要应用分类及相关特点。??一、NB-IoT是什么??NB-IoT是指窄带物联网(Narrow Band -Internet of Things)技术。NB-IOT聚焦于低功耗广覆盖(LPWA)物联网(IoT)
android studio 自带的LoginActivity 添加登陆
新手入门,想看看AS自带的DEMO怎么写的,于是在AS中新建工程时选择了LoginActivity。关于LoginActivity的分析,网上可以找到。直接上我改过的代码。 package com.example.myapplication.data;import android.util.Log;import com.example.myapplication.data