【android开发】手机应用管理器的实现之实现软件加锁(四)
来源:互联网 发布:linux查看登录失败日志 编辑:程序博客网 时间:2024/06/09 19:05
之前几篇文章我们介绍了如何去获取手机应用程序列表,已经实现对应用程序的一些操作:运行、卸载、分享。这个三个功能相对是比较简单,对于如何实现对一个应用程序加锁,这个相对复杂一点。在一些情况下,我们想对一个软件加锁,来保护我们的隐私或者增加安全,比如支付宝、银行软件,这些软件加锁都是有必要。前一段时间一直忙于项目,没对博客进行跟进,今天我们将介绍一下如何实现软件加锁。大家先看看实现的效果图(我们以加锁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;//这里赋值,终于解决了反复弹出验证页面的BUG finish(); } 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(); }
@Override public boolean onLongClick(View v) { // TODO Auto-generated method stub switch (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开发】手机应用管理器的实现之实现软件加锁(四)
- 【android开发】手机应用管理器的实现之实现popupWindow类对话框(二)
- 【android开发】手机应用管理器的实现之实现popupWindow类对话框(二)
- 【android开发】手机应用管理器的实现之获取应用列表(一)
- 【android开发】手机应用管理器的实现之获取应用列表(一)
- 【android开发】手机应用管理器的实现之实现对应用程序的运行、分享、卸载功能(三)
- Android平台手机UI应用开发——软件管理器
- 软件管理器的实现
- Android应用开发之编码实现 软件界面
- 【Android 应用开发】AndroidUI设计之 布局管理器 - 详细解析布局实现
- android的手机任务管理器,关键功能实现方法总结
- android的手机任务管理器,关键功能实现方法总结
- android的手机任务管理器,关键功能实现方法总结
- android的手机任务管理器,关键功能实现方法总结
- android的手机任务管理器,关键功能实现方法总结
- Android开发之实现两个手机之间的通讯
- Android开发之手机铃声代码实现
- Android开发之手机铃声代码实现
- oracle11gr2_rac_添加节点最佳实践
- Lion版本Mac OS下查看iPhone Simulator目录
- 10种排序算法的实现
- 搜狗CEO王小川杀出重围的三个产品
- cannot expose session attribute '_from_source' because of an existing model object of the same name
- 【android开发】手机应用管理器的实现之实现软件加锁(四)
- worldwind学习笔记-9-从头开始,单例模式
- 错误日志struts2 http 404 not found可能原因之一
- MySQL Enterprise Monitor安装
- oracle11gr2_rac_删除节点最佳实践
- 税盾(Tax Shield)
- MySQL存储过程中使用游标和临时表
- [转]最牛B的编码套路
- windows环境下部署django mod_wsgi apache