Android 自定义跳转到系统 Settings Fragment 的 Intent

news2024/11/28 22:34:20

以跳转到蓝牙控制面板为例,控制面板如图所示:

其 Fragment 所在的位置是:

packages/apps/Settings/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java

第一步

要在 Settings的主要 Activity 中定义继承同一个父类的内部类,作为启动时承载BluetoothDashboardFragment 的 Activity:

packages/apps/Settings/src/com/android/settings/Settings.java

diff --git a/apps/Settings/src/com/android/settings/Settings.java b/apps/Settings/src/com/android/settings/Settings.java
index e94e647ff..959f6fbf8 100644
--- a/apps/Settings/src/com/android/settings/Settings.java
+++ b/apps/Settings/src/com/android/settings/Settings.java
@@ -230,6 +230,9 @@ public class Settings extends SettingsActivity {
     // Top level categories for new IA
     public static class NetworkDashboardActivity extends SettingsActivity {}
     public static class ConnectedDeviceDashboardActivity extends SettingsActivity {}
+    //Add by huanghoufu
+    public static class BluetoothDashboardActivity extends SettingsActivity {}
+    //end
     public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ }
     public static class AppAndNotificationDashboardActivity extends SettingsActivity {}
     public static class StorageDashboardActivity extends SettingsActivity {}

第二步

将BluetoothDashboardActivity添加到 SettingsBaseActivity 的自动更新Fragment列表中,代码逻辑如下:

packages/apps/Settings/src/com/android/settings/SettingsActivity.java

(1) 更新方法及关键注释

    private void updateTilesList() {
        // Generally the items that are will be changing from these updates will
        // not be in the top list of tiles, so run it in the background and the
        // SettingsBaseActivity will pick up on the updates automatically.
        AsyncTask.execute(() -> doUpdateTilesList());
    }

(2)添加位置

diff --git a/apps/Settings/src/com/android/settings/SettingsActivity.java b/apps/Settings/src/com/android/settings/SettingsActivity.java
index 76739f049..ccd7051fd 100644
--- a/apps/Settings/src/com/android/settings/SettingsActivity.java
+++ b/apps/Settings/src/com/android/settings/SettingsActivity.java
@@ -627,6 +627,14 @@ public class SettingsActivity extends SettingsBaseActivity
private void doUpdateTilesList() {
 ……
+       //Add by huanghoufu
+        somethingChanged = setTileEnabled(changedList,
+                new ComponentName(packageName,
+                        Settings.BluetoothDashboardActivity.class.getName()),
+                !UserManager.isDeviceInDemoMode(this) /* enabled */,
+                isAdmin) || somethingChanged;
+       //end
+
         somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
                         Settings.PowerUsageSummaryActivity.class.getName()),
                 mBatteryPresent, isAdmin) || somethingChanged;

第三步

为了安全考虑,在切换Fragment时,程序会检查将要切换 Fragment 是否在可显示列表中:

packages/apps/Settings/src/com/android/settings/SettingsActivity.java

    /**
     * Switch to a specific Fragment with taking care of validation, Title and BackStack
     */
    private Fragment switchToFragment(String fragmentName, Bundle args, boolean validate,
            int titleResId, CharSequence title) {
        Log.d(LOG_TAG, "Switching to fragment " + fragmentName);
        if (validate && !isValidFragment(fragmentName)) {
            throw new IllegalArgumentException("Invalid fragment for this activity: "
                    + fragmentName);
        }
        Fragment f = Utils.getTargetFragment(this, fragmentName, args);
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.main_content, f);
        if (titleResId > 0) {
            transaction.setBreadCrumbTitle(titleResId);
        } else if (title != null) {
            transaction.setBreadCrumbTitle(title);
        }
        transaction.commitAllowingStateLoss();
        getSupportFragmentManager().executePendingTransactions();
        Log.d(LOG_TAG, "Executed frag manager pendingTransactions");
        return f;
    }

如果将要切换的 Fragment 不在显示列表中,则会抛出“Invalid fragment for this activity……”的异常,例如:

07-26 17:15:36.574  2151  2151 D SettingsActivity: Starting onCreate
07-26 17:15:36.632  2151  2151 D SettingsActivity: Starting to set activity title
07-26 17:15:36.633  2151  2151 D SettingsActivity: Done setting title
07-26 17:15:36.633  2151  2151 D SettingsActivity: Switching to fragment com.android.settings.connecteddevice.BluetoothDashboardFragment
07-26 17:15:36.669  2151  2151 D AndroidRuntime: Shutting down VM
07-26 17:15:36.670  2151  2151 E AndroidRuntime: FATAL EXCEPTION: main
07-26 17:15:36.670  2151  2151 E AndroidRuntime: Process: com.android.settings, PID: 2151
07-26 17:15:36.670  2151  2151 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.Settings$BluetoothDashboardActivity}: java.lang.IllegalArgumentException: Invalid fragment for this activity: com.android.settings.connecteddevice.BluetoothDashboardFragment
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3431)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:223)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7664)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Invalid fragment for this activity: com.android.settings.connecteddevice.BluetoothDashboardFragment
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at com.android.settings.SettingsActivity.switchToFragment(SettingsActivity.java:577)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at com.android.settings.SettingsActivity.launchSettingFragment(SettingsActivity.java:377)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at com.android.settings.SettingsActivity.onCreate(SettingsActivity.java:285)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:8053)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:8037)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3404)
07-26 17:15:36.670  2151  2151 E AndroidRuntime: 	... 11 more

