安卓应用程序密码锁的实现

功能:

1.应用程序程序中设置了密码锁,每当用户打开应用时,要弹出密码输入界面;

2.当用户按住home键,将程序隐在后台而非退出,经过一段时间后,再重新启动,也要弹出密码输入界面;

3.当应用在前台的时候,用户按住power电源键,关闭屏幕后,再点亮屏幕,这个时候也要弹出密码输入界面

实现方式:

1.针对功能1,每次启动应用进入主界面时,判断是否需要弹出密码输入界面;

2.关键点在于怎么判断程序是否处在前台跟后台。

判断方法:

public static boolean isAppOnForeground(Context context) {
     ActivityManager activityManager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
     String packageName = context.getApplicationContext().getPackageName();
     List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
     if(appProcesses == null)
          return false;
     for(RunningAppProcessInfo appProcess : appProcesses) {
          if(appProcess.processName.equals(packageName) && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
               return true;
          }
     }
     return false;
}

其主要原理是:获取当前正在运行的所有进程,根据进程名字进行逐一比较(默认应用程序进程名字为包名),

并且当前进程的 importance 为IMPORTANCE_FOREGROUND,及该进程处在前台。

在Activity中加一个boolean变量 mIsActive = true,默认为true。

在所有Activity的onStop中做一次判断:

protected void onStop() {
     super.onStop();
     if(!isAppOnForeground(this)) {
          mIsActive = false;
     }
}

在相应Activity的onRestart()中判断:

protected void onRestart() {
     if(!mIsActive) {
          mIsActive = true;
          //弹出密码框输入界面
          //.………...
     }
}

3.监听锁屏广播:ACTION_SCREEN_ON

在Application里注册一个广播:

public static boolean IS_FOREGROUND = false;

public class ScreenActionReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
     String action = intent.getAction();
     if (action.equals(Intent.ACTION_SCREEN_ON)) {
               //用户点亮屏幕
               //判断是否需要弹出密码锁来
               if(IS_FOREGROUND) {
                    //如果应用程序恰好处在前台,则弹出密码锁界面来
               }
         } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
               //用户关闭屏幕
     }
}

在自己的Application的onCreate()里注册该BroadcastReceiverd的实例:

if(mScreenActionReceiver == null) {
     mScreenActionReceiver = new ScreenActionReceiver();
     IntentFilter screenfilter = new IntentFilter();
     screenfilter.addAction(Intent.ACTION_SCREEN_OFF);
     screenfilter.addAction(Intent.ACTION_SCREEN_ON);
     registerReceiver(mScreenActionReceiver, screenfilter);
}

注意点:

在收到屏幕点亮通知的时候,要判断应用程序是否在前台,如果不在前台,则不要把密码锁界面掉出来。

在这个时候调用isAppOnForeground()方法,发现会返回true,也就是程序在收到这个广播的时候,

系统认为应用跑到foreground来了。

解决方法:在Application中设置一个变量IS_FOREGROUND,

在Activity的onCreate()、onStop()、onRestart()中进行判断并设置该变量的值。

时间: 2024-11-04 17:11:03

安卓应用程序密码锁的实现的相关文章

初识安卓小程序(点击按钮切换屏幕颜色)

如图,点击按钮就会切换屏幕的颜色 首先,先创建一个安卓项目(我的版本是4.4.2的),名字为"world",当然,也可以别的名称 然后在res文件夹下找到layout文件夹,找到activity_main.xml或fragment_main.xml,在里面输入或拖拽按钮 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

初识安卓小程序(Android短信发送器)

首先,先创建一个安卓项目(我的版本是4.4.2的),名字为"短信发送器" 然后在res文件夹下找到layout文件夹,找到activity_main.xml或fragment_main.xml,在里面输入或拖拽按钮 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tool

初识安卓小程序(Android电话拨号器)

首先,先创建一个安卓项目(我的版本是4.4.2的),名字为"电话拨号器",创建的时候点击"clipart",如图: 然后在res文件夹下找到layout文件夹,找到activity_main.xml或fragment_main.xml,在里面输入或拖拽按钮 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="

初识安卓小程序(开关灯——单选多选按钮控制)

如图: 点击单选按钮"开灯",多选按钮就会显示"关灯"且方块里有对勾:反之,点多选按钮,单选按钮也自动改变. 首先,先创建一个安卓项目(我的版本是4.4.2的),名字为"bulb",把两张图片:开灯与关灯状态的图片放入"drawable-"随意一个文件夹下 然后在res文件夹下找到layout文件夹,找到activity_main.xml或fragment_main.xml,在里面输入或拖拽按钮 <RelativeLay

Android项目实战(二):安卓应用程序退出的三种方法

原文:Android项目实战(二):安卓应用程序退出的三种方法 现在的APP退出的时候都不是让用户点击了“后退键”就退出.防止用户点错了后退键而造成的用户体检不好. 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: 一.按一次后退键显示一个对话框决定是否退出 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 // TODO Auto-generated m

一个实时获取股票数据的安卓应用程序

关键字:Stock,股票,安卓,Android Studio. OS:Windows 10. 最近学习Android应用开发,不知道写一个什么样的程序来练练手,正好最近股票很火,就一个App来实时获取股票数据,取名为Mystock.使用开发工具Android Studio,需要从Android官网下载,下载地址:http://developer.android.com/sdk/index.html.不幸的是Android是Google公司的,任何和Google公司相关的在国内都无法直接访问,只能

一个安卓小程序-云播放(开源)

git 地址  https://github.com/wangxiaoli/MyYunbo 实现原理 用户输入播放链接 客户端进行链接处理,比如FTP,HTTP进行中文编码,转成thunder格式.Ed2k链接进行文件名提取转换和hash码提取等. 客户端向服务器查询播放链接的云端地址. 客户端获取到云端播放地址后进行选择处理,选择解码器进行播放. 客户端进行记录播放进度,以便恢复播放. 客户端进行云端地址的hash存储.减轻服务器压力. 项目依赖 AndBase v1.6下载地址 http:/

安卓入门程序《打电话》

声明:本人是新入门的菜鸟.这个是我学安卓第一课.从黑马程序员的视频学来的.哈哈.好像无意间给黑马做了广告.因为我的视频资源也是网上找来的.所以如果有朋友需要,就在博客下留言.我会用网盘发给你的.一套有60G...我希望我能看完后找到一份安卓开发的工作. 顺便说一下,现在Android Studio已经能不错了.很多做安卓开发的同学也跟我说用了Android Studio后就在也回不去Eclipse了.但是我还是喜欢Eclipse,比较小,而且视频教程用的是Eclipse,所以我不用AS了. 好了

[安卓]应用程序资源(App Resources)

谷歌推荐我们,在开发安卓系统应用程序的时候,要把资源从代码中分离出来,这样便于我们单独维护它们.采取分离的资源设计,我们还可以提供可选资源,支持特定的设备配置譬如不同的语言或屏幕尺寸,随着越来越多的Android设备可选用不同的配置,这变得越来越重要.为了提供不同配置的兼容性,你必须在你的项目的res/目录中组织资源.按类型和配置,使用不同的子目录. 对于任何类型的资源,你可以为你的应用程序提供一个默认和多个可选资源: 默认资源就是不管你什么配置我都强制使用或者没有满足配置的可选资源时使用的资源