上篇文章中提到,安全测试的一个需求是每次由后台切换到前台的时候都要走一遍登录界面,登录界面就是我的启动页,讲的是只要在配置文件中设置启动页activity的启动模式为singleTask就可以了,之后好像对这个效果不满意(是我解决的太快,感觉太简单了么??),所以给出了另外一种方案。

每次进到后台,从后台切换到前台的时候,只要不是在登录界面,就给弹一个dialog,提示用户输入密码验证身份,验证成功进入,点击取消的话进入到登录界面重新登录。

1、首先要解决的问题就是判断程序在前台还是在后台。

因为要监听所有的activity状态,所以判断应该写在BaseActivity中

/**

* 应用是否在前台运行

*

* @return true:在前台运行;false:已经被切到后台了

*/

private boolean isAppOnForeground() {

ActivityManager mActivityManager = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);

List appProcesses = mActivityManager.getRunningAppProcesses();

if (appProcesses !=null) {

for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {

if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {

if (appProcess.processName.equals("cn.bzzy.com.bzzy_app")) {

//以下两句话是保存是否在后台的布尔值,判断是否显示dialog会用到

//editor.putBoolean("comefromback", false);

//editor.apply();

return true;

}

}

}

}

Toast.makeText(getApplicationContext(), "注意,标准作业已进入后台运行", Toast.LENGTH_SHORT).show();

//editor.putBoolean("comefromback", true);

//editor.apply();

return false;

}

值得注意的是,这个方法应该写在哪里,一开始我是写在onPause()方法里面的,发现怎么都不可以,后来换到onStop()方法中就可以了。

想想为什么要在onStop中检测,而不是onPause?这是由于A启动B时,生命周期的执行顺序如下:A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop,也就是说,在A的onPause方法中,B的生命周期还没有执行,进程没有进入前台,当然是检测不到的。

好了第一步已经完成了,接下来第二步。

2、第二步是显示dialog。

private AlertDialog passwordDialog ;

private void showDialog() {

final EditText editText =new EditText(BaseActivity.this);

passwordDialog =

new AlertDialog.Builder(BaseActivity.this).

setTitle("请重新输入密码验证身份").setView(editText)

.setPositiveButton("确定", null)

.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

Intent intent =new Intent(getApplicationContext(), LoginActivity.class);

startActivity(intent);

finish();

}

}).setCancelable(false).create();

//        if(passwordDialog!=null && !passwordDialog.isShowing()){

passwordDialog.show();

//        }

passwordDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

final String password =editText.getText().toString().trim();

if (!password.equals("")) {

if (!CipherUtils.sm2DecryptHex(passwordPref.getString("password", "")).equals(password)) {

ToastUtil.showShort(getApplicationContext(), "密码错误");

}else {

ToastUtil.showShort(getApplicationContext(), "验证成功");

passwordDialog.dismiss();

}

}else {

ToastUtil.showShort(getApplicationContext(), "请输入密码");急

}

}

});

}

一开始在实现的时候以为就是简单的show出来一个dialog,后来发现默认的dialog是在点击确定的时候自己就消失了,这可不符合我们的需求啊,想想,就算你验证了密码不符合,给出toast出来说验证不通过,但是你的dialog消失了,用户照样可以使用。

所以要解决这个问题,方法就是,在setPositiveButton的点击事件中先设置为null,dialog.show()出来,然后获取PositiveButton的点击,通过验证之后才让dialog消失。

还有一点就是,只有在验证成功的条件下dialog才会消失,所以要设置点击屏幕空白部分和返回键dialog都不能消失,使用.setCancelable(false)。

另外setCanceledOnTouchOutside(false)的作用是点击屏幕空白部分不消失,点击返回键消失。

3、完成以上两个步骤我以为完成了需求,但之后在测试的时候发现,从后台切换到前台的时候,显示dialog没错,这时候再退回到后台,之后进入前台发现又弹出一个dialog,你会发现你在填写密码验证成功之后还有一个没有填写东西的dialog。

解决思路:肯定要在showDialog()方法执行之前进行判断。

怎么判断,想到showDialog的时候实例化dialog的对象,所以在没执行showDialog方法之前肯定是空的

if (passwordDialog ==null){

showDialog();

}

这样弹出一个dialog之后,对象就不为空,就不会执行showDialog方法,确实也是这样,不过经过测试发现,第一次可以达到效果,之后从后台到前台的时候就不会有dialog弹出,看看代码,想一下,是啊,执行过一次之后对象就不为空了啊,以后也不会执行就不会显示dialog了,要想一个办法让它进入到if里面执行showDialog,后来想到dialog.isShowing()这个方法,如果它没在显示的话就让他执行,进入到if了,没毛病,试试看

if (passwordDialog ==null || !passwordDialog.isShowing()) {

showDialog();

}

可以了,到这里目的就达到了。

