- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要找出最后一次用户交互是什么时候,不管哪个应用程序在最上面。我不关心事件发生在何处或发生了什么,我只需要知道它发生的时间。或者,碰巧我收到一个事件。
我试过很多东西:
getevent
有效(每次收到触摸时都会出现新行)但是你需要 root,所以这对我来说不是一个合适的解决方案。另请注意:这没有安全问题,因为我不需要任何识别信息,例如触摸位置。只是一个类型戳记(或现场 Activity )。
我也愿意使用反射来解决这个问题。
@user2558882 有一个很好的解决方案。到目前为止,这是我遇到的最好的方法。
虽然这很好,但它仍然需要用户在辅助功能控件中手动启用我们的应用程序。我们的客户拥有数千台设备,我们有办法自动更新和更改设置。我们尽量减少手动配置,但有些事情仍然需要用户输入,例如启用设备管理模式。所以这个解决方案是可以接受的,但我仍然对不需要任何用户输入即可启用的方式持开放态度。
我最终实现了@user2558882 使用无障碍服务的想法。尽管欢迎其他想法。
最佳答案
这只是一个想法,可能无法完全转移。
这是 AccessibilityService 可以做的事情:
An accessibility service runs in the background and receives callbacks by the system when AccessibilityEvents are fired. Such events denote some state transition in the user interface, for example, the focus has changed, a button has been clicked, etc.
您将被告知 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 的子集。
您应该注意的另一件事是通知超时:
The timeout after the most recent event of a given type before an AccessibilityService is notified.
The event notification timeout is useful to avoid propagating events to the client too frequently since this is accomplished via an expensive interprocess call. One can think of the timeout as a criteria to determine when event generation has settled down.
因此,请慷慨地设置超时值。
如果您决定使用 AccessibilityService 选项,您会发现此页面非常有用:Developing an Accessibility Service .
从您的评论到 Chloe 的回答,似乎该设备在您的控制之下:这意味着,在某种程度上,您不必依赖用户来启用该服务:
The lifecycle of an accessibility service is managed exclusively by the system and follows the established service life cycle. Additionally, starting or stopping an accessibility service is triggered exclusively by an explicit user action through enabling or disabling it in the device settings.
您可以在部署时启用 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 已被好奇/臭名昭著的用户禁用,您可以通过显示带有文本的全屏 View 来锁定设备:设备已被锁定。联系销售代表解锁此设备
。
关于Android - 不活动/Activity ,无论顶级应用如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18882331/
我有一个用于重构练习的测试套件,我希望它与 Data.List 兼容。和 Data.List.NonEmpty .练习包含一个函数 foo :: [Foo] -> Foo并且测试套件有一些 data
我下载了 Android Studio 项目。项目根目录只有一个 build.gradle 具有下一个结构: apply plugin: 'com.android.library' android {
我似乎无法正确使用最接近的函数来删除删除按钮之外的 UL。 HTML X Data Jquery $('.remove').click(function(){
我需要一些帮助。顶级 Activity 必须位于自定义包之外吗?这样的话,MainActivity应该是在自定义包之外吧?Activity 是自定义包名称。
我正在尝试使用 AppCompat Drawer 和多个顶级 Activity (不是 fragment )创建一个基本应用程序 - 我不太清楚如何管理后台堆栈 - 我已经尝试了大约一百种不同的方法-
无法找到任何相关信息,我可以自己完成此操作,但我觉得将其保留在查询中可能是最好的选择(如果可能的话)。 基本上我想尝试添加查询的顶级“统计”部分。 所以当我得到结果时,我会看到这样的结果 num_ro
我在菜单中遇到 onmouseout/over delay 问题。我发现通过将 setTimeout 数字从 100 更改为 2000,它延迟了顶层菜单的隐藏而不是子级菜单,并且在新的 onmouse
是否有一个选项可以通过使用动画在运行时简单地 move Tkinter TopLevel() 窗口?我想到了由按钮触发的平滑 moveInAnimation。 这是一些代码片段: from Tkint
我从正在调用的 API 中获取了以下 JSON 文件: { "14500": [ { "5": { "versionName": "VersionOne",
在 C++ Primer 第五版中,它说: int f(int){ /* can write to parameter */} int f(const int){ /* cannot write to
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在使用 Retrofit 进行一些 API 调用。对于特定端点,返回的 json 看起来有点像这样: 端点:api.example.com/1.0/userinfo?userid=7 返回的响应看
假设我有一个 Python 文件,我想在顶层运行它,但在它完成后,我想从它停止的地方继续。我希望能够使用它创建的对象等。 一个简单的例子,假设我有一个执行 i = 5 的 Python 脚本。当脚本结
我在 Xcode 中使用 Cmake 来生成一个 c++/c“项目”(my_project) 和一些 c++/c“目标”(一个是二进制文件,其余是库) 我的 CMakeLists.txt 看起来像这样
我正在尝试学习 redux,但遇到了错误。我只有两个文件,一个 index.html 文件和一个 main.js 文件,html 文件中有指向 jquery 和 redux cdns 的链接。我在 r
我有这个通用函数可以保存在 NSUserDefaults 中,通常可以正常工作,但现在我想保存一个 boolean 值,但出现错误。我找不到任何东西,我不明白为什么它不起作用。 extension U
我正在使用 Retrofit 进行 API 调用。顶级对象的命名取决于请求的查询参数。例如,这样的请求: api.somewebsite.com/1.0/mix_info?mix_id=69 返回这样
我做汤: from bs4 import BeautifulSoup soup = BeautifulSoup("My paragraph My link", "html.parser") 我想删除第
看完new egghead course由 Dan Abramov 撰写,我对提到的选择器有疑问。 选择器的目的是向组件隐藏状态树的详细信息,以便在树发生变化时便于以后管理代码。 如果我理解正确,那意
我是一名优秀的程序员,十分优秀!