更新记录

1.0.0(2026-09-18)

  • 初始版本,支持 Android 平台(Android 6.0 / API 23 及以上)
  • 提供 startMonitoring / stopMonitoring / resetTimer / getState 四个接口,错误码 9080001 ~ 9080005
  • 支持触摸、滑动、点击、按键四类用户操作监听,enableTouch / enableClick / enableKey 可分别开关
  • 支持滑动监听:ACTION_MOVE 按 500ms 节流持续刷新,长列表连续滚动不会误触发超时
  • 超时时间可配置(默认 300000 毫秒 / 5 分钟),超时与活动事件分别通过 onTimeout / onActivity 回调
  • 监听在 Window.Callback 层包装实现,不依赖具体 View 树,WebView 页面同样有效,stopMonitoring 时自动还原
  • 支持多 Activity:通过 Application.ActivityLifecycleCallbacks 自动为新建 / 恢复的 Activity 挂载监听
  • startMonitoring 标注 @UTSJS.keepAlive,保证 onTimeout / onActivity 在监听期间持续触发(需 HBuilderX 4.27+)

平台兼容性

uni-app(4.72)

Vue2 Vue2插件版本 Vue3 Vue3插件版本 Chrome Safari app-vue app-vue插件版本 app-nvue app-nvue插件版本 Android Android插件版本 iOS 鸿蒙
1.0.0 1.0.0 × × 1.0.0 1.0.0 6.0 1.0.0 × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.72)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
× × 6.0 1.0.0 × × ×

zy-idle-monitor 空闲监听

监听用户触屏、点击等事件,实现5分钟无操作自动退出登录功能。

功能特性

  • ✅ 监听用户触摸 / 滑动事件(滑动过程中持续刷新,500ms 节流)
  • ✅ 监听用户点击事件
  • ✅ 可配置超时时间(默认5分钟)
  • ✅ 超时自动回调
  • ✅ 全局监听方法

支持平台

平台 最低版本
Android Android 6.0 (API 23)

安装

在 HBuilderX 插件市场搜索 zy-idle-monitor 安装,或手动将插件目录复制到项目的 uni_modules/ 下。

API 说明

1. startMonitoring - 开始监听

启动空闲监听,监听用户操作事件。

import { startMonitoring } from '@/uni_modules/zy-idle-monitor'

startMonitoring({
  config: {
    timeout: 300000,        // 超时时间(毫秒),默认5分钟
    enableTouch: true,      // 是否监听触摸/滑动事件
    enableClick: true       // 是否监听点击事件
  },
  onTimeout: () => {
    // 超时回调,执行退出登录逻辑
    console.log('用户空闲超时,即将退出登录')
    uni.reLaunch({ url: '/pages/login/login' })
  },
  onActivity: () => {
    // 用户活动回调(可选)
    console.log('用户有操作')
  },
  success: (res) => {
    console.log('监听状态:', res.isActive)
    console.log('最后活动时间:', res.lastActivityTime)
  },
  fail: (err) => {
    console.error('启动监听失败:', err.errMsg)
  }
})

config 参数:

字段 类型 必填 说明
timeout number 超时时间(毫秒),默认300000(5分钟)
enableTouch boolean 是否监听触摸/滑动事件,默认true
enableClick boolean 是否监听点击事件,默认true

success 回调参数:

字段 类型 说明
isActive boolean 监听是否激活
lastActivityTime number 最后活动时间戳(毫秒)
idleTime number 空闲时间(毫秒)

2. stopMonitoring - 停止监听

停止空闲监听。

import { stopMonitoring } from '@/uni_modules/zy-idle-monitor'

stopMonitoring({
  success: (res) => {
    console.log('监听已停止')
    console.log('最终空闲时间:', res.idleTime)
  },
  fail: (err) => {
    console.error('停止监听失败:', err.errMsg)
  }
})

3. resetTimer - 重置计时器

重置空闲计时器,重新开始计时。

import { resetTimer } from '@/uni_modules/zy-idle-monitor'

resetTimer({
  success: (res) => {
    console.log('计时器已重置')
    console.log('当前空闲时间:', res.idleTime)
  },
  fail: (err) => {
    console.error('重置计时器失败:', err.errMsg)
  }
})

4. getState - 获取状态

获取当前监听状态。

import { getState } from '@/uni_modules/zy-idle-monitor'

