之前几篇文章我们介绍了如何去获取手机应用程序列表,已经实现对应用程序的一些操作:运行、卸载、分享。这个三个功能相对是比较简单,对于如何实现对一个应用程序加锁,这个相对复杂一点。在一些情况下,我们想对一个软件加锁,来保护我们的隐私或者增加安全,比如支付宝、银行软件,这些软件加锁都是有必要。前一段时间一直忙于项目,没对博客进行跟进,今天我们将介绍一下如何实现软件加锁。大家先看看实现的效果图(我们以加锁UC为例):

UC之前显示没有加锁状态                                                     选择加锁UC                                                          运行UC显示验证页面

       

一、实现流程:

首先我们将要加锁的应用程序放到数据库中,然后开启一个服务监听栈顶应用程序,将当前栈顶应用程序与数据库加密应用程序进行匹配,匹配成功,则弹出身份验证页面。

我们需要注意的是身份验证通过之后,不能重复出现验证密码页面,这个需要一些逻辑上的判断。

将要加锁的应用程序存放到数据库中:

String itemPackageName = item.getPackageName();String pwd = preferencesPwd.getString("pwd", "");if(tv_app_lock.getText().equals("加锁")){if(TextUtils.isEmpty(pwd)){setPassWord(itemPackageName);}else{handleDB.add(itemPackageName);Toast.makeText(MainActivity.this, "加锁成功", Toast.LENGTH_SHORT).show();}}else if(tv_app_lock.getText().equals("解锁")){unLock(itemPackageName);}adapter.notifyDataSetChanged();

开启服务,用于监听栈顶:

 // 得到当前运行的任务栈,参数就是得到多少个任务栈,1就是只拿一个任务栈  // 对应的也就是正在运行的任务栈啦 ,注意别忘了在清单文件中添加获取的权限List<RunningTaskInfo> runTaskInfos = activityManager.getRunningTasks(1);//拿到当前运行的任务栈 RunningTaskInfo runningTaskInfo = runTaskInfos.get(0);//拿到要运行的Activity的包名String runningpackageName = runningTaskInfo.topActivity.getPackageName();//判断监听的运行包是否加锁if(handleDB.find(runningpackageName)){runningApp = runningpackageName;//解决反复出现验证页面BUG://如果runningApp.equals(lastRunningApp)=true//则说明当前栈顶运行的程序已经解锁了if((runningApp.equals(lastRunningApp)) == false){intentLockAppActivity.putExtra("packageName", runningpackageName);intentLockAppActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intentLockAppActivity);}}

监听到要加锁的程序,弹出验证页面:

