FloatMenu Demo应用解析:学习Activity与Service中悬浮菜单的完整实现

发布时间:2026/11/9 13:06:26

FloatMenu Demo应用解析:学习Activity与Service中悬浮菜单的完整实现 FloatMenu Demo应用解析学习Activity与Service中悬浮菜单的完整实现【免费下载链接】FloatMenuSampleandroid 悬浮窗菜单可在launcher或app中使用项目地址: https://gitcode.com/gh_mirrors/fl/FloatMenuSampleFloatMenu是一个功能强大的Android悬浮窗菜单库支持在Activity和Service中灵活使用为应用提供便捷的全局交互入口。本文将通过解析FloatMenuSample项目的实现方式帮助开发者快速掌握悬浮菜单在不同组件中的集成技巧。 悬浮菜单的两种核心实现方式FloatMenu提供了两种主要的悬浮菜单实现模式分别适用于不同的应用场景1. Activity内悬浮菜单在当前Activity范围内显示生命周期与Activity绑定适合应用内快速操作。通过FloatMenu.create()方法创建代码示例位于MainActivity.javamFloatMenu FloatMenu.create(this) .logo(R.drawable.yw_game_logo) .items(itemList) .listener(new FloatMenuView.OnMenuClickListener() { Override public void onItemClick(int position, String title) { Toast.makeText(MainActivity.this, Activity菜单 - position position title: title, Toast.LENGTH_SHORT).show(); } Override public void dismiss() {} }) .show();2. Service全局悬浮菜单通过Service实现全局显示可在应用退到后台时继续存在适合需要跨页面的功能入口。核心实现位于FloatMenuService.java。 Activity悬浮菜单实现详解基础配置与初始化在Activity的onResume()方法中初始化悬浮菜单确保界面可见时菜单可用Override protected void onResume() { super.onResume(); if (mFloatMenu null) { // 使用新的简化API创建悬浮菜单 mFloatMenu FloatMenu.create(this) .logo(R.drawable.yw_game_logo) .items(itemList) .listener(new FloatMenuView.OnMenuClickListener() { Override public void onItemClick(int position, String title) { Toast.makeText(MainActivity.this, Activity菜单 - position position title: title, Toast.LENGTH_SHORT).show(); } Override public void dismiss() {} }) .show(); } }菜单数据准备创建菜单选项列表包含标题、图标等信息itemList new ArrayList(); for (int i 0; i menuIcons.length; i) { itemList.add(new FloatItem(MENU_ITEMS[i], 0x99000000, 0x99000000, BitmapFactory.decodeResource(this.getResources(), menuIcons[i]), String.valueOf(i 1))); }生命周期管理在Activity生命周期方法中合理管理悬浮菜单的显示与销毁Override protected void onPause() { super.onPause(); hideFloat(); // 隐藏悬浮菜单 } Override protected void onDestroy() { destroyFloat(); // 销毁悬浮菜单 super.onDestroy(); }Activity悬浮菜单效果如下点击可触发对应操作 Service全局悬浮菜单实现权限申请Service悬浮菜单需要系统悬浮窗权限在启动前进行检查和申请if (Build.VERSION.SDK_INT Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { // 没有权限引导用户去设置页面开启 Toast.makeText(this, 请先开启悬浮窗权限, Toast.LENGTH_LONG).show(); Intent intent new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(package: getPackageName())); startActivityForResult(intent, REQUEST_CODE_FLOAT_MENU_PERMISSION); return; } }Service启动与菜单创建通过按钮点击启动Service并创建悬浮菜单private void startFloatMenuService() { // 检查悬浮窗权限... // 启动 Service 前先销毁 Activity 的悬浮球避免冲突 destroyFloat(); Intent intent new Intent(this, FloatMenuService.class); startService(intent); Toast.makeText(this, 悬浮菜单服务已启动\nActivity悬浮球已销毁, Toast.LENGTH_SHORT).show(); }在Service中创建悬浮菜单的核心代码Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, FloatMenuService started, creating and showing float menu); createFloatLogoMenu(); return super.onStartCommand(intent, flags, startId); } private void createFloatLogoMenu() { // 创建悬浮菜单逻辑... Log.i(TAG, FloatMenuService: FloatMenu created and shown successfully); }全局菜单交互效果Service悬浮菜单可以在应用退到后台后继续存在实现全局交互 Activity与Service悬浮菜单的切换逻辑项目中实现了Activity与Service悬浮菜单的无缝切换通过按钮控制// 启动Service悬浮菜单 Button btnStartService findViewById(R.id.btnStartService); btnStartService.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { startFloatMenuService(); } }); // 停止Service悬浮菜单 Button btnStopService findViewById(R.id.btnStopService); btnStopService.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { stopFloatMenuService(); } });切换时通过销毁当前悬浮菜单并启动新的菜单实例避免冲突// 停止Service时恢复Activity悬浮菜单 private void stopFloatMenuService() { Intent intent new Intent(this, FloatMenuService.class); stopService(intent); Toast.makeText(this, 悬浮菜单服务已停止\nActivity悬浮球将恢复, Toast.LENGTH_SHORT).show(); // 延迟恢复 Activity 的悬浮球避免与服务冲突 new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { Override public void run() { mFloatMenu null; createActivityFloatMenu(); // 重新创建Activity悬浮菜单 } }, 500); } 快速集成步骤1. 克隆项目代码git clone https://gitcode.com/gh_mirrors/fl/FloatMenuSample2. 核心类引入将以下核心类添加到你的项目中FloatMenu.javaFloatLogoMenu.javaFloatManager.java3. 权限配置在AndroidManifest.xml中添加悬浮窗权限uses-permission android:nameandroid.permission.SYSTEM_ALERT_WINDOW /4. 初始化菜单根据需求选择Activity或Service模式初始化悬浮菜单参考MainActivity.java和FloatMenuService.java的实现。 总结FloatMenuSample项目展示了如何在Android应用中灵活实现悬浮菜单功能通过Activity和Service两种方式满足不同场景需求。开发者可以根据自己的应用特点选择合适的实现方式或参考项目中的切换逻辑实现更复杂的交互效果。项目代码结构清晰核心功能封装完善适合作为学习悬浮窗开发的入门示例也可直接集成到实际项目中使用。通过掌握悬浮菜单的实现原理开发者可以为应用添加更加便捷的用户交互入口提升用户体验。【免费下载链接】FloatMenuSampleandroid 悬浮窗菜单可在launcher或app中使用项目地址: https://gitcode.com/gh_mirrors/fl/FloatMenuSample创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/9 13:06:26

