如何使应用每次回到前台都跳出锁界面--像以前的支付宝

最近在做一个应用锁的应用,之前介绍了锁其它应用的原理。现在介绍下锁自己,想以前的支付宝一样,每次退到后台后都需要开锁才能进入。


思路是一种在service里面做,这样就像锁别人一样,但这样太慢了,会有一个先进入应用再弹出锁的感觉,这里还有5.0以上判断前台程序的问题,最后放弃了,就不多介绍了。

一种就是在所有activity的onStart里面 判断是回到首页,是则调起我们的锁界面。判断的逻辑是这样的,在退出activity即onStop时发送一个延迟1s的消息,在进入activity即onStart时remove掉这个message,这样如果退出了,这个就执行了,把out设为true,在应用内就不会执行,out还是false。在onStart判断out为true就启动锁界面。代码如下:


public class LockActivityLife implements MajorActivityLife.IActivityLife {


    /**
     * 全局activity生命周期管理。
     * 当前活动计数.
     * <p/>
     * onResume +1
     * onPause -1.
     * <p/>
     * 当活计数 == 0 的时候, 记录一下这个状态A=true
     * 下次如果计数从0变为1, 并且有A状态的时候,就弹锁
     **/
    static boolean out = false;


    public static final int MESSAGE_OUT = 0;
    public static Handler handler
            = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            switch (msg.what) {
                case MESSAGE_OUT:
                    out = true;
                    break;
            }
            super.handleMessage(msg);
        }
    };


    @Override
    public void onCreate(Activity activity) {

    }

    @Override
    public void onDestroy(Activity activity) {

    }

    @Override
    public void onStart(Activity activity) {
        handler.removeMessages(MESSAGE_OUT);
        if (activity instanceof DialogActivity){
            // 弹出的安装确认框,不处理
            return;
        }
        if (out) {
//            Toast.makeText(activity, "Lock", Toast.LENGTH_SHORT).show();
            if (!(activity instanceof GestureUnlockActivity)) {
                LockHelper.getInstance().unLock(activity, LockHelper.getInstance().getLastUnlockListener(), null);

            }
        }
        out = false;
    }

    @Override
    public void onStop(Activity activity) {
        handler.removeMessages(MESSAGE_OUT);
        out = false;
        if(activity instanceof  GestureUnlockActivity){
            handler.sendEmptyMessage(MESSAGE_OUT);
        }
        else{
            handler.sendEmptyMessageDelayed(MESSAGE_OUT, 1000);
        }

    }

    @Override
    public void onResume(Activity activity) {
    }

    @Override
    public void onPause(Activity activity) {
        out = false;
    }
}


这个lifeStyle就是activity生命周期的回调,这样更清晰点。

public final class MajorActivityLife {

    private static final ReentrantReadWriteLock sLock = new ReentrantReadWriteLock();

    private static IActivityLife sLife;

    /**
     * 添加生命周期管理
     * @param life
     */
    public static void addActivityLife(IActivityLife life){
        sLock.writeLock().lock();
        try {
            sLife = life;
        } finally {
            sLock.writeLock().unlock();
        }
    }

    /**
     * 临时用的,获取已设的管理器
     * @return
     */
    public static IActivityLife getActivityLife(){
        sLock.readLock().lock();
        try {
            return sLife;
        } finally {
            sLock.readLock().unlock();
        }
    }


    /**
     * activity 生命周期
     */
    public interface IActivityLife {

        void onCreate(Activity activity);

        void onDestroy(Activity activity);

        void onStart(Activity activity);

        void onStop(Activity activity);

        void onResume(Activity activity);

        void onPause(Activity activity);
    }

}
要在BaseActivity生命周期里去获取我们这个静态自定义的IAcitivityLife,再执行对应方法。

例如在BaseActivity的onStart里面加上:

 MajorActivityLife.IActivityLife life = MajorActivityLife.getActivityLife();
        if (life != null) {
            life.onStart(this);
        }
然后在Application add进去我们的life实现就ok了,即:

 MajorActivityLife.addActivityLife(new LockActivityLife());

这样效果就很不错了,真正写时还会碰到很多逻辑问题,比如锁界面退出立即再进入,这样就会直接进入应用了,所以在锁界面退出发送out消息是立即发送。还有很多其它问题,找到后了解原因也都解决了。这个应用一周开发加测试完成了,直接上线。马上国庆放假,终于可以放松了。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值