String input = etInputPwd.getText().toString().trim();preferences = getSharedPreferences("passWord", MODE_PRIVATE);passWord = preferences.getString("pwd", "");if(TextUtils.isEmpty(input))  {  Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();  }  else if(passWord.equals(input))  { WatchAppService.lastRunningApp = WatchAppService.runningApp;//这里赋值,终于解决了反复弹出验证页面的BUGfinish();  }  else  {  Toast.makeText(this, "密码错误", Toast.LENGTH_SHORT).show();etInputPwd.setText("");//置空}  

弹出自定义软键盘:

@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stub//这样是在触摸到控件时,软键盘才会显示出来int inputback = etInputPwd.getInputType();  etInputPwd.setInputType(InputType.TYPE_NULL);  new KeyboardUtil(this, this, etInputPwd).showKeyboard();  etInputPwd.setInputType(inputback); return false;}

自定义软件盘的实现这里将不再细说,具体请参考先前文章http://blog.csdn.net/acrambler/article/details/13020057

第一次进行加锁,会要求先设置密码:

//设置密码public void setPassWord(final String itemPackageName){new AlertDialog.Builder(this).setTitle("设置安全锁密钥").setIcon(R.drawable.ic_setting_pwd).setView(viewSetPwd).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubif((etPwd1.getText().toString()).equals(etPwd2.getText().toString())){if(TextUtils.isEmpty(etPwd1.getText().toString()) | TextUtils.isEmpty(etPwd2.getText().toString())){Toast.makeText(MainActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show();boolean isVisible = false;dialogView(dialog,isVisible);}else{editor.putString("pwd", etPwd1.getText().toString());editor.commit();handleDB.add(itemPackageName);Toast.makeText(MainActivity.this, "密码设置成功", Toast.LENGTH_SHORT).show();Toast.makeText(MainActivity.this, "加锁成功", Toast.LENGTH_SHORT).show();boolean isVisible = true;dialogView(dialog,isVisible);}}else{etPwd1.setText("");etPwd2.setText("");Toast.makeText(MainActivity.this, "两次密码不相同", Toast.LENGTH_SHORT).show();boolean isVisible = false;dialogView(dialog,isVisible);}}}).setNeutralButton("重置", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubetPwd1.setText("");etPwd2.setText("");boolean isVisible = false;dialogView(dialog,isVisible);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubboolean isVisible = true;dialogView(dialog,isVisible);}} ).create().show();}

我们设置了长按进行重新设置密码:

@Overridepublic boolean onLongClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.ll_app_lock:String stringPwd = preferencesPwd.getString("pwd", "");if(TextUtils.isEmpty(stringPwd)){//没有首次设置密码,长按无效}else{changePwd();}break;default:break;}return true;}  

在清单文件里面别忘了添加:

<activity android:name="com.xh.ui.LockAppActivity"android:excludeFromRecents="true"android:theme="@style/AppThemeBlack"></activity><!-- android:persistent="true" 将服务设置为系统服务,防止被系统意外回收--><service android:persistent="true"android:name="com.xh.service.WatchAppService"/>

上面就是主要代码,现在我们发现其实实现起来也是很简单的。

由于这次代码比较多,我就不全部贴出来了,我把链接发给大家,可以下载源码。

总结:到此这个手机应用管理器就做完了,当然了还有很多bug存在,一些逻辑考虑的还不够完整,这个大家可以运行看看,欢迎一起交流。对于附带的资源下载,本人都是运行后没有问题才上传的,如果你无法运行,一般都是配置问题,有问题可以在评论中交流,在资源处评论,无法和大家进行交流。欢迎大家继续关注……

【android开发】手机应用管理器的实现(完整版)

【android开发】手机应用管理器的实现之实现软件加锁(四)相关推荐

  1. android闹钟测试工具,android开发:AlarmManager闹钟管理器的实例

    1.AlarmManager,顾名思义,就是"提醒",是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的PendingIntent.通俗点,就是设置一 ...

  2. android 布局管理器,【Android开发】布局管理器-表格布局

    在XML布局文件中定义表格布局管理器的基本语法: 属性列表 > 需要添加的UI组件 多个TableRow TableLayout支持的XML属性: android:collapseColumns ...

  3. 【Android开发】布局管理器-线性布局

    这里实现垂直布局和水平布局: 垂直布局效果图: 实现代码: 垂直线性布局 res/layout/main.xml: <LinearLayout xmlns:android="http: ...

  4. 张利国,龚海平,王植萌.android移动开发入门与进阶,开题报告-基于Android的手机音乐播放器的设计与实现.doc...

    盐城师范学院 毕业设计开题报告 题 目: 基于android的手机音乐播放器 的设计与实现 姓 名: 二级学院: 信息工程学院 专 业: 软件工程 班 级: 12(1) 学 号: 指导教师: 职称: ...

  5. 基于 Android 系统手机通讯录管理软件【100010322】

    基于 Android 系统手机通讯录管理软件 第一章 绪论 1.1 项目研究背景 经过多年的发展,移动终端不再仅是通讯网络的终端,还将成为互联网的终端.因此,移动终端的应用软件和需要的服务将会有很大的 ...

  6. 文件管理器android实现,Android开发之简单文件管理器实现方法

    易采站长站为您分析Android开发之简单文件管理器实现方法,简单实现了Android的文件目录查看,文件重命名,打开,删除等功能,需要的朋友可以参考下 本文实例讲述了Android开发之简单文件管理 ...

  7. android fragment 管理器,Android Fragment 與 Fragment管理器

    Android Fragment 與 Fragment管理器 首先談談Fragement的需求 過去開發人員認為界面之間的跳轉只需要使用多個activity組成就行了: 例如下圖中,在Activity ...

  8. android做拨号程序代码,Android开发手机拨号程序实现实例源码介绍

    Android开发手机拨号程序实现实例源码介绍,在上一篇文章中,我们实现了第一个程序:helloWorld,并成功测试完成.还给大家介绍了Android项目结构和说明.现在写一个手机拨号程序: 首先, ...

  9. android之ion内存储器管理器,Android ION

    场景:android之ION内存储器管理器(1)- 简介 android之ION内存管理器(1)-- 简介 by JHJ(jianghuijun211@gmail.com) 为什么需要ION 回顾20 ...

  10. android 三星调用拍照功能吗,Android 开发手机(三星)拍照应用照片旋转问题解决办法...

    Android 开发手机(三星)拍照应用照片旋转问题解决办法 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok ...

最新文章

  1. 【LeetCode】142 - Linked List Cycle II
  2. Maven配置JRE版本
  3. 奇淫异巧之 PHP 后门
  4. JS中的!= 、== 、!==、===的用法和区别
  5. g5420核显驱动win7_9102年了,该怎么装Win7 ???
  6. 项目整合一级缓存和二级缓存
  7. 英文读法_儿童英语学习-英文字母A
  8. Python 写各大聊天系统的屏蔽脏话功能原理
  9. 数学建模4 论文写作排版和技巧
  10. 51 Nod 1161 Partial sums
  11. 信息系统项目的应急预案方案_从环评到验收、排污许可证、应急预案,都应在项目什么阶段开展? 先后顺序是什么?...
  12. ArcGIS API for Silverlight/WPF/Windows Phone/Android 插件下载地址
  13. 学校网站模板s1_中学学校网站源码_学校网站管理系统
  14. 深入理解Java虚拟机——Java堆栈跟踪工具(jstack)
  15. html - 鼠标悬停文本内容与边框变色
  16. 彻底删除浏览器毒霸首页
  17. 中国互联网十八摸(全)
  18. 项目实战|基于STM32的无刷电机开环控制
  19. 易语言 多线程,等待所有线程执行完毕后操作
  20. checkpoint NGFW 实验(一)

热门文章

  1. js移动端文字提示框
  2. 计算机水平考试ps证书,2017全国ps考证成绩查询入口(2)
  3. poi excel 添加水印
  4. 深海迷航坐标传送代码_深海迷航代码输入方法
  5. 需要视频素材?这个6个网站就够了
  6. Dart | Dart 语言基础知识梳理
  7. Python常用模块大全
  8. 优酷kux文件转码成mp4
  9. 数据库增删改查的基本语法
  10. Excel的通配符使用