getState({
  success: (res) => {
    console.log('监听状态:', res.isActive)
    console.log('最后活动时间:', res.lastActivityTime)
    console.log('空闲时间:', res.idleTime)
  },
  fail: (err) => {
    console.error('获取状态失败:', err.errMsg)
  }
})

完整示例

<template>
  <view class="container">
    <view class="status-card">
      <text>监听状态: {{ state.isActive ? '监听中' : '已停止' }}</text>
      <text>空闲时间: {{ formatDuration(state.idleTime) }}</text>
    </view>

    <button @click="handleStart" :disabled="state.isActive">开始监听</button>
    <button @click="handleStop" :disabled="!state.isActive">停止监听</button>
    <button @click="handleReset" :disabled="!state.isActive">重置计时</button>
  </view>
</template>

<script>
import { 
  startMonitoring, 
  stopMonitoring, 
  resetTimer, 
  getState 
} from '@/uni_modules/zy-idle-monitor'

export default {
  data() {
    return {
      state: {
        isActive: false,
        lastActivityTime: 0,
        idleTime: 0
      }
    }
  },
  methods: {
    formatDuration(ms) {
      if (!ms) return '0秒'
      const seconds = Math.floor(ms / 1000)
      const minutes = Math.floor(seconds / 60)
      return `${minutes}分钟${seconds % 60}秒`
    },

    handleStart() {
      startMonitoring({
        config: {
          timeout: 300000,  // 5分钟
          enableTouch: true,   // 触摸/滑动
          enableClick: true    // 点击
        },
        onTimeout: () => {
          uni.showModal({
            title: '提示',
            content: '长时间无操作,即将退出登录',
            showCancel: false,
            success: () => {
              uni.reLaunch({ url: '/pages/login/login' })
            }
          })
        },
        success: (res) => {
          this.state = res
          uni.showToast({ title: '监听已启动' })
        },
        fail: (err) => {
          uni.showToast({ title: err.errMsg, icon: 'none' })
        }
      })
    },

    handleStop() {
      stopMonitoring({
        success: (res) => {
          this.state = res
          uni.showToast({ title: '监听已停止' })
        },
        fail: (err) => {
          uni.showToast({ title: err.errMsg, icon: 'none' })
        }
      })
    },

    handleReset() {
      resetTimer({
        success: (res) => {
          this.state = res
          uni.showToast({ title: '计时已重置' })
        },
        fail: (err) => {
          uni.showToast({ title: err.errMsg, icon: 'none' })
        }
      })
    }
  },

  mounted() {
    // 初始化时获取状态
    getState({
      success: (res) => {
        this.state = res
      }
    })
  }
}
</script>

<style>
.container {
  padding: 20rpx;
}

.status-card {
  padding: 20rpx;
  background: #f5f5f5;
  border-radius: 10rpx;
  margin-bottom: 20rpx;
}

button {
  margin: 10rpx 0;
}
</style>

使用场景

  1. 银行/金融类App:安全要求高,用户长时间无操作需自动退出
  2. 政务类App:敏感信息展示,需定时自动退出
  3. 企业办公App:保护企业数据安全
  4. 公共设备App:防止用户离开后被他人操作

错误码

错误码 说明
9080001 启动监听失败
9080002 停止监听失败
9080003 重置计时器失败
9080004 获取状态失败
9080005 参数错误

注意事项

  1. 插件仅支持 Android 平台
  2. onTimeout / onActivity 回调均在主线程(UI 线程)执行,可直接更新页面数据
  3. 建议在 App.vue 的 onLaunch 中启动监听,在 onUnload 中停止监听
  4. 插件不会收集任何用户数据,仅监听操作事件
  5. 回调生命周期(keepAlive):HBuilderX 4.25+ 回调默认只触发一次即回收,本插件 startMonitoring 已标注 @UTSJS.keepAlive(需 HBuilderX 4.27+)以保证 onTimeout / onActivity 持续触发。该标注会让回调对象在监听期间常驻内存,请勿在循环中高频调用 startMonitoring
  6. 触摸/滑动/按键监听通过在 Window.Callback 层包装实现,stopMonitoring 时自动还原,无需逐个 View 注册监听;点击以 ACTION_DOWN 为活动信号,滑动(ACTION_MOVE)在 enableTouch=true 时按 500ms 节流 持续刷新,长列表连续滚动不会误触发超时

更新日志

详见 changelog.md

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

仅监听用户操作事件,不收集任何用户数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。