Android应用密码的实现

最近做了一个demo——功能是给自己的应用加锁,访问的时候需要输入密码,并且每次锁屏再开之后都需要重新输入密码。

主要思路:

  1. 设置一个全局变量表示当前应用的状态(布尔值:已锁定|已解锁),在每个Activity显示之前进行状态判断,如果当前为锁定状态,则终止显示,跳转到密码界面。
  2. 在密码界面输入正确的密码之后,将应用状态改为已解锁,并返回继续显示之前的Activity;否则继续要求输入密码。
  3. 注册一个广播接收,监听系统的锁屏事件,有锁屏事件发生时,将应用的状态改为已锁定。(即每次锁屏之后需要重新输入密码)


具体实现:

1. 全局变量的实现

1.1 用一个全局的静态变量当然是OK的。
1.2 不过在Android上我们可以用一个更“优雅”一点的实现:利用Android的Application对象(文档)。
  • 写一个MyApplication类,继承自android.app.Application。
  • 在MyApplication中定义一个状态变量,并且在onCreate()方法中进行初始化。
  • 在AndroidMainfest.xml中在标签添加name属性,值为MyApplication的完整类名。

    android:name="barry.demo.passwordApp.MyApplication"dg

  • 则在此标签下的所有Activity中,都可以用MyApplication myApplaction = (MyApplication) getApplication();来获取MyApplication的实例并使用或修改其中的变量了。

2. 根据状态判断是否需要输入密码

由于onResume()方法是Activity每次显示或者重绘都会调用的方法(见Activity的生命周期),所以可以在此方法中进行状态判断。

具体做法可以是:

  • 写一个用于输入密码的界面PasswordActivity;

  • 写一个BaseActivity,在其中的onResume()方法中写入判断代码,然后其余所有Activity都继承自此BaseActivity——当然,密码界面PasswordActivity除外。

BaseActivity大概长这个样子:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class BaseActivity extends Activity {  
  2.     MyApplication myApplaction;  
  3.     protected void onResume() {  
  4.         super.onResume();  
  5.         myApplaction = (MyApplication) getApplication();  
  6.         if (myApplaction.isLocked) {//判断是否需要跳转到密码界面  
  7.             Intent intent = new Intent(this, PasswordActivity.class);  
  8.             startActivity(intent);  
  9.         }  
  10.     };  
  11. }  

PasswordActivity大概长这个样子:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class PasswordActivity extends Activity {  
  2.   
  3.     MyApplication myApplaction;  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.           
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_password);  
  10.         myApplaction = (MyApplication) getApplication();  
  11.           
  12.         final EditText editTextPassword = (EditText) findViewById(R.id.editTextPassword);  
  13.           
  14.         findViewById(R.id.button1).setOnClickListener(new OnClickListener() {  
  15.   
  16.             @Override  
  17.             public void onClick(View v) {  
  18.   
  19.                 String password = editTextPassword.getText().toString();  
  20.                 if (password != null && password.equals(myApplaction.password)) {  
  21.                     Toast.makeText(PasswordActivity.this"密码正确!", Toast.LENGTH_SHORT).show();  
  22.                     myApplaction.isLocked = false;  
  23.                     PasswordActivity.this.finish();  
  24.                 } else {  
  25.                     Toast.makeText(PasswordActivity.this"密码错误!", Toast.LENGTH_SHORT).show();  
  26.                     editTextPassword.setText("");  
  27.                 }  
  28.             }  
  29.         });  
  30.     }  
  31. }  



3. 监听锁屏事件

经过以上两步,就可以实现应用的加锁了——在打开的应用的时候,就会自动跳转到密码界面,输入密码之后再进入内容Activity。——但是这只会在程序打开的时候输入一次密码,如果程序没有彻底关闭,那么把手机锁屏之后再打开,依然还是不需要输入密码。

要实现在手机锁屏之后再打开就要求密码,就必须要监听手机的锁屏事件了,在锁屏之后把应用状态改为锁定,这样再打开就会重新要求输入密码了。

3.1 监听锁屏的实现

诸如系统开机、锁屏、开屏、联网状态改变、有电话进来、有短息进来、系统电量过低等等,各种系统状态发生改变的时候,Android系统本身都会发一个广播。

我们要做的,就是要注册一个广播接受器,用其监听系统广播,当发现有锁屏事件发生的时候更改应用的状态。

由于这个广播接受器应该是启动应用时就创建的,而且是属于应用全局的,所以我们把它创建在MyAppLication类中,在MyApplication的onCreate()方法中进行初始化,在onTerminate()方法中取消注册。

3.2 构建广播接受器

构建一个广播接受器很简单,只需要继承android.content.BroadcastReceiver类,并且实现其中的onReceive()方法就好,在onReceive()中做接到广播之后的处理。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. class LockScreenReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         /* 在这里处理广播 */  
  5.         if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {  
  6.             isLocked  = true;//把应用状态设为锁定  
  7.         }  
  8.     }  
  9. }  

3.3 注册广播

构建一个IntentFilter过滤器,在其中添加需要接收的广播类型,然后调用Context的registerReceiver方法。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //注册  
  2. receiver = new LockScreenReceiver();  
  3. filter = new IntentFilter();  
  4. filter.addAction(Intent.ACTION_SCREEN_OFF);  
  5. this.registerReceiver(receiver, filter);  
  6. //取消注册  
  7. this.unregisterReceiver(receiver);  




至此,一个输入密码才能访问的应用demo就基本OK了。

Demo代码下载: 地址

界面比较丑陋,有时间再改一下。


同步发表在 http://www.barryzhang.com/archives/146

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值