手势锁 在本app中使用

一.原理:
主要根据应用前后台的切换,来进行判断是否需要进入手势锁.

二:实现

本案例中使用的是application中的 ActivityLifecycleCallbacks 接口

public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

需要在自定义的application中注册使用 方法:registerActivityLifecycleCallbacks();
一下是单例封装:

package com.publicinfo.www.forgroundbanckdemo;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;

/**
 * Created by wtz on 2017/4/14.
 * <p/>
 *   ┏┓   ┏┓+ +
 *  ┏┛┻━━━┛┻┓ + +
 *  ┃       ┃
 *  ┃   ━   ┃ ++ + + +
 * ████━████ ┃+
 *  ┃       ┃ +
 *  ┃   ┻   ┃
 *  ┃       ┃ + +
 *  ┗━┓   ┏━┛
 *    ┃   ┃
 *    ┃   ┃ + + + +
 *    ┃   ┃
 *    ┃   ┃ +  神兽保佑
 *    ┃   ┃    代码无bug
 *    ┃   ┃  +
 *    ┃    ┗━━━┓ + +
 *    ┃        ┣┓
 *    ┃        ┏┛
 *    ┗┓┓┏━┳┓┏┛ + + + +
 *     ┃┫┫ ┃┫┫
 *     ┗┻┛ ┗┻┛+ + + +
 */
public class BaseTaskSwitch implements Application.ActivityLifecycleCallbacks {
    //计数器
    private int mCount = 0;
    private OnEntryGestureLockListener mOnEntryGestureLockListener;
    private static BaseTaskSwitch mBaseLifecycle;
    // 最后离开的事件
    private double lastTime = 0;
    // 根据该时间判断,应用进入后台多少时间需要进入lock界面
    private double spaceTime = 1000;
    //单例
    private static Class mLockClazz;
    //lockClazz : 手势锁代表的class
    public static BaseTaskSwitch init(Application application,Class lockClazz) {
        if (null == mBaseLifecycle) {
            mBaseLifecycle = new BaseTaskSwitch();
            application.registerActivityLifecycleCallbacks(mBaseLifecycle);
            mLockClazz = lockClazz;
        }
        return mBaseLifecycle;
    }
    private BaseTaskSwitch setSpaceTime (double spaceTime) {
        this.spaceTime = spaceTime;
        return mBaseLifecycle;
    }
    //记录不需要进入的activity
    private static ArrayList<String> clazz = new ArrayList<>();
    //设置哪些界面不需要进入手势锁
    public BaseTaskSwitch setNotInLockActivityList(Class... list) {
        for (Class aClass : list) {
            clazz.add(aClass.getName());
        }
        return mBaseLifecycle;
    }
    //设置 进入后台多少时间 不用lock
    public void setOnSpaceTime() {
        this.spaceTime = spaceTime;
    }
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

    }
    //标记
    private boolean isShouldEnEntryGestureLock = false;

    @Override
    public void onActivityStarted(Activity activity) {
        if (mCount++ == 0) {  //进入前台
            if (new BigDecimal(new Date().getTime()).subtract(new BigDecimal(lastTime)).doubleValue() > spaceTime
                    && !activity.getClass().getName().equals(mLockClazz.getName())) {
                isShouldEnEntryGestureLock = true;
            }
        }
        if (isShouldEnEntryGestureLock) {
            if (!clazz.contains(activity.getClass().getName())) {
                    mOnEntryGestureLockListener.onEntryed( activity );
                    isShouldEnEntryGestureLock = false;
                }
        }

    }

    @Override
    public void onActivityResumed(Activity activity) {

    }

    @Override
    public void onActivityPaused(Activity activity) {}

    @Override
    public void onActivityStopped(Activity activity) {
        if (--mCount == 0) {   //进入后台
            lastTime = new Date().getTime();
//
        }
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}

    @Override
    public void onActivityDestroyed(Activity activity) {}


    public void setOnEntryGestureLockListener(OnEntryGestureLockListener listener){
        mOnEntryGestureLockListener = listener;
    }
    public interface OnEntryGestureLockListener{

        public void onEntryed(Activity activity);
    }

}

在自定义application中:

public class MyApplication  extends Application{
    private boolean isShouldLock = false;
    @Override
    public void onCreate() {
        super.onCreate();
        //前后台切换
        BaseTaskSwitch.init(this,Lock.class).setNotInLockActivityList(MainActivity.class,Lock.class)
                .setOnEntryGestureLockListener(new BaseTaskSwitch.OnEntryGestureLockListener() {
            @Override
            public void onEntryed(Activity activity) {
                Intent intent=new Intent();

                intent.setClass(MyApplication.this, Lock.class);

                activity.startActivity(intent);

            }
        });
    }
}

最后: 在 AndroidManifest 文件中,把lock的lauchmode模式设置为:singleTop

三:参考资料
http://www.jianshu.com/p/6b3b1449123b

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值