FloatMenu Demo应用解析:学习Activity与Service中悬浮菜单的完整实现
2026/7/31 18:32:40 网站建设 项目流程

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

【免费下载链接】FloatMenuSampleandroid 悬浮窗菜单,可在launcher或app中使用项目地址: https://gitcode.com/gh_mirrors/fl/FloatMenuSample

FloatMenu是一个功能强大的Android悬浮窗菜单库,支持在Activity和Service中灵活使用,为应用提供便捷的全局交互入口。本文将通过解析FloatMenuSample项目的实现方式,帮助开发者快速掌握悬浮菜单在不同组件中的集成技巧。

🌟 悬浮菜单的两种核心实现方式

FloatMenu提供了两种主要的悬浮菜单实现模式,分别适用于不同的应用场景:

1. Activity内悬浮菜单

在当前Activity范围内显示,生命周期与Activity绑定,适合应用内快速操作。通过FloatMenu.create()方法创建,代码示例位于MainActivity.java:

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();

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, "悬浮菜单服务已启动\n(Activity悬浮球已销毁)", 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, "悬浮菜单服务已停止\n(Activity悬浮球将恢复)", 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/FloatMenuSample

2. 核心类引入

将以下核心类添加到你的项目中:

  • FloatMenu.java
  • FloatLogoMenu.java
  • FloatManager.java

3. 权限配置

在AndroidManifest.xml中添加悬浮窗权限:

<uses-permission android:name="android.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询