前言:

随着互联网技术的快速发展,我们的饮食居行已越来越离不开智能手机了.手机,已然成为我们生活的重心.而对手机的保护,则显得非常重要.不少手机都有手机卫士等功能类似的安全软件.今天,我们就来探讨一下手机卫士功能之一的程序锁的实现原理.

正文

1.什么是程序锁
智能手机普遍都安装了不少软件,有些软件比如短信,由于涉及到机主很敏感的信息,肯定不想随意的被人所看到.这时,将短信应用添加程序锁功能.这样,每次打开短信应用,都会弹出一个密码输入界面.只有输入正确的密码,才可以进入到短信应用.这个功能,就是程序锁主要的作用.
2.程序锁的实现原理
当点击一个受保护的应用时,会弹出一个密码输入界面.实现这个逻辑的代码如下:
  
    
        
new Thread() {
public void run() {
Intent intent = new Intent(AppProtectedService.this,
EnterLockedAppActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String packageName;
while (flag) {
packageName = am.getRunningTasks(1).get(0).topActivity
.getPackageName();
if (lockedPackageNames.contains(packageName)) {
intent.putExtra("packageName", packageName);
startActivity(intent);
}
SystemClock.sleep(30);
}
};
}.start();

     注意,这段代码是运行在服务里的.为什么需要把这段逻辑写在服务里呢?因为我们需要不间断地检测当前正在运行的应用包名,所以需要长期在后台运行,而由于服务是运行在主线程的,这段代码又是不间断执行的,因此需要在子线程中执行.这里的lockedPacknames是从数据库里查找的包含所有受保护应用的包名集合.而EnterPasswordActivity则是一个简单的密码输入界面.如果输入的密码正确,调用finish()销毁当前Activity.这样,就可以进入到受保护的应用.到此为止,这就是程序锁的主要核心逻辑.看到这里,是不是觉得很简单?的确,程序锁的逻辑很简单:当你打开一个受保护的应用时,后台服务会立即检测到.这样,当你进入到这个应用的瞬间,会弹出一个密码输入界面(通常在毫秒以内,人眼根本没法发觉)覆盖到当前应用界面之上,这样,你就看不到受保护应用的界面.只有你输入正确的密码,该界面才会被销毁,才能看到受保护应用的界面.
    好的,逻辑明白了,在密码输入界面实现上述逻辑.但是,运行以后我们会发现:我们刚看到受保护应用的界面一瞬间,又会弹出密码输入界面.当我们再次输入正确密码,上述情景又再次重现.为什么呢?仔细看上面的代码,发现后台服务会不停地检测当前正在运行的应用名,只要发现当前应用名是受保护的,就会弹出密码输入界面.因此,即使你输入正确的密码,也没法真正地进入到应用界面.那么,该如何解决这个问题呢?其实,解决的方法非常简单,就是发送一个自定义的广播,通知后台服务暂时停止对当前应用的保护.代码如下:
     
Intent intent = new Intent();
intent.setAction("com.heima.mobilesafe.stopapplockservice");
//把当前应用名传过去
intent.putExtra("packageName", packageName);
sendBroadcast(intent);
//销毁当前Activity
finish();

既然自定义了一个广播,那必须有一个广播接受者.当接受到这个广播时,暂时停止对该应用的保护.这段代码写在哪里呢?当然,就写在后台服务里

     
new Thread() {
public void run() {
Intent intent = new Intent(AppProtectedService.this,
EnterLockedAppActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String packageName;
while (flag) {
packageName = am.getRunningTasks(1).get(0).topActivity
.getPackageName();
if (lockedPackageNames.contains(packageName)) {
if(packageName.equals(temStopProtectPackageName)) {
SystemClock.sleep(30);
continue;
}
intent.putExtra("packageName", packageName);
startActivity(intent);
}
SystemClock.sleep(30);
}
};
}.start();
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("com.heima.mobilesafe.stopapplockservice".equals(action)) {
temStopProtectPackageName = intent.getStringExtra("packageName");
}
}
}

