gpt4 book ai didi

Android - 不活动/Activity ,无论顶级应用如何

转载 作者:搜寻专家 更新时间:2023-11-01 08:02:40 28 4
gpt4 key购买 nike

我需要找出最后一次用户交互是什么时候,不管哪个应用程序在最上面。我不关心事件发生在何处或发生了什么,我只需要知道它发生的时间。或者,碰巧我收到一个事件。

我试过很多东西:

  1. 使用窗口创建服务并添加触摸监听器。这吃了触摸事件并且没有将其传递下去
  2. 寻找 shell 命令。 getevent 有效(每次收到触摸时都会出现新行)但是你需要 root,所以这对我来说不是一个合适的解决方案。
  3. 寻找“锁定时间”但一无所获。

另请注意:这没有安全问题,因为我不需要任何识别信息,例如触摸位置。只是一个类型戳记(或现场 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:

  1. 在代码中,在 onServiceConnected() 内部。 (从 API 4 开始)

  2. 在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com