我正在开发一个将在Kiosk模式下运行的应用程序。在此应用程序中,如果用户在5分钟内未在应用程序中执行任何操作,则应用程序将显示屏幕保护程序,该屏幕保护程序是应用程序的徽标。
我的问题是,如何在5分钟内检测IDLE?
答案 0 :(得分:16)
更好的解决方案......非常简单
我使用了倒数计时器,如下所示,
private long startTime=15*60*1000; // 15 MINS IDLE TIME
private final long interval = 1 * 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countDownTimer = new MyCountDownTimer(startTime, interval);
}
@Override
public void onUserInteraction(){
super.onUserInteraction();
//Reset the timer on user interaction...
countDownTimer.cancel();
countDownTimer.start();
}
public class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish() {
//DO WHATEVER YOU WANT HERE
}
@Override
public void onTick(long millisUntilFinished) {
}
}
CHEERS ..........:)
答案 1 :(得分:5)
你应该试试这个,它会在检测到IDLE 5分钟后通过吐司通知。
Handler handler;
Runnable r;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
r = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "user Is Idle from last 5 minutes",
Toast.LENGTH_SHORT).show();
}
};
startHandler();
}
@Override
public void onUserInteraction() {
// TODO Auto-generated method stub
super.onUserInteraction();
stopHandler();//stop first and then start
startHandler();
}
public void stopHandler() {
handler.removeCallbacks(r);
}
public void startHandler() {
handler.postDelayed(r, 5*60*1000);
}
答案 2 :(得分:4)
我认为您可以在应用程序中使用http://developer.android.com/reference/android/app/Activity.html#dispatchTouchEvent(android.view.MotionEvent)和http://developer.android.com/reference/android/app/Activity.html#dispatchKeyEvent(android.view.KeyEvent)在每次进行用户交互时设置时间戳(只需覆盖方法并在末尾返回false,以便将事件传播到基础视图) - 然后您可以使用某种计时器来重复检查交互的最后时间戳,并在达到5分钟的空闲时间时触发屏幕保护程序。
因此,在一个Activity中,您只需覆盖前面提到的方法,如下所示:
@Override
public boolean dispatchTouchEvent (MotionEvent ev) {
timestamp = System.getCurrentTimeMilis();
return false; // return false to indicate that the event hasn't been handled yet
}
dispatchKeyEvent以及您可以覆盖以确定用户活动的其他方法应该非常相似。
如果您正在使用多个活动,则可能需要创建一个基类,该基类扩展活动并覆盖您要处理的所有dispatchXXXEvent,以及您用作所有活动的基类的基类。但我想你的实施细节可能有点超出了实际问题的范围:)
对于计时器的不同可能性,您可以在此处找到有用的信息:Scheduling recurring task in Android
答案 3 :(得分:1)
尝试:
private void startCount(int time) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Add here the code for showing the fullscreenlogo
}
}, time);
}
然后,每当你想要开始计数时,你应该添加:
startCount(time); // Replace time with 60*5*1000 for 5 mins
如果您想在应用程序最小化时开始计数,请使用此:
@Override
public void onPause() {
super.onPause();
startCount(time);
}