android屏幕锁屏后在某个界面里需要重新输入密码

来源:互联网 发布:淘宝上历史报价 编辑:程序博客网 时间:2024/05/17 06:33

最近做项目,用户需要在账单界面加入四位简码输入验证的功能,类似于支付宝那样的,屏幕黑屏以后,再次打开,再次进入账单界面的 时候需要重新输入四位简码,主界面我们是用Activity实现,几个模块的一级界面都是fragment,因此上述需求涉及到三个主要问题,

第一个问题,账单界面的fragment如果用户输入正确了,该fragment如何通知主界面Activity,这个问题的本质是fragment和Activity之间通信的问题。解决办法就是采用回调函数,具体点说,就是在fragment里写个内部类的接口,然后让Activity来继承这个接口,并在Activity里面去实现,那么fragment怎么和Activity关联到一起呢,常识问题,fragment启动时会调用生命周期的onAttach函数,它的函数原型如下:

@Overridepublic void onAttach(Activity activity) {// TODO Auto-generated method stubsuper.onAttach(activity);}
很明显,这个参数就是主Activity,因此在这里将接口绑定到Activity就行了。当然了,在fragment里要声明一个内部内接口的变量,比如命名为mListener。

private OnGoHomeAndLockListener mListener;//@Overridepublic void onAttach(Activity activity) {// TODO Auto-generated method stubsuper.onAttach(activity);try {            <span style="color:#ff6666;">mListener = (OnGoHomeAndLockListener) activity;</span>         } catch (ClassCastException e) {        Toast.makeText(getActivity(), activity.toString() + "没有实现回调接口哦 OnGoHomeAndLockListener", Toast.LENGTH_SHORT).show();            //throw new ClassCastException(activity.toString() + " must implementOnArticleSelectedListener");        }}

fragment里的接口的定义如下,这是个内部类,要写在fragment子类里面

//返回主界面回调接口public interface OnGoHomeAndLockListener {        public void onGoHomeAndLockListener();    }

当然,主Activity还要继承该接口,具体代码如下:

public class IndexPageActivity extends FragmentActivity implementsOnClickListener,OnGoHomeListener,OnGoHomeAndLockListener{.........}

fragment里定义和绑定都搞定了,就是调用这个接口里的函数了,具体在哪里调用是第三个问题。

第二个问题,怎么判断手机屏幕锁屏,这个问题就是常识问题,手机锁屏会发送广播,写一个类来接收广播,然后在监听到锁屏的时候,把锁屏状态记录下来,写入sharereference里面,


第三个问题,锁屏后再次打开app的时候,什么时候打开验证界面,让用户输入密码,而且不影响用户查看其它模块的信息呢? 这个问题其实的本质是fragment的生命周期的问题,首先,因为我要实现的需求是,当用户选择了账单这个模块以后,才弹出验证界面,用户如果不验证,还是可以看其它模块的信息的,所以,要弹出验证界面肯定是在这个账单fragment的生命周期里,下一个问题是,具体在fragment的哪个生命周期函数里来通知Activity更换账单fragment为验证fragment呢,很简单,又是常识问题,当锁屏的时候,屏幕黑掉之前会调用fragment和Activity的onPause函数,当唤醒屏幕后,打开应用,会执行fragment和Activity的onResume函数,所以,通知Activity更换fragment的操作要放在账单fragment的onResume函数中。调用语句如下:

@Overridepublic void onResume() {// TODO Auto-generated method stubsuper.onResume();mListener.onGoHomeAndLockListener();Log.i("diao", "PaymentFragment-------------onResume");}
具体在这个接口函数onGoHomeAndLockListener做什么,当然是隐藏之前的账单fragment,显示验证fragment具体代码如下,这部分代码是在实现了onGoHomeAndLockListener接口的Activity中。代码中首先判断了一下屏幕锁屏的状态和当前显示的fragment是否是账单fragment,如果不判断当前显示的fragment是不是账单fragment的话,用户就无法查看其它模块了,代码中pay_F是账单fragment,lock_F是锁屏fragment。

@Overridepublic void onGoHomeAndLockListener() {// TODO Auto-generated method stub//判断是否用户之前锁屏if(mySharedPreferences.getString("ScreenState", "off").equals("off") &&pay_F.isVisible()){// 锁屏界面if (lock_F == null) {lock_F = new PaymentLockFragment();// 判断当前界面是否隐藏,如果隐藏就进行添加显示,false表示显示,true表示当前界面隐藏if (!lock_F.isHidden()) {addFragment(lock_F);showFragment(lock_F);}}else {if (lock_F.isHidden()) {showFragment(lock_F);}}}}
具体锁屏后的效果图如下:



0 0