Android登录界面防止被劫持,目前没有好的反劫持方法,只能提醒用户登陆界面被劫持,具体实施如下:

涉及到的工具类:

import android.app.ActivityManager;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/**** Activity反劫持检测工具** 在用户使用app的时候,如果被恶意程序劫持跳转到别的界面,* 这个时候我们就要做出预警提示用户,告诉用户当前界面已经不是我们的app有潜在的危险.* 代码的工作原理很简单就是在我们所写的activity对象的Onstop生命周期判断,* 将要跳转的界面是否是安全的。具体代码如下:** created by ww 2/22/21 11:30 AM*/public class AntiHijackingUtil {public static final String TAG = "AntiHijackingUtil";/*** 检测当前Activity是否安全*/public static boolean checkActivity(Context context) {PackageManager pm = context.getPackageManager();// 查询所有已经安装的应用程序List<ApplicationInfo> listAppcations =pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);Collections.sort(listAppcations, new ApplicationInfo.DisplayNameComparator(pm));// 排序List<String> safePackages = new ArrayList<>();for (ApplicationInfo app : listAppcations) {// 这个排序必须有.if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {safePackages.add(app.packageName);}}// 得到所有的系统程序包名放进白名单里面.ActivityManager activityManager =(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);String runningActivityPackageName;int sdkVersion;try {sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);} catch (NumberFormatException e) {sdkVersion = 0;}if (sdkVersion >= 21) {// 获取系统api版本号,如果是5x系统就用这个方法获取当前运行的包名runningActivityPackageName = getCurrentPkgName(context);} else {runningActivityPackageName =activityManager.getRunningTasks(1).get(0).topActivity.getPackageName();}// 如果是4x及以下,用这个方法.if (runningActivityPackageName != null) {// 有些情况下在5x的手机中可能获取不到当前运行的包名,所以要非空判断。if (runningActivityPackageName.equals(context.getPackageName())) {return true;}// 白名单比对for (String safePack : safePackages) {if (safePack.equals(runningActivityPackageName)) {return true;}}}return false;}private static String getCurrentPkgName(Context context) {// 5x系统以后利用反射获取当前栈顶activity的包名.ActivityManager.RunningAppProcessInfo currentInfo = null;Field field = null;int START_TASK_TO_FRONT = 2;String pkgName = null;try {// 通过反射获取进程状态字段.field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");} catch (Exception e) {e.printStackTrace();}ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List appList = am.getRunningAppProcesses();ActivityManager.RunningAppProcessInfo app;for (int i = 0; i < appList.size(); i++) {//ActivityManager.RunningAppProcessInfo app : appListapp = (ActivityManager.RunningAppProcessInfo) appList.get(i);//表示前台运行进程.if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {Integer state = null;try {state = field.getInt(app);// 反射调用字段值的方法,获取该进程的状态.} catch (Exception e) {e.printStackTrace();}// 根据这个判断条件从前台中获取当前切换的进程对象if (state != null && state == START_TASK_TO_FRONT) {currentInfo = app;break;}}}if (currentInfo != null) {pkgName = currentInfo.processName;}return pkgName;}/*** 判断当前是否在桌面** @param context 上下文*/public static boolean isHome(Context context) {ActivityManager mActivityManager =(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);return getHomes(context).contains(rti.get(0).topActivity.getPackageName());}/*** 获得属于桌面的应用的应用包名称** @return 返回包含所有包名的字符串列表*/private static List<String> getHomes(Context context) {List<String> names = new ArrayList<String>();PackageManager packageManager = context.getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);for (ResolveInfo ri : resolveInfo) {names.add(ri.activityInfo.packageName);}return names;}/*** 判断当前是否在锁屏再解锁状态** @param context 上下文*/public static boolean isReflectScreen(Context context) {KeyguardManager mKeyguardManager =(KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);return mKeyguardManager.inKeyguardRestrictedInputMode();}
}

使用方法:

在onPause()方法中调用,提醒用户

 @Overrideprotected void onPause() {//若程序进入后台不是用户自身造成的,则需要弹出警示
//        if(needAlarm) {//弹出警示信息
//            Toast.makeText(getApplicationContext(), "您的登陆界面被覆盖,请确认登陆环境是否安全", Toast.LENGTH_SHORT).show();
//            //启动我们的AlarmService,用于给出覆盖了正常Activity的类名
//            Intent intent = new Intent(this, AlarmService.class);
//            startService(intent);
//        }new Thread(new Runnable() {@Overridepublic void run() {// 白名单boolean safe = AntiHijackingUtil.checkActivity(getApplicationContext());// 系统桌面boolean isHome = AntiHijackingUtil.isHome(getApplicationContext());// 锁屏操作boolean isReflectScreen = AntiHijackingUtil.isReflectScreen(getApplicationContext());// 判断程序是否当前显示if (!safe && !isHome && !isReflectScreen) {Looper.prepare();Toast.makeText(getApplicationContext(), "您的登陆界面被覆盖,请确认登陆环境是否安全",Toast.LENGTH_LONG).show();Looper.loop();}}}).start();super.onPause();}

Android登录界面防劫持提醒处理相关推荐

  1. APP界面防劫持,处于后台时弹窗提示

    当程序处于后台时弹窗提醒,防止其他APP界面劫持 1. 实现对APP所有Activity生命周期的监控 顶层activity中onStope方法被执行,则认为程序处于后台.由于Activity被销毁或 ...

  2. android登录界面扁平,Android EditText实现扁平化的登录界面

    先来看看登录界面写完的效果图 2 监听editText,可以一键清空 3 checkBox的颜色统一 代码 下面,说说如何实现这个界面的,我将代码全部贴出来. xmlns:app="http ...

  3. android登录界面

    在网上在到一个登录界面感觉挺不错的,给大家分享一下~先看效果图: 这个Demo除了按钮.小猫和Logo是图片素材之外,其余的UI都是通过代码实现的. 一.背景 背景蓝色渐变,是通过一个xml文件来设置 ...

  4. Android 界面防劫持

    目录 一.什么是页面劫持 二.页面劫持常用攻击手段 三.如何防范页面劫持 3.1 用户方面 3.2 开发者方面 四.参考 一.什么是页面劫持 界面劫持是指在Android系统中,恶意软件通过监控目标软 ...

  5. Android 登录界面Demo源码

    2019独角兽企业重金招聘Python工程师标准>>> 布局分析:分成三个部分,该Activity是一个无标题的,设置无标题需要在setContentView之前设置,否则会报错, ...

  6. android登陆界面设计方案,011android初级篇之android登录界面的设计

    设计目标 密码账户的输入 输入账户时,自动显示匹配账户 没有帐号,显示官网超链接 登录框的自动提示功能参考一下链接中的AutoCompleteTextView的使用 布局文件 android:orie ...

  7. android登录界面居中,Android TextView前加图标垂直居中第一行(仿大众点评购买须知/提示语)...

    如上图,需求在每条提示语句前加一个小圆点,我刚看到需求就想到用 android:drawableLeft 来做,可做完发现:当TextView内容为单行的时候是没有问题的,多行的时候,添加的这个dra ...

  8. android 登录界面开源代码_【程序源代码】一个安卓查询类app制作的开源项目

    " 关键字:工作流 框架 springboot" 正文:一个学习安卓查询类app制作的开源项目.可以用来联系查询类app的编写. 01 - android studio最近势头好猛 ...

  9. android登录界面优化,Android 对登陆页面的美化(一)

    对登陆页面的美化(一) 对EditeText的美化 非常简单的实现浮动标签EditText: Android视图使用EditText之上,并提示EditText时填充文本. 核心代码不超过50行 先上 ...

最新文章

  1. AI一分钟 | 黎曼猜想已被证明?对错有待同行评议;讯飞与发帖质疑同传译员达成谅解...
  2. 跟随一笔交易来看以太坊c++客户端源码执行流程 / 源码分析
  3. ubuntu 更新软件
  4. Python中if __name__ == ‘__main__‘:的作用和原理(自用笔记)
  5. 16、修改数据表的存储引擎
  6. OpenCASCADE:绘制测试线束之入门
  7. 【CKEditor】下载历史版本4.8.x
  8. Hyper-V 嵌套虚拟化
  9. ajax post 与get方法 data写法
  10. 软件需求文档范例_【设计API系列】 一文了解常见的事件驱动APIs范例
  11. java泛型与c 泛型,Java泛型代码编译与javac,失败与Eclipse Helios
  12. 统计平方和三元组的数目
  13. 拓端tecdat|Python贝叶斯回归分析住房负担能力数据集
  14. 微信小程序实现用户登录(详)
  15. HTML+CSS实现前端网页界面案例
  16. ps抠图技巧,抠头发
  17. c语言购买电影票程序,求助,怎么改把程序产生数据写入文件里,电影票管理系统,大佬们...
  18. EPICS -- pyDevice
  19. “我只警告一次,下次我会直接忽略你发的垃圾,懂?”Linus 精彩炮轰语录集锦...
  20. RT-Thread Studio学习 驱动攀藤PMS5003ST PM2.5传感器

热门文章

  1. 计算机网络XP系统电路,WindowsXP系统下建立局域网让多个计算机连接上网
  2. linux suse git,SUSE 搭建GIT服务
  3. React受控组件非受控组件
  4. 程序员必懂的15大定律和7大原则
  5. 有关计算机的应用的文章,关于计算机常用软件的论文参考文献 计算机常用软件参考文献有哪些...
  6. 一文通数据结构与算法之——链表+常见题型与解题策略+Leetcode经典题
  7. 谷歌广告推广效果不佳的原因
  8. python decimal类型转化_python中的decimal类型转换实例详解
  9. 电脑蓝屏了怎么解决? 旧时光 oldtimeblog
  10. 36、RK3399Pro 环境搭建和Yolov5 c++调用opencv进行RKNN模型部署和使用