【问题标题】:When exactly is onUserInteraction() called?究竟什么时候调用 onUserInteraction()?
【发布时间】:2014-09-09 13:31:41
【问题描述】:

在我的应用程序中,我得到了一个线程,它每 60 秒检查一次来自 web 服务的数据(在 onCreate() 中定义):

new Thread(new Runnable() {
    @Override
    public void run() {     
        while (true) {
            try {               
                Thread.sleep(PERIOD);
                if(condition) do_something();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}).start();

此外,在用户不活动一段时间后,我得到了一个执行方法的处理程序:

private Handler disconnectHandler = new Handler();

private Runnable disconnectCallback = new Runnable() {
    @Override
    public void run() {
        do_something_else();
    }
};

public void resetDisconnectTimer(){
    disconnectHandler.removeCallbacks(disconnectCallback);
    disconnectHandler.postDelayed(disconnectCallback, TIMEOUT);
}

@Override
public void onUserInteraction() {
    super.onUserInteraction();
    resetDisconnectTimer();
}

现在我遇到的问题是 onUserInteraction() 也在 PERIOD 之后被调用,而不仅仅是在 TIMEOUT 之后。 有什么想法可以让两者都工作吗?

提前致谢。

【问题讨论】:

    标签: android multithreading sleep user-interaction postdelayed


    【解决方案1】:

    Android 文档非常清楚地说明了这一点。它指出:

    public void onUserInteraction ()
    

    每当按键、触摸或轨迹球事件分派到 Activity 时调用。如果您希望知道用户在您的活动运行时以某种方式与设备进行了交互,请实施此方法。这个回调和 onUserLeaveHint() 旨在帮助活动智能地管理状态栏通知;具体来说,用于帮助活动确定取消通知的适当时间。

    对活动的 onUserLeaveHint() 回调的所有调用都将伴随对 onUserInteraction() 的调用。这可确保您的活动将被告知相关的用户活动,例如下拉通知窗格并触摸那里的项目。

    请注意,此回调将为开始触摸手势的触摸操作调用,但可能不会为随后的触摸移动和触摸操作调用。

    【讨论】:

    • 我阅读了文档,但是当我根本不触摸设备时会调用 onUserInteraction()。所以没有键、触摸或轨迹球事件......注释掉线程可以正常工作,处理程序正常工作。
    • @Second2None 据我所知,只有当用户与设备交互时才会调用它。也许您的代码中有一些逻辑错误。请再次查看您的代码。
    • 在此处查看详细示例 - stackoverflow.com/questions/4208730/…
    【解决方案2】:

    也许你想阅读下面的源代码:

    Instrumentation.java

    public void callActivityOnUserLeaving(Activity activity) {
       activity.performUserLeaving();}
    

    Activity.java

    final void performUserLeaving() {
        onUserInteraction();
        onUserLeaveHint();}
    
    public boolean dispatchKeyEvent(KeyEvent event) {
        onUserInteraction();
        ...
    }
    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
        onUserInteraction();
        .....
    }
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
      ....
    }
    public boolean dispatchTrackballEvent(MotionEvent ev) {
        onUserInteraction();
       ....
    }
    public boolean dispatchGenericMotionEvent(MotionEvent ev) {
        onUserInteraction();
       ....
    }
    

    onUserInteraction() 调用如下:

    1. 作为文档,onUserInteraction 每当按键、触摸或轨迹球事件被分派到活动时调用。 “互动”意义重大。所以所有的“XXEvent”都会调用这个方法。
    2. doc :“对活动的 onUserLeaveHint() 回调的所有调用都将伴随对 onUserInteraction() 的调用。” onUserLeaveHint() :在活动即将开始时作为活动生命周期的一部分调用 进入后台作为用户选择的结果。也就是说,当你要离开活动时,它会被调用。例如,在您的行为中开始另一项活动。

    【讨论】:

    • 轨迹球??有带轨迹球的安卓设备吗?
    猜你喜欢
    • 2023-02-25
    • 2015-10-12
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2021-04-15
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多