一、实现原理:

1.监听屏幕关闭广播。

2.监听home键广播。

二、实现代码

1.创建一个自定义的Application,在Application中注册监听的广播:

public class AssistantApplication extends Application {
public boolean isLocked = false;
LockScreenReceiver receiver ;
IntentFilter filter ;
@Override
public void onCreate() {
super.onCreate();
receiver = new LockScreenReceiver();
         filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        this.registerReceiver(receiver, filter);
}
@Override
public void onTerminate() {
super.onTerminate();
try {
this.unregisterReceiver(receiver);
} catch (Exception e) {
e.printStackTrace();
}
}

class LockScreenReceiver extends BroadcastReceiver {
String SYSTEM_REASON = "reason";  
String SYSTEM_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
/* 在这里处理广播 */
if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
isLocked  = true;
}else if(Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())){
String reason = intent.getStringExtra(SYSTEM_REASON);  
                if (TextUtils.equals(reason, SYSTEM_HOME_KEY)) {  
                     //表示按了home键,程序到了后台  
                isLocked  = true;
                }
}
}
}

2.自定一个全局的BaseActivity,在onResume()方法中判断是否要输入密码打开程序,所有的业务界面都继承这个类:

@Override
protected void onResume() {
super.onResume();
myApplaction = (AssistantApplication) getApplication();
if (Constants.USE_APP_LOCK) {//启用程序锁
if (myApplaction.isLocked) {// 判断是否需要跳转到密码界面
Intent intent = new Intent(this, LockPassActivity.class);
startActivity(intent);
}
}
}

3.实现一个输入密码的界面,继承Activity:

public class LockPassActivity extends Activity {
LinearLayout ll_pass;
AssistantApplication myApplaction;
Button btn_login;
EditText et_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lock_system);
myApplaction = (AssistantApplication) getApplication();
ll_pass = (LinearLayout) findViewById(R.id.ll_pass);

createPassEditView(ll_pass);
}

public void createPassEditView(LinearLayout ll_pass) {
String[] ps = Constants.USER_LOGIN_PASS.split("");
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.width = 100;

for (int i = 0; i < ps.length - 1; i++) {
EditText et = new EditText(this);
et.setId(i + 1);
// et.setLayoutParams(params);
// 密码显示
et.setInputType(InputType.TYPE_CLASS_TEXT
| InputType.TYPE_TEXT_VARIATION_PASSWORD);
et.addTextChangedListener(new MyTextWatcher(ll_pass, i));
ll_pass.addView(et);
}
}

class MyTextWatcher implements TextWatcher {
LinearLayout ll_pass;
int index;

public MyTextWatcher(LinearLayout ll_pass, int index) {
this.ll_pass = ll_pass;
this.index = index;
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub

}

@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub

}

@Override
public void afterTextChanged(Editable s) {
if (s.toString().length() == 1) {
if (index < ll_pass.getChildCount() - 1) {
EditText et1 = (EditText) ll_pass.getChildAt(index);
EditText et2 = (EditText) ll_pass.getChildAt(index + 1);
if (et1.isFocused()) {
et1.clearFocus();
if (Character.isDigit((et1.getText().toString())
.charAt(0))) {// 判断前一个输入的是否是数字
et2.setRawInputType(InputType.TYPE_CLASS_NUMBER
| InputType.TYPE_TEXT_VARIATION_PASSWORD);
}
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null) {
inputMethodManager.restartInput(et2);
}
et2.requestFocus();
}
} else if (index == ll_pass.getChildCount() - 1) {// 是最后一个
EditText et1 = (EditText) ll_pass.getChildAt(index);
if (et1.isFocused()) {
et1.clearFocus();
String password = "";
for (int i = 0; i < ll_pass.getChildCount(); i++) {
EditText et = (EditText) ll_pass.getChildAt(i);
password += et.getText().toString();
}
if (password != null
&& password.equals(Constants.USER_LOGIN_PASS)) {
Toast.makeText(LockPassActivity.this, "密码正确!",
Toast.LENGTH_SHORT).show();
myApplaction.isLocked = false;
LockPassActivity.this.finish();
} else {
Toast.makeText(LockPassActivity.this, "密码错误!",
Toast.LENGTH_SHORT).show();
for (int i = 0; i < ll_pass.getChildCount(); i++) {
((EditText) ll_pass.getChildAt(i)).setText("");
}
}
}
}
}
}

}
}

以上代码就是实现程序锁的过程。

