在一些项目里面有需求是如果用户长时间没有操作的话就需要进行其他的操作,比如显示广告或者返回主页。
那么android里面如何实现呢?android里面只要判断一些触摸和按键事件有没有触发,记录下上次的触发时间,
开定时器判断如果长时间没有操作就退出,代码如下:
public abstract class UserHeartActivity extends AppCompatActivity{
private int closeTime = 2 * 60 * 1000; //2分钟过后没有操作就退出
protected boolean openCloseTimer = false; //关闭定时器开关
private CountDownTimer closeTimer; //定时器
protected long lastClickTime = 0; //上次操作时间
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 设置自动关闭定时器
* @param flag true为打开
*/
protected void setCloseTimerFlag(boolean flag){
openCloseTimer = flag;
}
/**
* 开启自动关闭定时器
*/
protected void startCloseTimer() {
stopCloseTimer();
if (openCloseTimer) {
closeTimer = new CountDownTimer(closeTime, closeTime) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
// Log.d("---", "onFinish" + (System.currentTimeMillis() - lastClickTime));
if (System.currentTimeMillis() - lastClickTime >= closeTime) {
closeCallBack();
} else {
startCloseTimer();
}
}
}.start();
}
}
/**
* 停止自动关闭定时器
*/
protected void stopCloseTimer() {
if (closeTimer != null) {
closeTimer.cancel();
}
}
/**
* 自动关闭时的回调
*/
protected void closeCallBack(){}
@Override
protected void onResume() {
super.onResume();
startCloseTimer();
}
@Override
protected void onPause() {
super.onPause();
stopCloseTimer();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
if (openCloseTimer) lastClickTime = System.currentTimeMillis(); //记录按下时间
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (openCloseTimer) lastClickTime = System.currentTimeMillis();//记录按下时间
return super.dispatchKeyEvent(event);
}
}
记录每次事件的时间,CountDownTimer 作为定时器每次时间到了判断一下跟上次的时间,如果到了就执行方法。