onUserInteraction()方法是在什么时候被调用的?

8

在我的应用程序中,我有一个线程,每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后。有什么想法可以让两个都起作用吗?
提前感谢。
2个回答

9
也许您想阅读下面的源代码:
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. 文档中写道:"对您的活动的所有对 onUserLeaveHint() 回调的调用都将伴随着对 onUserInteraction() 的调用。" onUserLeaveHint() 方法是活动生命周期的一部分,当用户选择使一个活动进入后台时,即当您要离开活动时,它将被调用。例如,在您的活动中启动另一个活动。

1
轨迹球??有带轨迹球的安卓设备吗? - Mike W
重要提示:请注意,此回调函数将在触摸手势开始的按下操作时被调用,但可能不会在随后的触摸移动和触摸抬起操作中被调用。 (https://developer.android.com/reference/android/app/Activity#onUserInteraction()) - undefined

2

Android文档非常明确地指出:

public void onUserInteraction ()

每当一个键盘事件、触摸事件或轨迹球事件被分派给活动时,就会调用该方法。如果您希望知道用户在活动运行时以某种方式与设备进行了交互,则应实现此方法。此回调和onUserLeaveHint()旨在帮助活动智能管理状态栏通知,特别是帮助活动确定取消通知的正确时间。
所有对您活动的onUserLeaveHint()回调都将伴随着对onUserInteraction()的调用。这确保您的活动将得到相关的用户活动通知,例如拉下通知窗格并在其中触摸项目。
请注意,此回调将被调用开始触摸手势的触摸按下动作,但可能不会调用后续的触摸移动和触摸抬起动作。

1
我阅读了文档,但当我根本没有触摸设备时,onUserInteraction() 会被调用。因此没有键盘、触摸或轨迹球事件...将线程注释掉可以使处理程序正常工作。 - Second2None
据我所知,只有当用户与设备交互时才会调用它。否则不会调用。也许你的代码中存在一些逻辑错误。请再次检查你的代码。 - CodeWarrior
请查看此处的详细示例 - https://dev59.com/p2855IYBdhLWcg3wq2XL - Rohit Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接