这样,自定义广播接受者就能接受到密码输入界面发送到的广播,得到受保护的应用的包名.而在后台服务增加一个判断条件,只要广播接受者接受到包名与当前正在运行的应用包名相同,就暂停对当前应用的保护.好的,到目前为止,程序锁的相关逻辑基本上写完了.不过,在测试的时候我发现有一个小bug:1.当弹出密码输入界面的时候,如果我们啥也不做,而是按返回键,会看到受保护应用界面,不过一瞬间又会弹出密码输入界面,和刚才的情况一样.为什么会这样呢??因为按返回键,其实会调用Activity的onBackPressed()方法,而这个方法如果不重写的话,默认调用父类的方法,即调用父类的finish(),这和我们刚开始写的密码输入界面逻辑一样的.所以,会出现和刚才一样的bug.另外,还有一点需要特别注意:最好把密码输入界面那个Activity的属性设置为singleInstance,即系统会为这个Activity单独开启一个Activity栈.如果不这样做,当该Activity任务栈中还包含其它的Activity,输入正确的密码后,不会立即进入到受保护的应用界面,而是进入到该Activity任务栈内的其它Activity.好的,程序锁的所有逻辑就是这样的,其实原理不难,只不过有些细节需要注意和处理.希望能够给各位读者一点启发.

浅谈手机卫士之程序锁相关推荐

  1. python中gil锁和线程锁_浅谈Python中的全局锁(GIL)问题

    CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的 ...

  2. 手机热点设置虚拟服务器,以三款路由器为例,浅谈手机热点中继路由器的设置方法...

    以三款路由器为例,浅谈手机热点中继路由器的设置方法 2017-01-23 22:37:04 43点赞 328收藏 36评论 前言 各位值友,新年好! 这篇文章写一点路由使用心得.在此之前,我和许多人一 ...

  3. 一个菜鸟浅谈对 软件、程序、软件模型的认识 ——!

    作为一个菜鸟,让我谈关于软件,程序,软件模型的心得,无异于是很天方夜谭的事情,据说很多的专家于此都没有给出明确的定义,我就用这些年中对于电脑的认识,来随便说说. 1.谈到软件,太专业的术语即使说了,我 ...

  4. [android] 手机卫士设备管理权限锁屏

    设备管理员 Device Admin 获取DevicePolicyManager对象,通过getSystemService(DEVICE_POLICY_MANAGER),设备策略管理器 调用Devic ...

  5. 浅谈Java中15种锁的分析比较

    作者:站长,来自:搜云库技术团队 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类,介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享 ...

  6. 分布式锁和mysql事物扣库存_浅谈库存扣减和锁

    先说场景: 物品W现在库存剩余1个,  用户P1,P2同时购买.则只有1人能购买成功.(前提是不允许超卖) 秒杀也是类似的情况, 只有1件商品,N个用户同时抢购,只有1人能抢到.. 这里不谈秒杀设计, ...

  7. mysql共享锁使用方法_浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景...

    Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |-- ...

  8. mysql锁的应用场景_浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |-- ...

  9. 浅谈手机系统——iOS

    我们知道,iOS的原始名称是iPhone OS,它是一种类似于UNIX的商业操作系统. 而大家也都常说iOS是一个封闭式的系统,为什么这么说呢?因为iOS的系统并未开源,即闭源. 什么是开源? 开源, ...

最新文章

  1. python sqlite3以字典形式返回查询结果
  2. retain copy(浅复制) mutablecopy (深复制)
  3. 什么影响了数据库的性能?
  4. jieba分词太慢,怎么办?找jieba_fast
  5. 一流企业都在做数据治理,还用百万年薪招人,想做的无非这10点
  6. 英雄?好汉?可否有人站出来回应下?
  7. 信息学奥赛一本通C++语言——1039:判断数正负
  8. launchMode的几种模式
  9. 大数据平台的搭建和数据分析
  10. 六十八个超级经典小故事
  11. 超详细的IC封装形式大全
  12. BZOJ4399: 魔法少女LJJ
  13. windows webrtc 如何实现桌面共享
  14. 案例|工业物联网解决方案•污水处理厂智能监控运维云平台
  15. BRAF蛋白F595S G615R突变的影响
  16. eclipse官网下载安装教程
  17. RAID 独立冗余磁盘阵列详解(RAID 0、RAID 1、RAID 5、RAID 10)
  18. SQL Server 安全篇——SQL Server加密(1)——加密概念
  19. 数据结构之二叉树的实现
  20. [汇编语言][bx]和loop指令

热门文章

  1. socket发送字符串和数组
  2. 中甲新军能否重返赛场再成疑 川足前景扑朔迷离
  3. 英国计算机专业申请条件有哪些?就业前景怎么样?
  4. 程序员专属情人节表白网站(html+css+js邀请函网站制作)
  5. 普中仿真器无法使用解决方法和用库函数点亮LED灯
  6. SketchUp模型组件【北欧洗手台模型】
  7. DNF命令详细介绍及说明
  8. 设计师的最爱:免费素材网站
  9. python已停止工作appcrash_Python已经停止在Windows中工作(APPCRASH),使用GDAL读取和更新shapefile...
  10. 激励视频如何带动有奖猜歌答题小游戏的发展?