因此,需要在可显示名单中添加相应Fragment:

diff --git a/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java b/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java
index 77adbf040..76804a99b 100644
--- a/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -63,6 +63,7 @@ import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
 import com.android.settings.bugreporthandler.BugReportHandlerPicker;
 import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
+import com.android.settings.connecteddevice.BluetoothDashboardFragment;
 import com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment;
 import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
 import com.android.settings.datausage.DataSaverSummary;
@@ -313,7 +314,10 @@ public class SettingsGateway {
    /**
     * A list of fragment that can be hosted by SettingsActivity. SettingsActivity will throw a
     * security exception if the fragment it needs to display is not in this list.
     */
    public static final String[] ENTRY_FRAGMENTS = {
             GestureNavigationSettingsFragment.class.getName(),
             InteractAcrossProfilesSettings.class.getName(),
             InteractAcrossProfilesDetails.class.getName(),
-            MediaControlsSettings.class.getName()
+            MediaControlsSettings.class.getName(),
+           //Add by huanghoufu
+            BluetoothDashboardFragment.class.getName()
+           //end
     };
 
     public static final String[] SETTINGS_FOR_RESTRICTED = {
@@ -356,5 +360,8 @@ public class SettingsGateway {
             UserBackupSettingsActivity.class.getName(),
             // Home page > Display
             Settings.HdmiSettingsActivity.class.getName(),
+           //Add by huanghoufu
+            Settings.BluetoothDashboardActivity.class.getName()
+           //end
     };
 }

第四步

为 Fragment 在清单文件中添加隐试启动的意图即可:

注意,这里用于启动的自定义 action 是 android.settings.BLUETOOTH_DASHBOARD

diff --git a/apps/Settings/AndroidManifest.xml b/apps/Settings/AndroidManifest.xml
index e74734b98..faa34330e 100644
--- a/apps/Settings/AndroidManifest.xml
+++ b/apps/Settings/AndroidManifest.xml
@@ -233,6 +231,21 @@
                 android:value="true" />
         </activity>
 
+       <!-- Add by huanghoufu -->
+       <activity
+            android:name=".Settings$BluetoothDashboardActivity">
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.BLUETOOTH_DASHBOARD" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.connecteddevice.BluetoothDashboardFragment"/>
+           <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                android:value="true" />
+       </activity>
+       <!-- end -->
+
+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信波段王指标公式_通达信公式

使用说明&#xff1a;1、买点&#xff1a;多空分界线变红后出现波段买为做多信号&#xff0c;中间出现波段卖信号为杂波可以不考虑&#xff0c;再结合逃顶信号进行卖出操作&#xff0c;如果没有出现逃顶信号&#xff0c;则可以等多空分界线变绿后结合波段卖信号综合做出判断。2…

基于proteus的纯模拟病房呼叫系统

摘要&#xff1a;无线的病房呼叫系统将病人的呼叫请求迅速传递给医护者&#xff0c;减少了信息传递的过程性&#xff0c;病人无需等待医护巡查才可求助&#xff0c;增加了便捷性与即时性&#xff1b;此外也减轻一定的工作量&#xff0c;加强服务的效率。本文基于proteus软件进行…

selenium 启动常用浏览器驱动方式

一.启动 Chrome 浏览器 方式一&#xff1a; // 驱动路径的 File File file new File("src/main/resources/drivers/chromedriver-win32.exe"); // 设置系统属性&#xff0c;setProperty() 中两个参数分别是驱动名和 file 绝对路径 System.setProperty("webdr…

如何在Mkdocs里自定义字体(霞鹜文楷)

网站目前在用的字体&#xff1a;霞鹜文楷 想必你可以直观的从我的网站&#xff0c;感受到这款字体的美观程度。 以下是摘录的部分字体官方介绍文档 注意事项 添字请在 Issue #33 反馈&#xff0c;字形调整请在 Issue #14 反馈&#xff0c;不要另开议题&#xff0c;以便于整理。…

SpringBoot——持久化技术

简单介绍 在之前我们使用的数据层持久化技术使用的是MyBatis或者是MyBatis-plus&#xff0c;其实都是一样的。在使用之前&#xff0c;我们要导入对应的坐标&#xff0c;然后配置MyBatis特有的配置&#xff0c;比如说Mapper接口&#xff0c;或者XML配置文件&#xff0c;那么除了…

为什么pmp证书只能对标cspm二级证书??

CSPM 认证是新出台的证书&#xff0c;9月才开始第一次考试&#xff0c;前期肯定不会太难的&#xff0c;而 CSPM 有五个等级&#xff0c;综合下来 PMP 对标的是PMP是CSPM-2 级&#xff0c;难度差不多&#xff0c;PgMP对标的是CSPM-3。 CSPM 能力等级划分为五个等级&#xff0c;从…

得物词分发平台技术架构建设与演进

前言 在文章开始前先介绍下导购&#xff0c;导购通常是指帮助消费者在购物过程中做出最佳决策的人或系统。在电商网站中&#xff0c;导购可以引导用户关注热卖商品或促销活动等&#xff0c;帮助用户更好地进行购物。导购的目的是为了提高用户的购物体验&#xff0c;促进销售额…

通过认识在职研究生深入了解人大与加拿大女王大学中外合作办学金融硕士

随着社会经济的不断发展&#xff0c;职场竞争也愈发激烈、工作要求不断提高&#xff0c;许多从业人员既不想放弃工作&#xff0c;又想读研提升专业能力&#xff0c;深化对专业知识的理解&#xff0c;获取优质的证书。那么报考在职研究生就是一个非常不错的方式。若你选择人大与…

echarts图表如何自定义鼠标悬浮样式

样式调整 // formatter: {a}: {b}<br />{c}: {d}: {e} formatter: function (params) {// <i style"display:inline-block;border-radius:50%;width:4px;height:4px;background-color: #0ECB81;"></i>// ${console.log(params[0])}return <d…

Java版知识付费源码 Spring Cloud+Spring Boot 前后端分离实现知识付费平台

提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发…

SSL 证书过期巡检脚本

哈喽大家好&#xff0c;我是咸鱼 我们知道 SSL 证书是会过期的&#xff0c;一旦过期之后需要重新申请。如果没有及时更换证书的话&#xff0c;就有可能导致网站出问题&#xff0c;给公司业务带来一定的影响 所以说我们要每隔一定时间去检查网站上的 SSL 证书是否过期 如果公…

openlayers根据下拉框选项在地图上显示图标

这里是关于一个根据下拉框的选项在地图上显示图标的需求&#xff0c;用的是vueopenlayers 显示效果大概是这样&#xff1a; 选中选项之后会跳转到所点击的城市&#xff0c;并且在地图上显示图标温度&#xff0c;这一块UI没设计我就大概先弄了一下&#xff0c;比较丑。。 首先…

【JAVA】 String 方法附件

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 String 方法 String 方法 char charAt(int index)返回指定索引处的 char 值。int compareTo(Object o) 把这个字符串和另一个对象比较。 int compareTo(String anotherString)按…

如何才能做Cox呢?今天带来Cox回归分析步骤详解

Cox回归是生存分析中运用最多的一个模型&#xff0c;又称为比例风险回归模型(proportional hazards model)。是由英国统计学家D.R.Cox在1962年提出的&#xff0c;为了表示对他的尊敬&#xff0c;所以大家以他的名字命名这个模型。这是一种半参数回归模型&#xff0c;以结局和生…

linux | vscode | makefile | c++编译和调试

简单介绍环境&#xff1a; vscode 、centos、 gcc、g、makefile 简单来说就是&#xff0c;写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程&#xff0c;以及官网也看了很多次&#xff0c;最…

Kakfa 入门到起飞 - Kafka 遭大家诟病了?因为啥?啥是再平衡?

Kafka 遭大家诟病了&#xff1f;因为啥&#xff1f;啥是再平衡&#xff1f; 再均衡是Kafka被大家诟病最多的一个点&#xff0c;再平衡是非常麻烦的一个事&#xff0c;那么就让我们来看看 到底什么是再平衡呢&#xff1f; 再平衡其实就是一个 协议&#xff0c;它规定了消费者…

0成本搭建自己的云数据库

第一步&#xff0c;租免费的云服务器 www.aliyun.com 阿里云的&#xff0c;可以免费租三个月 进入主页后选择云服务器ESC 选择这款&#xff0c;点击试用就行 第二步&#xff0c;配置服务器 在配置服务器系统的时候选择centos&#xff0c;省事&#xff0c;别选ubuntu&#x…

Windows 不同方式打开的cmd/dos窗口属性配置不同

文章目录 1. 默认值&#xff08;控制台窗口&#xff09;属性2. "C:\Windows\System32\cmd.exe" 属性3. "命令提示符"属性4. 自定义某标题cmd窗口属性5. cmd快捷方式的属性总结 最近在写某个批处理脚本时&#xff0c;意外发现 Windows系统中&#xff0c;在不…

Is Mapping Necessary for Realistic PointGoal Navigation 论文阅读和代码分析

论文 论文信息 题目&#xff1a;Is Mapping Necessary for Realistic PointGoal Navigation? 作者&#xff1a;Ruslan Partsey、 Erik Wijmans 代码地址&#xff1a;rpartsey.github.io/pointgoalnav 来源&#xff1a;CVPR Abstract 目标&#xff1a;证明显式地图不是成功…

工信部、国家标准委联合印发《国家车联网产业指南(2023 版)》

国家工信部和标委发布了最新的《国家车联网产业标准体系建设指南&#xff08;智能网联汽车&#xff09;&#xff08;2023 版&#xff09;》&#xff0c;了解这篇文章&#xff0c;不论您是智能网联汽车的追随者&#xff0c;还是对智能网联汽车产业前景感兴趣的人&#xff0c;都非…