实现安卓应用程序锁功能相关推荐

  1. Android:程序锁功能的简单实现

    如我们所知,现在有很多牛逼的安全软件都带有程序锁的功能.当然,名字可能不一样,有的叫隐私保护,有的叫软件锁.等等.但是这种名字其实都是表达一种意思,就是可以给你手机里面的app加以保护.只有你给你的A ...

  2. Android开发——程序锁的实现(可用于开发钓鱼登录界面)

    1. 程序锁原理 1.1 实现效果: 在用户打开一个应用时,若此应用是我们业务内的逻辑拦截目标,那就在开启应用之后,弹出一个输入密码的界面,输入密码正确则进入目标应用.若不输入直接按返回键,则直接返回 ...

  3. Android程序锁的实现

    1.程序功能介绍 本程序实现对特定应用的监听,当特定应用前台运行时,立刻弹出本程序锁应用界面,用户输入正确密码后,才能转到特定应用继续使用,用户点击后退按钮无效,点击home键后,再启动被锁应用后,仍 ...

  4. android程序锁预研

    项目要求增加程序锁功能.要预研一下. 网上反编了比较流行的程序锁,了解到大概方向: 1 后台服务不断监视显示在前台的应用. 2 当是需要锁住的应用,启动程序锁密码页面. 3 密码成功则关闭程序锁密码页 ...

  5. 浅谈手机卫士之程序锁

    前言: 随着互联网技术的快速发展,我们的饮食居行已越来越离不开智能手机了.手机,已然成为我们生活的重心.而对手机的保护,则显得非常重要.不少手机都有手机卫士等功能类似的安全软件.今天,我们就来探讨一下 ...

  6. 生活小程序摩拜单车为啥投开锁功能?生活小程序是趋势?

    这段时间,我和家里人一直都在使用摩拜单车这个目前在生活小程序中最火的小程序,几乎现在武汉大街小巷都有摩拜单车的身影!我妈也是下班天天骑单车,我也开心不少.而且我妈还告诉我让我去下载个APP叫亿里财,这 ...

  7. 智慧新零售收银系统包含pc源码安卓小程序进销存等等功能

    智慧新零售收银系统包含pc源码安卓小程序进销存等等功能这里写自定义目录标题 欢迎使用智慧新零售收银系统 欢迎使用智慧新零售收银系统 零售开发语言有:php.HTML5.Java 安卓端收银.助手:原生 ...

  8. 适用于Android设备的十大应用程序锁

    现如今的智能手机非常个人化,其中的应用程序确实会携带不同形式的个人数据,例如图片,消息,银行应用程序等. 应用锁也称为隐私锁,它是所有移动用户最关注的隐私问题之一.可以保护应用程序免受陌生人或在智能手 ...

  9. 微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

    一.支付相关文档地址 支付wiki:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml 支付api: https://pay.weixin.qq. ...

最新文章

  1. dlib 怎么安装vs2017_VS2017(Visual Studio2017) 搭建QT5开发环境
  2. 腾讯ARC、华中科大联合提出QueryInst,开启基于Query的实例分割新思路
  3. Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程
  4. java 连接redis 以及基本操作
  5. mysql子分区多少层_MySQL 子分区-阿里云开发者社区
  6. redhat bash: yum: 未找到命令..._常用linux yum 命令和 vim命令,这几个要熟记
  7. css3的新增选择器 200303
  8. apt-get安装mysql
  9. 我怕三十的红包太多,先发为敬!
  10. 【转载】一些重要的java知识点:JVM内存模型和结构
  11. Oracle 锁表查询及解锁
  12. PHP 之建行龙支付 - 被扫查单(商家扫码客户二维码),查询订单是否付款成功
  13. C++异常处理throw
  14. mysql数据库有什么应用场景_科普:云数据库MySQL的几种应用场景
  15. Win10系统电脑声卡驱动正常但没声音?驱动人生解决方案
  16. 佳能(数码相机)SDK使用记录
  17. Daily Growing 的歌词
  18. 微服务架构之限流熔断
  19. CSS overflow的几种属性值
  20. 数据分析(六)之pandas学习【Series创建、切片、索引和读取外部数据】

热门文章

  1. 常用快递物流查询接口对接案例
  2. 四大名著开篇诗词:句句都是真理,道尽人生玄机
  3. 小样本图像语义分割综述
  4. linuxprobe 第0章
  5. python readlines返回值_Python readlines没有返回任何内容?
  6. hikari连接池属性详解
  7. 关于微信小程序wx:for不起作用的原因之一。。
  8. 大话设计模式——第二章:商场促销策略模式
  9. 网络爬虫是个什么东西(一)
  10. Jmeter察看结果树之Document使用