【问题标题】:how to identify the mobile is idle?如何识别手机处于空闲状态?
【发布时间】:2014-03-08 20:39:11
【问题描述】:

您如何识别用户 30 分钟未使用手机?

用 Jiro 看它是在水平位置吗?

是否有任何 Android 内置标志?

【问题讨论】:

  • 只是一个简单的问题 - 您真的需要陀螺仪/加速度计测试吗?我可以想办法看看用户是否没有触摸屏幕,这是否符合您的要求。
  • 实际上不需要陀螺仪。我愿意接受建议
  • 检查 isScreenOn 怎么样?

标签: java android sleep


【解决方案1】:

监听ACTION_SCREEN_OFF启动定时器,只有收到ACTION_USER_PRESENT才清空定时器,这样就不会在某些应用打开屏幕时意外清空定时器。

对于上述方法,您可以在启动计时器时包含以下内容。这样您就可以在屏幕关闭时考虑自动锁定延迟。

Settings.Secure.getLong(getContentResolver(), "lock_screen_lock_after_timeout", 5000);

或者,您可以使用KeyguardManager在屏幕关闭后每隔1ms左右检查一次锁定屏幕是否启用。

总的来说,思路是lock screen --> idle; no lock screen --> not idle

【讨论】:

  • 您对上述评论有何看法? Please note, that the Screen-Events could be also fired by applications like WhatsApp if they automatically enable the display to show a new message. Due to this fact should you rather stick to ACTION_USER_PRESENT.
  • @EladBenda ACTION_USER_PRESENT 检查锁定屏幕状态。通常,应用程序无法解锁您的手机,除非它本身是锁屏更换,或者您已将手机植根以获取对该操作的访问权限。如果屏幕已解锁,则可以假定用户想要与手机进行交互。
【解决方案2】:

您应该尝试根据显示以及上次启用的时间来处理事件。

ACTION_SCREEN_ONACTION_SCREEN_OFFACTION_USER_PRESENT注册一个广播接收器并正确保存时间戳。

请注意,如果 WhatsApp 等应用程序自动启用显示屏以显示新消息,屏幕事件也可能会触发它们。由于这个事实,你应该坚持ACTION_USER_PRESENT

这里有一些代码:

Android-Manifest.xml

<receiver android:name=".UserPresentBroadcastReceiver">
  <intent-filter>
    <action android:name="android.intent.action.USER_PRESENT" />
  </intent-filter>
</receiver>

广播接收器

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class UserPresentBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent intent) {

        /*Sent when the user is present after 
         * device wakes up (e.g when the keyguard is gone)
         * */
        if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)){

        }
    }

}

代码致谢Chathura Wijesinghe

注意:您将需要一个单独的线程(最好是守护线程)来将该时间戳与当前时间进行比较。

【讨论】:

  • so USER_PRESENT 将我的延时计数器设为 0。但这个事件是否会在每个用户的触摸中唤起?
  • 此事件仅在手机解锁时调用。
【解决方案3】:

您可以通过调用isScreenOn方法检查屏幕是否关闭。

注意:这只能用于 2.1 及以上版本

您还可以使用Intent.ACTION_SCREEN_OFF 来确定屏幕的状态。以link 为例。

参考:isScreenOnthis

【讨论】:

    【解决方案4】:

    很大程度上取决于您如何定义“空闲”,屏幕关闭并不意味着您的设备处于空闲状态,最常见的情况是如果有一个应用程序持有PARTIAL_WAKE_LOCK

    1. ) 解决该问题的一种方法是许多用户在此处建议将 SCREEN_ON /OFF 和 ACTION_USER_PRESENT 与 keygaurd 或 windowmanager api 结合使用以检测用户输入是否正在发生。

    虽然如果你有后台服务运行,这将不起作用,比如 utorrent 应用程序。

    因此,如果您想使用屏幕开/关选项,我会
    建议您还检查活动唤醒锁(“adb shell dumpsys power”来查找设备当前持有的活动唤醒锁)

    您可以尝试另一种方法,尽管它可能有点乏味(取决于您想要定义 IDLE 的准确程度)

    使用 android 公开的 Systrace(LINK) 功能来跟踪 cpu 频率和其他参数的主机,这样您也可以监控各种程度的“空闲”。

    有专门的选项来跟踪 CPU 负载和 cpu 空闲事件

    1.) Android 4.3 及以上版本(api 18 及更高版本):使用“空闲”(CPU 空闲)和 “负载”(CPU 负载)作为列表类别选项。

    2.) Android 4.2 及以下(api 18 以下):使用“-i,--cpu-idle”进行跟踪 cpu 空闲事件和“-l,--cpu-load”表示 cpu 负载百分比( 虽然您需要 cpu 空闲事件来完成这项工作)。

    通过链接了解详细说明,谢谢。

    【讨论】:

    • windowmanager api to detect if user input is happening. 你会怎么建议?
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多