最近在做一个应用锁的应用,之前介绍了锁其它应用的原理。现在介绍下锁自己,想以前的支付宝一样,每次退到后台后都需要开锁才能进入。
思路是一种在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;
}
}
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消息是立即发送。还有很多其它问题,找到后了解原因也都解决了。这个应用一周开发加测试完成了,直接上线。马上国庆放假,终于可以放松了。