在Android中检测应用程序何时空闲

时间:2014-01-08 01:13:23

标签: android

我正在开发一个将在Kiosk模式下运行的应用程序。在此应用程序中,如果用户在5分钟内未在应用程序中执行任何操作,则应用程序将显示屏幕保护程序,该屏幕保护程序是应用程序的徽标。

我的问题是,如何在5分钟内检测IDLE?

4 个答案:

答案 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);
}