2019独角兽企业重金招聘Python工程师标准>>>

前言:

项目需要实现session会话过期的功能,经过不断地调试,实现了该功能。下面我简单总结一下在客户端实现session会话过期的功能,希望对大家有所帮助!

需求:

Session会话过期,即5分钟会话到期时,用户退出应用程序。
以下四种情况需要弹出对话框提示:
1.App应用程序锁定 ; 
2.从其他应用程序活动又回到App设备 ; 
3.App应用程序不活动 ; 
4.Refresh_token过期(在拦截器处理,这里不做介绍)。
对话框有一个“OK”按钮的样式,单击“OK”用户将返回到登录页面。

思路:

1.在BaseActivity基类实现该功能,其他Activity继承BaseActivity即可。
2.在App应用程序初始化的时候,用CountTimer来处理。
3.当App应用程序锁定或者从其他应用程序活动又回到App设备,用BroadcastReceiver来处理。
4.App应用程序不活动时,重写dispatchTouchEvent,并处理。
5.弹出对话框提示用AlertDialog。

实现步骤:

1.App应用程序初始化的时候,添加CountTimer计时器。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);...//设置5分钟后会话过期 if(timeStart==0){countTimerView = new CountTimer(5 * 60 * 1000, 1000, BaseActivity.this);}}...
}@Override
protected void onResume() {super.onResume();timeStart();//开始计时
}@Override
protected void onPause() {super.onPause();if (countTimerView != null) {countTimerView.cancel();//当暂停的时候,要取消计时器}
}private void timeStart() {new Handler(getMainLooper()).post(new Runnable() { //重新开一条线程@Overridepublic void run() {if (countTimerView != null)countTimerView.start();//开始}});
}

2.当App应用程序锁定或者从其他应用程序活动又回到App设备,用BroadcastReceiver来处理。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);...//注册广播接收者registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_USER_PRESENT));...
}@Override
protected void onStart() {showLockScreenDialog();//调用onStart方法时,展示锁屏的dialogsuper.onStart();
}@Override
protected void onStop() {count--;if (count == 0) {timeStart = new Date().getTime(); //调用onStop方法时,开始计时}super.onStop();
}@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(myReceiver);//反注册
}private BroadcastReceiver myReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {//屏幕亮起来}if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { //锁屏}if (Intent.ACTION_USER_PRESENT.equals(intent.getAction()) && isDialogClose == 0) {//解锁showLockScreenDialog();}}
};private void showLockScreenDialog() {if (count == 0) {long timeEnd = new Date().getTime();if (timeStart != 0 && timeEnd - timeStart >= 5 * 60 * 1000) { //5分钟会话过期,弹出对话框if (countTimerView != null) {countTimerView.showSessionDialog();//Show session dialog}         }}count++;
}

3.App应用程序不活动时,重写dispatchTouchEvent,并处理。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {switch (ev.getAction()) {     case MotionEvent.ACTION_UP://弹起if (countTimerView != null)countTimerView.start();//开始计时break;case MotionEvent.ACTION_DOWN://按下View v = getCurrentFocus();if (isShouldHideInput(v, ev)) {hideSoftInput(v.getWindowToken());}if (countTimerView != null)countTimerView.cancel();//取消计时器timeStart=0;break;default:if (countTimerView != null)countTimerView.cancel();//取消计时器timeStart=0;break;}return super.dispatchTouchEvent(ev);
}

4.在BaseActivity实现的完整代码。

public abstract class BaseActivity extends AppCompatActivityimplements IUIOperation, BaseView {...@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);...//5分钟会话过期if(timeStart==0){   countTimerView = new CountTimer(5 * 60 * 1000, 1000, BaseActivity.this);}//注册广播接收者registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));registerReceiver(myReceiver, new IntentFilter(Intent.ACTION_USER_PRESENT));...}@Overrideprotected void onStart() {showLockScreenDialog();//调用onStart方式时,弹出对话框super.onStart();}@Overrideprotected void onResume() {super.onResume();timeStart();//开始计时}@Overrideprotected void onPause() {super.onPause();if (countTimerView != null) {countTimerView.cancel();//取消计时器}}@Overrideprotected void onStop() {count--;if (count == 0) {timeStart = new Date().getTime();//调用onStop方法时,开始计时}if (isDialogClose == 1) {if (mPDialog != null) {mPDialog.dismiss();mPDialog = null;}if (dialog != null) {dialog.dismiss();dialog = null;}if (dialog2 != null) {dialog2.dismiss();dialog2 = null;}}super.onStop();}@Overrideprotected void onDestroy() {super.onDestroy();...unregisterReceiver(myReceiver);//反注册}private void timeStart() {new Handler(getMainLooper()).post(new Runnable() {//新开一条线程@Overridepublic void run() {if (countTimerView != null)countTimerView.start();//开始计时}});}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_UP: //弹起if (countTimerView != null)countTimerView.start(); //开始计时break;case MotionEvent.ACTION_DOWN: //按下View v = getCurrentFocus();if (isShouldHideInput(v, ev)) {hideSoftInput(v.getWindowToken());}if (countTimerView != null)countTimerView.cancel(); //取消计时timeStart=0;//将计时器置为0break;default:if (countTimerView != null)countTimerView.cancel(); //取消计时timeStart=0;//将计时器置为0break;}return super.dispatchTouchEvent(ev);}private boolean isShouldHideInput(View v, MotionEvent event) {if (v != null && (v instanceof EditText)) {int[] l = {0, 0};v.getLocationInWindow(l);int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left+ v.getWidth();if (event.getX() > left && event.getX() < right&& event.getY() > top && event.getY() < bottom) {// Click on the EditText event and ignore it.return false;} else {return true;}}return false;}private void hideSoftInput(IBinder token) {if (token != null) {InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);im.hideSoftInputFromWindow(token,InputMethodManager.HIDE_NOT_ALWAYS);}}//计时器的类class CountTimer extends CountDownTimer {private Context context;public CountTimer(long millisInFuture, long countDownInterval, Context context) {super(millisInFuture, countDownInterval);this.context = context;}@Overridepublic void onFinish() {showSessionDialog();//弹出对话框}@Overridepublic void onTick(long millisUntilFinished) {}//自定义对话框private void showSessionDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(context);View view = LayoutInflater.from(context).inflate(R.layout.common_session_dialog, null);try {builder.setView(view);TextView tvContent = (TextView) view.findViewById(R.id.tv_content);Button btnOk = (Button) view.findViewById(R.id.btn_ok);//Introducing a custom font style.tvContent.setTypeface(Const.font300);btnOk.setTypeface(Const.font700);builder.setCancelable(false);dialog = builder.create();dialog.setCanceledOnTouchOutside(false);dialog2 = builder.show();btnOk.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {GotoLoginActivity(context); //会话过期,要求用户直接登录isDialogClose = 1;}});} catch (Exception e) {e.printStackTrace();}}private void GotoLoginActivity(Context context) {Intent intent = new Intent(context, LoginActivity.class);context.startActivity(intent);//返回登录页面AppManager.getInstance().finishOthersActivity(LoginActivity.class);        }}private BroadcastReceiver myReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {//屏幕亮起来}if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {//锁屏}if (Intent.ACTION_USER_PRESENT.equals(intent.getAction()) && isDialogClose == 0) {//解锁showLockScreenDialog();//弹出对话框}}};private void showLockScreenDialog() {if (count == 0) {long timeEnd = new Date().getTime();if (timeStart != 0 && timeEnd - timeStart >= 5 * 60 * 1000) {//5分钟会话过期               if (countTimerView != null) {countTimerView.showSessionDialog();//弹出对话框}                }}count++;}...}

5.总结:在项目中已经实现了session会话过期四种场景的需求。欢迎大家围观,多多指教!

转载于:https://my.oschina.net/wupeilin/blog/1800421

Android客户端实现session会话过期的功能相关推荐

  1. Android 客户端与服务器端交互实现登录功能

    思路: 安卓客户端输入账号和密码,使用 okHttp 向服务器端发送请求并传递输入的账号和密码,服务器端的登录接口查询数据库,判断是否能登录成功,然后返回给客户端JSON字符串,客户端使用Gson解析 ...

  2. session会话拦截ajax,session过期,拦截ajax请求并跳转登录页面

    1.方法一 :1.1使用filter 和ajaxsetup 对ajax进行拦截并跳转登录页面 public void doFilter(ServletRequest request, ServletR ...

  3. 如何删除 Session 会话数据

    如何删除 Session 会话数据 当完成了一个用户的 session 会话数据,会有以下几种选择去删除session会话数据. 移除一个特定的属性:可以调用 public void removeAt ...

  4. 新浪微博开放平台开发-android客户端(2)

    引言 最近不是太忙,花了一些时间学习android的应用开发.经过两个星期的学习,学习的同时还写了很多的demo示例,可以从基本控件及基本动画效果等示例demo集合大放送,持续更新下载. 从这个星期开 ...

  5. 新浪微博开放平台开发-android客户端(3)

    引言 最近不是太忙,花了一些时间学习android的应用开发.经过两个星期的学习,学习的同时还写了很多的demo示例,可以从基本控件及基本动画效果等示例demo集合大放送,持续更新下载. 从这个星期开 ...

  6. Android客户端访问服务器保持SESSION会话的实现

    大家在电脑上登录网上购物商城的时候购物,先进行登录,输入用户名密码,然后看到自己中意的商品就点开它的详情页面查看详细参数,然后决定买不买,在打开详情页面的时候,页面已经实现了跳转,那么第二个页面是服务 ...

  7. Android客户端与服务器端交互,如何保持session回话

    前言 最近在开发项目的过程中,遇到Android与web服务器要在同一session下通信的问题. 一.Session与Cookie的共性与区别: ①.共性 Cookie和Session都为了用来保存 ...

  8. android客户端与服务器端交互 如何保持session

    最近在开发项目的过程中,遇到android与web服务器要在同一session下通信的问题. 在解决问题前先回顾下Session与Cookie: Cookie和Session都为了用来保存状态信息,都 ...

  9. android c++服务器端,c++服务器与android客户端进行文件传输功能的实现

    c++服务器与android通过socket网络编程进行文件传输解决方案 项目最新成品:http://blog.csdn.net/nuptboyzhb/article/details/8611179 ...

  10. 在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)

    在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库) 完整的项目已上传github仓库,链接在文章最下面 注:笔者在安卓客户端部分写了kotlin语言和java语 ...

最新文章

  1. PIL图像处理:读取图像,显示图像,ROI,保存图像
  2. bytebuf池_Netty默认的Bytebuf是堆内还是堆外?池化or非池化?
  3. 全球 化 化_全球化设计
  4. 【Java】Mybatis mapper动态代理方式
  5. 过拟合问题——正则化方法
  6. python-朴素贝叶斯分类器
  7. arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一)
  8. java session 永不过期_Java Web Application使Session永不失效(利用cookie隐藏登录)
  9. 大数据时代网络安全必读
  10. VisualVM提示检测不到本地JAVA程序
  11. java获取当前年月
  12. 设置oracle每行显示字符个数,Oracle一列的多行数据拼成一行显示字符-Oracle
  13. android 视频标签,android--------WebView实现 Html5 视频标签加载
  14. 软件项目管理 3.1.生存期模型选择
  15. python里面pop代码什么意思_python里的pop是什么
  16. 苹果手机html5定位,苹果手机常去地点可以记录多长时间?
  17. java中合并不同子目录下的txt文件(CHM转换成txt的过程)
  18. 【云片网】发送短信验证代码事例
  19. 为electron添加Chrome扩展程序
  20. minigui 交叉编译

热门文章

  1. 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线 二分+SPFA
  2. HDU 4417 Super Mario 主席树
  3. 从3dmax导出动画总结
  4. 游戏网络编程书籍推荐
  5. join --- connet string
  6. 我的2017之一只混迹于小城市的.net程序猿
  7. 关于Javascript, php的web公开课笔记
  8. React中state与props介绍与比较
  9. 解决windows下的mysql匿名登陆无法使用mysql数据库的问题
  10. C/C++指针和取地址操作