一.原理:
主要根据应用前后台的切换,来进行判断是否需要进入手势锁.
二:实现
本案例中使用的是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