4

我想在我的 android 应用程序中查看用户不活动情况。如果用户在 1 分钟内没有执行任何活动,那么应用程序应该离开屏幕,这意味着它应该显示一个对话框,询问密码(以前存储在 sharedpreferences 中)。如果密码匹配活动应该重新开始。有人可以帮我解决这个问题吗?

4

5 回答 5

2

在我的 Serach 期间,我找到了很多答案,但这是我得到的最佳答案。但此代码的局限性在于它仅适用于活动而不适用于整个应用程序。以此为参考

myHandler = new Handler();
myRunnable = new Runnable() {
    @Override
    public void run() {
        //task to do if user is inactive

    }
};
@Override
public void onUserInteraction() {
    super.onUserInteraction();
    myHandler.removeCallbacks(myRunnable);
    myHandler.postDelayed(serviceRunnable, /*time in milliseconds for user inactivity*/);
}

例如,您使用了 8000,任务将在用户不活动 8 秒后完成。

于 2016-03-23T07:17:42.583 回答
1
private CountDownTimer mCountDown = new CountDownTimer(your desire time here, same as first param)
{

    @Override
    public void onTick(long millisUntilFinished)
    {

    }


    @Override
    public void onFinish()
    {
        //show your dialog here
    }
};  


@Override
protected void onResume()
{
    super.onResume();

    mCountDown.start();
}  
@Override
protected void onPause()
{
    super.onPause();

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

    // user interact cancel the timer and restart to countdown to next interaction
    mCountDown.cancel();
    mCountDown.start();
}  

使用上面的代码,将捕获所有用户交互。当用户按 HOME 或 SEARCH 键离开您的应用程序时,当他们回来时,您想要做什么则是另一回事。此外,当电话进入 onUserInteraction 时不会被呼叫,因此如果您想在用户从呼叫回来并且时间到期后显示对话框,那么它会变得更加复杂。您必须覆盖 onKeyDown 并设置一个标志才能知道您的应用程序何时因来电而暂停。

于 2013-03-25T17:38:17.927 回答
1

使用BroadcastReceiverwith Intent.ACTION_SCREEN_OFF来识别应用程序中的用户不活动。您可以使用Intent.ACTION_SCREEN_ON来处理屏幕上的情况。

于 2013-03-25T08:31:33.793 回答
1

我认为这可以帮助你

公共无效 onUserInteraction ()

在 API 级别 3 中添加 每当将键、触摸或轨迹球事件分派到 Activity 时调用。如果您希望知道用户在您的活动运行时以某种方式与设备进行了交互,请实施此方法。

http://developer.android.com/reference/android/app/Activity.html#onUserInteraction()

于 2013-03-25T09:18:50.590 回答
1

在您的 BaseActivity 中,覆盖dispatchTouchEvent并返回 false。

long lastTimeStamp;
@Override
public boolean dispatchTouchEvent (MotionEvent ev) {
  if(lastTimeStamp + 5*60*1000 < System.getCurrentTimeMilis()) {
     //your lasttimestamp was 5 mins ago. Expire user session.
    }
   lastTimeStamp = System.getCurrentTimeMilis();
   return false; // return false to indicate that the event hasn't been handled yet
}
于 2017-07-13T09:09:48.277 回答