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

news/2024/5/14 20:06:11/文章来源:https://blog.csdn.net/jppipai/article/details/131944831

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

其 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 IApublic static class NetworkDashboardActivity extends SettingsActivity {}public static class ConnectedDeviceDashboardActivity extends SettingsActivity {}
+    //Add by huanghoufu
+    public static class BluetoothDashboardActivity extends SettingsActivity {}
+    //endpublic 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 > DisplaySettings.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.luyixian.cn/news_show_335719.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch学习——线性神经网络——1线性回归

概要&#xff1a;线性神经网络是一种最简单的神经网络模型&#xff0c;它由若干个线性变换和非线性变换组成。线性变换通常表示为矩阵乘法&#xff0c;非线性变换通常是一个逐元素的非线性函数。线性神经网络通常用于解决回归和分类问题。 一.线性回归 线性回归是一种常见的机…

Linux_CentOS_7.9部署Docker以及镜像加速配置等实操验证全过程手册

前言&#xff1a;实操之前大家应该熟悉一个新的名词DevOps 俗称开发即运维、新一代开发工程师&#xff08;Development和Operations的组合词&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&…

【Linux后端服务器开发】IP协议

目录 一、IP协议概述 二、协议头格式 三、网段划分 四、IP地址的数量限制 五、路由 一、IP协议概述 主机&#xff1a;配有IP地址&#xff0c;但是不进行路由控制的设备 路由器&#xff1a;即配有IP地址&#xff0c;又能进行路由控制 节点&#xff1a;主机和路由器的总称…

利用读时建模等数据分析能力,实现网络安全态势感知的落地

摘要&#xff1a;本文提出一种基于鸿鹄数据平台的网络安全态势感知系统&#xff0c;系统借助鸿鹄数据平台读时建模、时序处理、数据搜索等高效灵活的超大数据存储和分析处理能力&#xff0c;支持海量大数据存储、分类、统计到数据分析、关联、预测、判断的网络安全态势感知能力…

WEB:file_include

背景知识 php伪协议 文件包含漏洞 php包含漏洞函数 题目 由题目可知这个是文件包含的题目&#xff0c;先用常用的协议先查看一下 payload ?filenamephp://filter/readconvert.base64-encode/resourceflag.php 出现了 发现filter&#xff0c;base64被过滤了 尝试其他协议 …

Docker 基础知识解析:容器与虚拟化的区别与优势

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Linux实训笔记~操作系统概述

1、操作系统 操作系统作为接口的示意图: 没有安装操作系统的计算机, 通常被称为裸机。 2、不同应用利于的主流操作系统 桌面操作系统 服务器操作系统 嵌入式操作系统 移动设备操作系统

Emacs之改造最快文本搜索工具ripgrep(一百一十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Neo4j 集群和负载均衡

Neo4j 集群和负载均衡 Neo4j是当前最流行的开源图DB。刚好读到了Neo4j的集群和负载均衡策略&#xff0c;记录一下。 1 集群 Neo4j 集群使用主从复制实现高可用性和水平读扩展。 1.1 复制 集群的写入都通过主节点协调完成的&#xff0c;数据先写入主机&#xff0c;再同步到…

springMVC--异常处理

文章目录 springMVC--异常处理基本介绍局部异常应用实例演示局部异常处理机制代码实现测试(页面方式) 全局异常应用实例应用实例需求代码实现完成测试(页面方式) 自定义异常应用实例应用实例需求应用实例-代码实现完成测试 全局异常处理---SimpleMappingExceptionResolver基本说…

Java-逻辑控制

目录 一、顺序结构 二、分支结构 1.if语句 2.swich语句 三、循环结构 1.while循环 2.break 3.continue 4.for循环 5.do while循环 四、输入输出 1.输出到控制台 2.从键盘输入 一、顺序结构 按照代码的书写结构一行一行执行。 System.out.println("aaa"); …

Docker容器命令(有点详细)

文章目录 Docker 容器容器运行背后启停命令run交互模式需不需要接/bin/bash createexecattachpstoplogscprmcommitexportimportsystem对比export、saveimport、loadcommit、exportimport Docker 容器 Docker 容器是 Docker 平台中的一个基本概念&#xff0c;它是 Docker 技术的…

在centos 7系统docker上构建mysql 5.7

一、VM上已经安装centos 7.9&#xff0c;且已完成docker的构建 二、安装mysql5.7 安装镜像&#xff1a;[rootlocalhost lll]# docker pull mysql:5.7 查看镜像[rootlocalhost lll]# docker images 根据镜像id构建mysql容器&#xff0c;且分配端口号[rootlocalhost lll]# dock…

FileHub使用教程:Github Token获取步骤,使用快人一步

FileHub介绍 filehub是我开发的一个免费文件存储软件&#xff0c;可存万物。软件仓库&#xff1a;GitHub - Sjj1024/s-hub: 一个使用github作为资源存储的软件 软件下载地址&#xff1a;。有问题可以留言或者提Issue&#xff0c; 使用第一步&#xff1a;获取Github Token 使…

【华为】新版模拟器eNSP Lite安装攻略提前解锁

新版模拟器eNSP Lite资源下载&#xff1a;华为新版模拟器eNSPLite镜像资源资源-CSDN文库 最近华为发布了新版模拟器eNSP Lite的产品手册&#xff0c;根据产品手册描述&#xff0c;新版模拟器eNSP Lite基于云端发布&#xff0c;所以安装和登录新版模拟器eNSP Lite的方式和目前版…

力扣热门100题之合并区间【中等】

题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;interv…

C++语法(26)--- 特殊类设计

C语法&#xff08;25&#xff09;--- 异常与智能指针_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131537799?spm1001.2014.3001.5501 目录 1.特殊类设计 1.设计一个类&#xff0c;不能被拷贝 C98 C11 2.设计一个类&#xff0c;只能在堆上…

Windows数据类型LPSTR学习

Windows在C语言的基础之上又定义了一些Windows下的数据类型&#xff1b;下面学习一下LPSTR&#xff1b; LPSTR和LPWSTR是Win32和VC所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针&#xff0c;而LPWSTR是一个指向以NULL结尾的64…

vue项目开发环境和生产环境代理的配置问题

1.跨域 跨域解决方案&#xff1a; 1.JSONP 通过动态 script标签跨域 2.document.domain iframe跨域 3.location.hash iframe 4.window.name iframe跨域 5.postMessage 跨 window 通信 6.跨域资源共享&#xff08;CORS&#xff09; 7.nginx代理跨域 8.nodejs中间件代理跨域 9…

E2E工程问题:小周期转大周期Gateway

摘要&#xff1a; 本文讨论一个具体的工程问题&#xff0c;E2E报文对应的信号&#xff0c;由小周期转大周期导致的E2E校验失败问题。 工程中&#xff0c;网关节点很重要的一个功能就是路由。当然&#xff0c;E2E&#xff08;End to End&#xff09;报文也可路由&#xff0c;但…