APP操作超时,重新登录

这个功能描述的是长时间不操作后,重新登录。实现这个功能需要两步操作:

  • 获取activity的Ui触摸操作
  • 定义TimeoutService类实现超时逻辑,

1. UI触摸操作

事件onTouchEvent和dispatchTouchEvent都能截获对activity地触摸事件,因为我们不对具体事件做处理,选择其中一个就可以

2. 定义超时逻辑

因为操作屏幕地时候你最后一个动作永远是抬起来。所以定义 手指抬起来的时候设置定时器,按下去地时候取消定时器。

      //dispatchTouchEvent 接收触摸操作
@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("dispatchTouchEvent", "按下");
                if (ts != null) {
                    ts.stop();
                }
                break;
            case MotionEvent.ACTION_UP:
                Log.i("dispatchTouchEvent", "抬起");
                if (ts != null) {
                    ts.start();
                }
                break;
        }
        return super.dispatchTouchEvent(event);
    }

3. 在基类BaseActivity中初始化 TimeoutService

private static TimeoutService ts;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         if (this instanceof FirstActivity) { // 在APP的第一个activity处实例化
            if (ts == null) {
                Log.i(this.getClass().getName(), "创建timeoutService");
                ts = new TimeoutService(getApplicationContext());//必须传入全局context,以免activity被销毁后用这个context执行startActivity()报错
            }
            ts.start();
        }
 }

4. TimeoutService 代码

public class TimeoutService {
    private Handler postHandle = new Handler();
    private Context context;
    //    private long time = 3 * 60 * 1000;
    private long time = 10 * 1000;

    /**
     * @param context
     */
    public TimeoutService(Context context) {
        this.context = context;
    }

    public TimeoutService() {

    }
    /**
     * 按下移除计时器
     */
    public void stop() {
        postHandle.removeCallbacks(runnable);
    }
    /**
     * 启动计时器
     */
    public void start() {
        postHandle.removeCallbacks(runnable);
        postHandle.postDelayed(runnable, time);
    }

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Log.i("判断是否重新登陆", "-----------------");
            Intent logoutIntent = new Intent(context, FirstActivity.class);
            logoutIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(logoutIntent);
        }
    };
}

你可能感兴趣的:(android)