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开发——程序锁的实现(可用于开发钓鱼登录界面)的更多相关文章

  1. Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy

    原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...

  2. Android安全问题 程序锁

    导读:本文介绍如何实现对应用加锁的功能,无须root权限 某些人有时候会有这样一种需求,小A下载了个软件,只是软件中的美女过于诱惑与暴露,所以他不想让别人知道这是个什么软件,起码不想让别人打开浏 览. ...

  3. Android项目实战_手机安全卫士程序锁

    ###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...

  4. android147 360 程序锁fragment

    package com.itheima.mobileguard.fragment; import java.util.ArrayList; import java.util.List; import ...

  5. android147 360 程序锁

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  6. Android学习笔记_63_手机安全卫士知识点归纳(3)分享 程序锁 服务 进程管理 widget

    1.分享: Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setT ...

  7. Unity开发Android应用程序:调用安卓应用程序功能

    开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...

  8. 对ios、android开发程序员的14条忠告

    ————————本文摘自千锋教育(http://www.mobiletrain.org/)对ios\android开发程序员的14条忠告————————— 1.不要害怕在工作中学习. 只要有电脑,就可 ...

  9. Android简易实战教程--第六话《开发一键锁屏应用2·完成》

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http:// ...

随机推荐

  1. 喵哈哈村的魔法考试 Round #1 (Div.2) ABCD

    官方题解: http://www.cnblogs.com/qscqesze/p/6418555.html#3623453 喵哈哈村的魔法石 描述 传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石 ...

  2. April Fools Contest 2017 C

    Description DO YOU EXPECT ME TO FIND THIS OUT? WHAT BASE AND/XOR LANGUAGE INCLUDES string? DON'T BYT ...

  3. Lucas+中国剩余定理 HDOJ 5446 Unknown Treasure

    题目传送门 题意:很裸,就是求C (n, m) % (p1 * p2 * p3 * .... * pk) 分析:首先n,m<= 1e18, 要用到Lucas定理求大组合数取模,当然p[]的乘积& ...

  4. 139 Word Break 单词拆分

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,确定 s 是否可以被空格分割为一个或多个在字典里出现的单词.你可以假设字典中无重复的单词.例如,给出s = "leet ...

  5. subline应用之常用插件

    汉化插件:ChineseLocalzations IMESupport插件:解决软件输入法跟随问题 SublimeREPL插件:可以用于运行和调试一些需要交互的程序如python SublimeCod ...

  6. Python实现决策树C4.5算法

    为什么要改进成C4.5算法 原理 C4.5算法是在ID3算法上的一种改进,它与ID3算法最大的区别就是特征选择上有所不同,一个是基于信息增益比,一个是基于信息增益. 之所以这样做是因为信息增益倾向于选 ...

  7. Unity Mesh 初体验

    什么是Mesh Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成.所以一个3D模型的表面是 ...

  8. linux给文件或目录添加apache权限

    系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,测试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现如下php警告: ...

  9. Design Patterns Uncovered: The Chain Of Responsibility Pattern

    Chain of Responsibility in the Real World The idea of the Chain Of Responsibility is that it avoids ...

  10. flask搭建

    1.定义路由app.py from flask import Flask, request from flask import Blueprint app = Flask(__name__) test ...