PS. 本人写在这里的文章是记录自己解决问题的过程,以便日后查看,可能会有些啰嗦,也没有排版,之前也没有写过。如果有幸被你看到引起不适,勿喷。

以上。

android 让应用恢复前台显示_Android程序由后台切换到前台相关推荐

  1. java 切换后台程序_将 Android 程序切换到后台及从后台切换到前台实现

    将 Android 程序切换到后台及从后台切换到前台实现 有时候, 我们需要将自己的 Android 程序切换到后台运行, 在必要时, 将其切换到前台运行下面提供了一种实现方式, 首先需要引用三个单元 ...

  2. android 让应用恢复前台显示_android – 当应用程序返回前台时出现问题

    我的应用程序在与其他应用程序玩一段时间后回到前台时崩溃,我无法找到如何解决它. 我的应用程序有一个启动画面活动,它从Web服务加载一些数据并将其放入在扩展应用程序的类中声明的全局静态变量,如this ...

  3. android view的隐藏和显示_Android使用Viewpager实现3D卡片翻动效果

    作者 |  被代码淹没的小伙子地址 |  https://www.jianshu.com/p/ee8a37ea736d 先看效果图: 效果: 1.竖向的Viewpager 2.3D翻动效果 3.Gli ...

  4. 短视频app怎么开发Android 登录页面(密码显示隐藏、EditText 图标切换、限制输入长度

    密码显示与隐藏 方法一 if(status){etPassword.setInputType(InputType.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARI ...

  5. Android 点击图标使APP由后台切换至前台重新启动欢迎页的问题

    问题:当我们的APP切到后台运行时,点击桌面的应用图标使APP重新回到前台,此时APP会重新启动欢迎页. 但是我们并不需要这种操作,我们需要直接把APP切至前台. 解决:我们只需要在欢迎页的onCre ...

  6. js前台编码,asp.net后台解码 防止前台传值到后台为乱码

    js编码:     encodeURI() 后台解码:HttpUtility.UrlDecode() 转载于:https://www.cnblogs.com/shuai7boy/p/9275648.h ...

  7. 微信小程序没有后台切换如何解决

    今天在学习的时候,没有后台切换按钮: 我的 他们的: 解决方法:打开工具->工具栏管理,把切后台勾上,就显示出来了

  8. Android监听程序进入后台,或者恢复到前台

    基本思路正如9楼所述: 就是让app中所有的activity继承与一个公共的activity(例如:BaseActivity),然后在BaseActivity的onStop()中判断当前程序是否处于后 ...

  9. 微信小程序——从后台获取数据库数据并在前台显示(前端+后端+数据库)

    因为人工测试的时候需要统计数据都在纸上,统计起来很麻烦.所以我想做个小程序来辅助我测试,但我之前没学过小程序,所以就一点一点搞吧.今天这篇主要讲从后台获取数据库数据并在前台显示(类似背单词小程序的点击 ...

最新文章

  1. python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合
  2. 2017年重要数据安全事件解读
  3. magento app/design/adminhtml/default/default/template/sales/order/view/info.phtml XSS Vul
  4. 嵌入式操作系统_航天科工海鹰翼辉嵌入式操作系统获自主原创“身份证”
  5. spring boot + vue 前后端分离时间戳转换为 yyyy:MM:dd HH:mm:ss格式
  6. python解不定积分_python快速求解不定积分和定积分
  7. php-5.6配置,PHP5.6+apache2.4环境配置
  8. Android 启动过程介绍【转】
  9. vue项目中,网页地址栏添加小图标
  10. python 安卓库_Android高级面试题资料(持续更新)
  11. 计算机接口技术试题,广西工学院计算机接口技术考核试题(4套,有答案)
  12. 解决未在此计算机注册ActiveX 控件
  13. (翻译)折叠菜单(Accordion Menu)
  14. Linux上的Redis客户端软件G-dis3
  15. 找自幂数的逐步优化算法
  16. Ios端直播商城源码开发之实现全屏直播功能
  17. 利用 CSS3 实现僵尸行走动画
  18. Win7系统优化十大技巧
  19. Vue Router 路由中 this.$router 与this.$route区别
  20. SEO关键词排名-百度点击软件(刷关键词排名、百度指数、百度相关、竞价点击-全能软件)

热门文章

  1. UI设计配色专辑素材|简易完成色彩协调性!
  2. idea404未找到错误怎么解决_普联路由器提示无线网密码位数错误怎么解决【解决方法】...
  3. db2报01650_db2错误代码
  4. python语言中最基本的概念_Python 学习之路-基本的概念(三)
  5. python watchdog_Python watchdog
  6. CUBLAS变量解释(1)
  7. Linux curl命令使用代理、以及代理种类介绍(附:curl命令详解)
  8. 第一个Verilog程序
  9. python基础元组和列表区别(六)
  10. ue4cmd怎么调用_虚幻引擎UE4-命令行使用的一些详细技巧