You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类似YourHour的悬浮效果,在其他App上层显示图片或计时器

安卓悬浮显示+应用时长统计实现方案

你要实现的功能整体分为三个核心模块:权限申请、悬浮窗渲染、前台应用识别计时,具体实现步骤如下:

一、必备权限申请

你提到的两个权限是实现功能的基础,具体申请逻辑如下:

  • 悬浮窗权限(Display over other apps):
    安卓6.0及以上需要动态申请,首先调用Settings.canDrawOverlays(context)判断是否已获取权限,返回false时,通过Intent跳转至系统悬浮窗权限设置页:
    val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:${context.packageName}"))
    startActivityForResult(intent, REQ_OVERLAY_PERMISSION)
    
  • 应用使用情况访问权限(Usage Access):
    用于获取当前前台运行的应用信息,判断权限的方法是查询近期应用使用统计是否能正常返回结果,无权限时跳转至对应设置页:
    val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
    startActivityForResult(intent, REQ_USAGE_ACCESS_PERMISSION)
    

二、悬浮窗实现逻辑

所有上层显示的View都是通过WindowManager添加到全局窗口的,具体配置:

  1. 配置WindowManager.LayoutParams参数:
    • 安卓8.0及以上type设置为TYPE_APPLICATION_OVERLAY,低版本用TYPE_SYSTEM_ALERT
    • flags添加FLAG_NOT_FOCUSABLE(不拦截下层应用触摸事件)、FLAG_LAYOUT_NO_LIMITS(允许超出屏幕边界)
    • 宽高按需设置,展示图片的话可以固定为你要显示的图片尺寸或者设置为WRAP_CONTENT
  2. 自定义悬浮布局:
    布局中直接放置ImageView即可加载你要显示的图片,也可以参考YourHour的样式添加计时文本,需要支持拖动的话可以监听View的触摸事件,动态更新LayoutParams的x、y坐标后调用windowManager.updateViewLayout(view, params)更新位置

三、前台应用识别与时长统计

  • 用UsageStatsManager查询应用使用事件,每隔500ms轮询一次最近10s内的应用事件,找到最新的MOVE_TO_FOREGROUND事件对应的包名,即为当前前台运行的应用
  • 维护一个包名对应累计时长的映射表,当前台应用切换时,暂停上一个应用的计时,启动当前应用的计时,数据可以存在SharedPreferences或者本地数据库中持久化

四、适配注意事项

  • 安卓12及以上对悬浮窗权限的申请逻辑做了收紧,需要额外判断是否有「显示在其他应用上层」的特殊权限
  • 若需要后台长期运行,需要引导用户将应用加入电池优化白名单,避免被系统后台查杀

YourHour悬浮计时器示例

内容的提问来源于stack exchange,提问作者theyash15

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:54:06