用户启动我的应用程序并登录 .
选择会话超时为5分钟 .
在应用程序上执行某些操作 . (全部在前景)
现在用户将Myapp带到后台并启动其他应用程序 .
---->倒计时器启动并在5分钟后退出用户
或者用户关闭屏幕 .
---->倒计时器启动并在5分钟后退出用户
我想要相同的行为,即使应用程序在前台,但用户不会长时间说6-7分钟与应用程序交互 . 假设屏幕始终处于开启状态 . 我想检测一种 user inactivity (即使应用程序在前台也没有与应用程序进行交互)并启动我的倒数计时器 .
13 回答
根据Fredrik Wallenius的回答,我提出了一个很简单的解决方案 . 这是一个需要由所有活动扩展的基本活动类 .
我不知道跟踪不活动的方法,但有一种方法可以跟踪用户活动 . 您可以在每次用户与应用程序进行任何交互时调用的活动中捕获名为
onUserInteraction()
的回调 . 我建议做这样的事情:如果您的应用程序包含多个活动,为什么不将此方法放在抽象超类中(扩展
Activity
),然后让所有活动扩展它 .isInForeGrnd ===> logic is not shown here as it is out of scope of the question
你可以使用下面的设备代码将锁定唤醒到cpu-
我认为你应该使用这段代码,这是5分钟的空闲会话超时: - >
除了
ACTION_SCREEN_OFF
和ACTION_USER_PRESENT
广播之外,在操作系统级别没有"user inactivity"的概念 . 您必须在自己的应用程序中以某种方式定义"inactivity" .在我的活动基类中,我创建了受保护的类:
所以在 onResume 方法中 - 你可以在你的回调中指定动作你想用它做什么...
在我的搜索过程中,我找到了很多答案,但这是我得到的最佳答案 . 但是这个代码的限制是它只适用于不是整个应用程序的活动 . 以此为参考 .
例如,您使用8000,任务将在用户不活动8秒后完成 .
即使您可以使用@gfrigon或@AKh解决方案来管理您的需求 .
但我正在考虑一些Timer和Handlers免费解决方案 . 我已经有了很好的管理计时器解决方案 . 但我已经成功实现了Timer和Handler免费解决方案 .
首先我告诉你 what you have to manage 如果你使用定时器或处理程序 .
如果您的应用被用户或优化器杀死,您的应用将永远不会自动注销,因为所有回调都会被销毁 . ( Manage some Alarm Manager or Service? )
在每个基类中都有计时器吗?您正在为调用注销过程( Manage static Handler or Timer at app level? )创建许多线程 .
如果用户在后台,如果用户在您的应用程序之外进行其他工作,您的处理程序将启动登录活动 . ( Manage app foreground or background? ) .
如果屏幕自动关闭怎么办? ( Manage screen off on broadcast receiver? )
最后我实施了一个解决方案
您不必使用Hander或Timer .
您不必使用Alarm Manager .
您不必使用App Lifecycle .
您不必使用
ACTION_SCREEN_ON
/ACTION_SCREEN_OFF
广播接收器 .Solution
我们不会通过计时器观察用户不活动,而是检查用户活动的上次活动时间 . 因此,当用户下次交互应用时,我会检查上次交互时间 .
这是
BaseActivity.class
,您将从每个活动类而不是LoginActivity
扩展 . 您将在此类的字段TIMEOUT_IN_MILLI
中定义注销时间 .我认为需要将计时器与最后一次激活时间相结合 .
像这样:
在onCreate(Bundle savedInstanceState)中启动一个计时器,比如5分钟
在onUserInteraction()中只存储当前时间
到目前为止很简单 .
现在当计时器弹出时这样做:
获取当前时间并减去存储的交互时间以获取timeDelta
如果timeDelta> = 5分钟,你就完成了
如果timeDelta <5分钟再次启动计时器,但这次使用5分钟 - 存储时间 . 换句话说,5分钟形成最后一次互动
我有类似的问题,我需要跟踪用户不活动1分钟,然后重定向用户启动活动,我还需要清除活动堆栈 .
根据@gfrigon的回答,我想出了这个解决方案 .
ActionBar.java
补充资源
Android: Clear Activity Stack
This Handler class should be static or leaks might occur
用户不活动可以使用android中的
onUserInteraction()
覆盖方法进行检测以下是用户不活动时的示例代码 signout (HomeActivity-->LoginActivity) after 3min
最好的办法是通过在Application calss中注册
AppLifecycleCallbacks
来处理整个应用程序(假设您有多个活动) . 您可以在Application类中使用带有以下回调的registerActivityLifecycleCallbacks()
(我建议创建一个扩展ActivityLifecycleCallbacks的AppLifecycleCallbacks类):