这只是一个想法,可能无法完全转移。
以下是 AccessibilityService 的功能:
无障碍服务在后台运行并接收回调
触发 AccessibilityEvents 时由系统执行。此类事件表示
用户界面中的一些状态转换,例如焦点
已更改,已单击按钮等。
onAccessibilityEvent(AccessibilityEvent)里面的活动会通知你:
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// Some event
timeSinceLastInteraction = System.currentTimeMillis();
}
您可以定期记录更新:
Log.i("LOG_TIME_ELAPSED", "Last user interaction was " +
((System.currentTimeMillis() - timeSinceLastInteraction) / 1000) +
" seconds ago.");
您可以通过两种方式配置 AccessibilityService:
在代码中,在 onServiceConnected() 内部。 (从 API 4 开始)
在 xml 中,在您的服务中使用 meta-data 标记。 (从 API 14 开始)
在您的应用程序中,您可以将AccessibilityServiceInfo.eventTypes 设置为:
accessibilitySeviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
但是,TYPES_ALL_MASK 将包括通知,例如:AccessibilityEvent.TYPE_ANNOUNCEMENT、AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED 等,我猜你不想拦截这些通知。因此,您需要选择 AccessibilityEvent.TYPE_X 的一个子集。
您应该注意的另一件事是通知超时:
在给定类型的最近事件之后的超时时间之前
通知 AccessibilityService。
事件通知超时对于避免传播事件很有用
过于频繁地向客户发送,因为这是通过 an 完成的
昂贵的进程间调用。可以将超时视为
确定事件生成何时稳定的标准。
所以,请尽量设置超时值。
如果您决定使用 AccessibilityService 选项,您会发现此页面非常有用:Developing an Accessibility Service。
从您的 cmets 到 Chloe 的回答,该设备似乎在您的控制之下:这意味着,在某种程度上,您不必依赖用户来启用该服务:
无障碍服务的生命周期完全由
系统并遵循既定的服务生命周期。
此外,启动或停止无障碍服务是
通过启用或由显式用户操作专门触发
在设备设置中禁用它。
您可以在部署时启用 AccessibilityService,也可以使用 AppLock 之类的应用程序限制对“设置”菜单的访问。
另一种选择是不时检查您的 AccessibilityService 是否启用:
AccessibilityManager am = (AccessibilityManager)
getSystemService(ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> listOfServices =
am.getEnabledAccessibilityServiceList(
AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
for (AccessibilityServiceInfo asi : listOfServices) {
// Check if your AccessibilityService is running
}
如果 AccessibilityService 已被好奇/臭名昭著的用户禁用,您可以通过显示带有文本的全屏视图来锁定设备:Device has been locked. Contact a Sales Rep to unlock this device。