【免费下载链接】InxLockerXposed-based Installer Locker for Android (Powered by YukiHookAPI)项目地址https://gitcode.com/gh_mirrors/in/InxLocker点击查看免费下载如果你正在学习Jetpack Compose想找一个真实、完整的设置界面案例InxLocker 是很好的起点。这是一个基于 Xposed 的 Android 安装器锁定模块Installer Locker它的整个设置界面用Jetpack Compose Material 3构建包含状态卡片、开关分组和一个完整的安装器选择列表。下面带你拆解它的主题配置、卡片式布局与底部选择列表的实现思路新手照着学即可上手。InxLocker 是什么一个 Xposed 安装器锁定模块 InxLocker 的核心功能是拦截并转发Android 系统的应用安装与卸载请求将其重定向到你指定的安装器 App。主要能力包括安装重定向拦截 APK 安装请求自动调起你选择的安装器卸载重定向将卸载请求交给指定的卸载器处理会话安装拦截Session Install拦截 Android 11 的CONFIRM_INSTALL强制组件调用长按列表项锁定特定 Activity 组件解决部分应用硬编码安装器的问题隐藏桌面图标、调试日志开关等辅助功能对普通用户来说它特别适合深度定制系统的设备对开发者来说它更是一个纯 Compose 单 Activity 设置页的教科书级范例——没有 XML 布局全部界面由声明式代码生成。技术栈一览Compose BOM 与 Material 3 依赖InxLocker 使用 Version Catalog 统一管理版本核心依赖定义在 gradle/libs.versions.tomlactivityCompose 1.13.0提供setContent桥接composeBom 2026.03.01Compose BOM 统一管理 UI、Foundation、Animation 版本material3Material 3 组件库Card、Switch、ModalBottomSheet 等模块启用方式非常简洁在 app/build.gradle.kts 中应用kotlin-compose插件并开启buildFeatures { compose true }见 第55-58行。依赖则通过 BOM 平台引入第72-76行implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.material3) 新手提示用 BOM 管理 Compose 版本可以避免ui、foundation、material3版本不一致导致的诡异编译错误。Material 3 主题配置动态取色 明暗双套色板 主题是整个界面的底色InxLocker 的主题封装在 Theme.ktval colorScheme when { dynamicColor Build.VERSION.SDK_INT Build.VERSION_CODES.S - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) darkTheme - DarkColorScheme else - LightColorScheme }三层降级策略很值得借鉴Android 12且开启动态取色时使用壁纸主题色Material You否则按系统明暗切换使用 Color.kt 中定义的两套紫色系色板Purple40/Purple80等字体样式集中在 Type.kt只覆盖了bodyLarge16sp、行高 24sp其余沿用 Material 3 默认排版入口在 MainActivity.kt 的onCreate中enableEdgeToEdge()setContent { InxLockerTheme { MainScreen() } }两行代码完成从 Activity 到 Compose 世界的切换。设置页骨架Scaffold LazyColumn 卡片式布局MainScreen 的整体结构是一个Scaffold包裹LazyColumn每个功能区块都是一个独立itemLazyColumn( contentPadding PaddingValues(16.dp), verticalArrangement Arrangement.spacedBy(16.dp) ) { item { ModuleStatusCard() } // 模块状态卡片 item { SettingsGroup(...) } // 默认安装器设置 item { /* 开关分组卡片 */ } item { InstructionCard() } // 使用说明卡片 }这种卡片堆叠 16dp 间距的布局是 Material 3 设置页的经典范式比传统 ListView 的密集列表观感更轻盈。几个细节值得注意状态卡片ModuleStatusCard 会读取模块激活状态激活时卡片背景用primaryContainer30% 透明度未激活则切换为errorContainer配 Warning 图标用颜色直接传达是否生效卡片统一设置elevation 0.dp、背景为surfaceVariant.copy(alpha 0.4f)形成扁平柔和的视觉风格所有间距、圆角、图标尺寸都引用统一的 Dimensions 设计令牌SpaceS 8.dp、SpaceL 16.dp、ListItem.M 56.dp等而不是散落魔法数字自定义组件实战设置行与开关行 界面中大量复用的两个组件位于ui/widget/目录是整个设置页的乐高积木1. 普通设置行— SettingsGroup.ktSettingsItemRow由三部分组成左侧圆角图标底primary色 10% 透明度的Box、中间标题 副标题的Column、右侧的KeyboardArrowRight箭头。整行用clickableripple()提供波纹反馈行与行之间用HorizontalDivider1dp、outline色 10% 透明度分隔。2. 开关设置行— SwitchGroup.ktSettingsSwitchRow在右侧换成了 Material 3 的Switch并有两处好设计使用toggleable(role Role.Switch)而非clickable让读屏器等无障碍服务能正确识别这是开关用remember(item.isChecked)做局部状态缓存保证开关动画流畅3. 数据载体组件的数据参数是极简的Immutabledata classSettingsItem图标、标题、副标题、点击回调和 SwitchItem增加isChecked与onCheckedChange。Immutable注解告诉 Compose 编译器该对象内容不可变可跳过无效重组这是 Compose 性能优化的基础功。4. 条件展开动画开关之间的从属关系用AnimatedVisibilityfadeIn()/fadeOut() expandVertically()/shrinkVertically()实现例如拦截卸载开启后才会展开其子选项MainActivity.kt 第407-448行。配合卡片上的animateContentSize()展开收起过程平滑无跳变。安装器选择列表ModalBottomSheet 底部弹层实战 这是全文最值得学的部分如何扫描系统里的安装器并在底部弹层里做成一个可点选、可长按的选择列表。第一步扫描系统中所有 APK 安装器getApkInstallerApps 用一个假的 APK URI构造ACTION_VIEWIntent交给packageManager.queryIntentActivities做隐式 Intent 解析val intent Intent(Intent.ACTION_VIEW).apply { setDataAndType(content://nya.apk.toUri(), application/vnd.android.package-archive) } val resolveInfos packageManager.queryIntentActivities(intent, MATCH_ALL or MATCH_DEFAULT_ONLY)然后过滤掉非导出exported的 Activity取出应用名loadLabel和图标loadIcon最后按名称排序。结果封装进 InstallerApp 并用 StableInstallerList 包裹外层remember缓存避免每次重组都重新扫描 PackageManager。第二步底部弹层列表点默认安装器行后弹出 InstallerSelectionDialogModalBottomSheet( onDismissRequest onDismiss, sheetState rememberModalBottomSheetState(skipPartiallyExpanded true) ) { LazyColumn( contentPadding PaddingValues(16.dp), verticalArrangement Arrangement.spacedBy(8.dp) ) { item { InstallerItem(...) } // 第一项固定为系统默认 itemsIndexed(installerList.list) { _, app - InstallerItem(...) } } }要点拆解skipPartiallyExpanded true让弹层直接展开到fillMaxHeight(0.85f)的高度避免二次上滑适合列表较长的选择场景列表第一项固定为系统默认选项对应selectedPackage null给用户反悔的出口每一项都是一个 InstallerItem 卡片选中态用颜色区分选中时背景为primaryContainer.copy(alpha 0.3f)、标题加粗并在右侧显示CheckCircle图标第三步长按强制组件调用的隐藏彩蛋InstallerItem内部使用combinedClickable同时响应点击与长按combinedClickable( onClick onClick, onLongClick { onLongClick?.invoke() } )单击选择该安装器包名写入偏好长按切换该安装器强制组件调用状态列表项上会出现一把Lock小锁副标题额外显示 Activity 类名这就是 README 里提到的长按强制指定 Activity 组件功能——解决某些 App 硬编码了特定安装器组件、导致普通重定向失效的问题。状态同步把 SharedPreferences 接进 Compose ⚙️Xposed 模块有个特点设置可能随时被模块自身运行在系统进程中修改App 界面必须实时感知。InxLocker 的方案在 PrefsProvider.kt每个配置项声明为mutableStateOf如selectedInstallerPackage注册SharedPreferences.OnSharedPreferenceChangeListener值变化时同步写回对应State界面侧用snapshotFlow监听聚合快照仅在值真正变化时才更新局部StateMainActivity.kt 第283-313行LaunchedEffect(Unit) { snapshotFlow { PrefsSnapshot(...) }.collect { s - if (s.selectedPackage ! selectedPackage) selectedPackage s.selectedPackage // 其余字段同理先比较再写入避免无意义重组 } }这个快照比较 条件写入的写法非常实用既让界面与磁盘配置保持双向一致又避免了snapshotFlow每次触发都引发整屏重组。另外注意onCreate中会在进入 Compose 上下文之前预热初始化所有PrefsProvider状态第218-231行防止快照系统尚未就绪时读取到的值过期。新手可直接抄的要点清单 ✅最后把本文浓缩成一份可直接套用的清单BOM 管版本Compose 全家桶统一走platform(libs.androidx.compose.bom)少踩版本冲突坑主题三层降级动态取色 → 明暗色板 → 默认排版MaterialTheme一把梭卡片堆叠布局Scaffold LazyColumn spacedBy(16.dp)每个功能区块独立成卡组件化复用设置行/开关行拆成独立 Composable Immutable数据类参数即配置设计令牌所有间距、圆角、图标尺寸收进Dimensions对象杜绝魔法数字弹层选列表ModalBottomSheetskipPartiallyExpanded 固定默认首项 选中态着色手势分层combinedClickable把单击和长按分配给不同职责状态桥接外部存储用mutableStateOf声明snapshotFlow先比较再写入对照 MainActivity.kt 通读一遍源码约 900 行结构清晰你基本就掌握了Material 3 Compose 设置页 系统级选择列表的完整套路。祝编码愉快赞分享【免费下载链接】InxLockerXposed-based Installer Locker for Android (Powered by YukiHookAPI)项目地址https://gitcode.com/gh_mirrors/in/InxLocker点击查看免费下载相关推荐告别卡顿GlideJetpack Compose打造丝滑图片选择器告别卡顿GlideJetpack Compose打造丝滑图片选择器 Glide是一款专注于实现流畅滚动的Android图片加载和缓存库它能帮助开发者轻松解移动开发缓存图像处理CANN/driver PCIe带宽查询dcmiv2\_get\_pcie\_link\_bandwidth\_infoa nameEN US_TOPIC_0000002314204926 驱动开发人工智能CANNWinboat 启动失败排查完整指南10 分钟恢复 Linux 上运行 Windows 程序的桌面Winboat 启动失败排查完整指南10 分钟恢复 Linux 上运行 Windows 程序的桌面 WinBoat 让你在 Linux 上运行 Windows桌面应用虚拟化上一篇ReactDOM.render 首次渲染全流程解析just-react 带你走通 fiber 创建、Update 入队与三种模式入口下一篇深度解析Illustrator智能对象替换引擎replaceItems.jsx完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考