Android开发——程序锁的实现(可用于开发钓鱼登录界面)
1. 程序锁原理
1.1 实现效果:
在用户打开一个应用时,若此应用是我们业务内的逻辑拦截目标,那就在开启应用之后,弹出一个输入密码的界面,输入密码正确则进入目标应用。若不输入直接按返回键,则直接返回桌面。
1.2 实现原理:
实时检测栈顶Activity的包名,如果和我们预置的包名相符(可用SQLite数据库对要进行匹配的包名进行信息存储),则新开一个Activity任务栈,将拦截画面置于用户面前。只有在用户输入密码,并且验证成功后,才“放行”。本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/51933690
2. 程序锁实现
1. 代码实现比较简单,获取到topActivity的包名即可进行程序锁的逻辑判断。
注意,当判断某个应用需要保护时,因为服务是没有任务栈信息的,所以在服务里开启Activity,需要指定这个Activity运行的任务栈。这里指定Flag为Intent.FLAG_ACTIVITY_NEW_TASK。这时候就会有一个Activity挡在被打开的应用前面,完成程序锁的功能。
当然,监听到用户开启QQ时,跳出一个我们“自定义”的登录界面,这就是所谓的钓鱼了,可以拿到用户的用户名和密码。实现起来还是比较简单的。不过需要申请这个权限<uses-permission android:name="android.permission.GET_TASKS" />
while (flag){
List<ActivityManager.RunningTaskInfo> runningTasks = am.getRunningTasks(1);
//最近操作的任务栈runningTasks.get(0)
//topActivity栈顶 baseActivity栈底
String packageName = runningTasks.get(0).topActivity.getPackageName();
if(protectPacknames.contains(packageName)){
//判断应用是否需要临时停止保护
if(packageName.equals(tempStopEnterPwPackageName)){
}else{ Intent intent = new Intent(getApplicationContext(),EnterAppLockPwActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName",packageName);//用户在拦截界面展示被保护的应用信息
startActivity(intent);
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
2. tempStopEnterPwPackageName的概念。
为了防止用户验证成功,进入被锁应用后,继续弹出登录验证界面,(因为我们做了死循环),那么就该在合适的时机跳出循环,在本例中肯定是当用户验证成功时,我们采用发送自定义广播的方式来解决,在服务里代码动态注册此广播的Broadcast Receiver,从而使该应用成为tempStopEnterPwPackageName,暂时处于不被锁的状态即可。自定义广播发送时,将该应用的包名放入Extra中进行传递即可。
Intent intent = new Intent();
intent.setAction("com.example.user.mobilesafe.tempstop");
intent.putExtra("packageName",packageName);
sendBroadcast(intent);
finish();
3.最后需要处理的是,在EnterAppLockPwActivity界面进行Back键的屏蔽操作,原因很简单,就不用多说了。这里实现Back键回桌面,因为不会执行OnDestroy方法,但是会执行onStop方法,因此我们把finish()放在onStop方法中实现。
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.MONKEY");
startActivity(intent);
} @Override
protected void onStop() {
super.onStop();
finish();
}
3. BUG处理
(1)由于任务栈的原因,有可能出现的BUG为,打开程序锁所在应用的其他界面A,按Home键,返回桌面,再打开被保护的应用,验证通过后,会进入A界面,这是因为我们没有给EnterAppLockPwActivity指定一个新的任务栈。
(2)同时第二个BUG是,用户打开程序锁所在应用的其他界面A,按Home键,返回桌面,再打开被保护的应用,不输入密码直接按Back键,长按Home键,弹出用户最近打开过的Activity列表(Activity可能已经被关闭了),不代表应用操作的应用。用户认为从该列表点开进入的就应该是应用,那么用户想再次打开程序锁应用时,很显然,会弹出我们的EnterAppLockPwActivity界面(因为这个界面本身就属于我们的程序,从Activity列表里看起来就像是程序锁本身这个应用),这就给用户带来了困扰。
针对上述两个BUG,可以通过指定Activity启动模式和屏蔽应用在Activity列表里显示来解决。
<activity android:name=".EnterAppLockPwActivity"
android:launchMode="singleInstance"
android:excludeFromRecents="true"/>
(3)我们有时需要方便用户开启和关闭服务,而设置一个开关,为了防止开关显示开启但服务实际上没有Alive,无论什么时候需要展示这个开关设置界面时,我们都进行此服务“是死是活”的判断。再修改界面控件显示即可。
public class IsServiceAliveUtils {
public static boolean isServiceRunning(Context context,String serviceName){
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> infos = am.getRunningServices(100);
for(RunningServiceInfo info : infos){
String name = info.service.getClassName();
if(serviceName.equals(name)){
return true;
}
}
return false;
}
}
Android开发——程序锁的实现(可用于开发钓鱼登录界面)的更多相关文章
- Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy
原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...
- Android安全问题 程序锁
导读:本文介绍如何实现对应用加锁的功能,无须root权限 某些人有时候会有这样一种需求,小A下载了个软件,只是软件中的美女过于诱惑与暴露,所以他不想让别人知道这是个什么软件,起码不想让别人打开浏 览. ...
- Android项目实战_手机安全卫士程序锁
###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...
- android147 360 程序锁fragment
package com.itheima.mobileguard.fragment; import java.util.ArrayList; import java.util.List; import ...
- android147 360 程序锁
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Android学习笔记_63_手机安全卫士知识点归纳(3)分享 程序锁 服务 进程管理 widget
1.分享: Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setT ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- 对ios、android开发程序员的14条忠告
————————本文摘自千锋教育(http://www.mobiletrain.org/)对ios\android开发程序员的14条忠告————————— 1.不要害怕在工作中学习. 只要有电脑,就可 ...
- Android简易实战教程--第六话《开发一键锁屏应用2·完成》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http:// ...
随机推荐
- Monitor CodeForces - 846D
题目 题意:有一个n*m的显示屏,有q个坏点先后出现,已知第i个坏点位置为(xi,yi),在ti时间出现.显示屏上出现一个k*k的矩阵全都是坏点时显示屏就是坏的.输出显示屏坏的时间,如果不会坏就输出- ...
- ACM_求第k大元素(两次二分)
求第k大 Time Limit: 6000/3000ms (Java/Others) Problem Description: 给定两个数组A和B,大小为N,M,每次从两个数组各取一个数相乘放入数组C ...
- Python打开目录下所有文件
用Python打开指定目录下所有文件,统计文件里特定的字段信息. 这里是先进入2017-02-25到2017-03-03目录,然后进入特定IP段目录下,最后打开文件进行统计 import os, gl ...
- PowerShell~语法与运算符
基本语法 变量:$开头 $a = "Hello" 条件语句:if else ) { Write-Host "偶数" } else{ Write-Host &qu ...
- [转]Java中实现自定义的注解处理器
Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...
- 学习Python的day1
自己以前从来没有写博客的想法,但是学Python,里面的老师也说了,写博客可以加深自己的记忆,也能回顾内容.还能给别人参考.挺值的.2017-09-16 一. Python介绍 python的创始人为 ...
- android AutoCompleteTextView 实现手机号格式化,附带清空历史的操作
有个小伙伴遇到了这样一个问题,就是AutoCompleteTextView实现自动填充的功能.同时要具备手机格式化的功能.下拉列表最后一行是有个清除历史的功能.可是点击“清除历史”却把文字要设置进去A ...
- Ubuntu docker 使用命令 系列二
1.下载官方远程仓下的镜像:sudo docker pull <docker 镜像> ,sudo docker pull centos (没有指定版本,就是下载的最新的os) 2. 下载某 ...
- Tomcat7的安装与配置
Tomcat的安装及配置我曾经使用过tomcat,并实现了一个简单的servlet程序.没想到再次安装tomcat的时候用浪费了我大半天的时间.我想有必要做个总结,否则下次不知又要花费我多少时间. 1 ...
- LC.exe 已退出,代码为-1 问题解决
最近一个c#工程,之前编译正常.后重装系统,安装DevExpress后,编译一直失败,并提示"4>C:\Windows\Microsoft.NET\Framework\v4.0.303 ...