FabulaItemsProvider组件开发实战:从构思到PR的完整流程

FabulaItemsProvider组件开发实战:从构思到PR的完整流程 【免费下载链接】FabulaItemsProvider You can share and communicate with developers around the world through the Fabula app. 项目地址: https://gitcode.com/gh_mirrors/fa/FabulaItemsProvider …

2026/11/8 14:57:54

极空间怎么安装更多应用?1Panel部署AList与公网访问完整教程

前言 极空间主要用来备份照片和存放文件时,原有的管理功能基本能够满足需求。但随着Docker应用越来越多,服务安装、容器管理、日志查看和端口配置逐渐分散,只依赖命令行操作会变得不够直观。 对于希望继续扩展NAS用途的用户来说&#xff0c…

2026/11/9 13:05:51

贵阳高压电工证查询怎么报名?证书过期了不知道怎么复审延期怎么办

贵阳高压电工证查询怎么报名?证书过期了不知道怎么复审延期怎么办 证书过期了不知道怎么复审延期?你不是一个人!贵阳高压电工证查询怎么报名、怎么复审,很多人都是摸着石头过河。今天我来帮你理清楚流程,确保你不再因为信息不对称而错过关键操作时间。…

2026/11/9 13:05:51

张集电工证网上查询怎么搞?工地太忙根本没时间复习考试

张集电工证网上查询怎么搞?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这几乎是每个特种作业人员的真实写照。张集电工证网上查询成了很多人头疼的问题,特别是在河南地区,大家普遍反映流程复杂、信息不透明。今天就围绕张集电工证,结合河南…

2026/11/9 13:05:51

电工证理论考试心里没底?考电工证理论诀窍怎么报名全解析

电工证理论考试心里没底?考电工证理论诀窍怎么报名全解析 实操考试心里没底怕挂科,这几乎是所有初次报考电工证的朋友的真实写照。特别是河南地区的初次报考人员,面对理论考试和实操考核,常常因为准备不足而手忙脚乱。不过,只要掌握考电工证理论诀窍,合…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