更新记录
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>
使用场景
- 银行/金融类App:安全要求高,用户长时间无操作需自动退出
- 政务类App:敏感信息展示,需定时自动退出
- 企业办公App:保护企业数据安全
- 公共设备App:防止用户离开后被他人操作
错误码
| 错误码 | 说明 |
|---|---|
| 9080001 | 启动监听失败 |
| 9080002 | 停止监听失败 |
| 9080003 | 重置计时器失败 |
| 9080004 | 获取状态失败 |
| 9080005 | 参数错误 |
注意事项
- 插件仅支持 Android 平台
onTimeout/onActivity回调均在主线程(UI 线程)执行,可直接更新页面数据- 建议在 App.vue 的
onLaunch中启动监听,在onUnload中停止监听 - 插件不会收集任何用户数据,仅监听操作事件
- 回调生命周期(keepAlive):HBuilderX 4.25+ 回调默认只触发一次即回收,本插件
startMonitoring已标注@UTSJS.keepAlive(需 HBuilderX 4.27+)以保证onTimeout/onActivity持续触发。该标注会让回调对象在监听期间常驻内存,请勿在循环中高频调用startMonitoring - 触摸/滑动/按键监听通过在
Window.Callback层包装实现,stopMonitoring时自动还原,无需逐个 View 注册监听;点击以ACTION_DOWN为活动信号,滑动(ACTION_MOVE)在enableTouch=true时按 500ms 节流 持续刷新,长列表连续滚动不会误触发超时
更新日志
详见 changelog.md

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 47
赞赏 0
下载 12618071
赞赏 1949
赞赏
京公网安备:11010802035340号