有很多地方需要登陆,当用户点击该控件如果用户未登录的情况下,会触发登陆,在登陆成功的时候,我们希望能够简洁顺利的回调之前的点击动作,由此而写此简易回调类。
整体思路
- 触发点击如果需要跳转登陆的话,记录此控件。
- 登陆成功后,如果有记录的控件,则触发此控件相应事件。
- 登陆页面关闭时候,清空此控件的记录,防止错乱回调。
注意事项
- 控件使用弱引用,防止内存泄露。
- 目前实现了一般view和tab的回调,如有其他控件需求可以继续添加完善。
工具类代码
package com.pingan.nt.module.login.util;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import com.pasc.lib.base.AppProxy;
import com.pasc.lib.base.ICallBack;
import com.pasc.lib.base.log.PascLog;
import com.pingan.nt.TheApplication;
import com.pingan.nt.module.login.activity.LoginActivity;
import java.lang.ref.WeakReference;
/**
* 登陆成功后触发点击动作
* Created by zc on 2017年12月18日11:04:05
*/
public class LoginSuccessActionUtils {
private volatile static LoginSuccessActionUtils instance = null;
//弱引用自定义view 防止内存泄露
private WeakReference tWeakRef;
//亲测 callback 用弱引用,极容易被回收调,所以针对性处理
private ICallBack callBack;
//调用处activity的名字(用于及时清空回调逻辑)
private String activityName;
private LoginSuccessActionUtils() {
}
public static LoginSuccessActionUtils getInstance() {
if (instance == null) {
synchronized (LoginSuccessActionUtils.class) {
if (instance == null) {
instance = new LoginSuccessActionUtils();
}
}
}
return instance;
}
/**
* 是否需要登陆
*
* @param t 需要回调点击事件的view
* @return true 需要
*/
public boolean isNeedLogin(Context context, T t) {
context = checkContext(context);
if (LoginUtil.isHasLogin()) {
clearCallback();
return false;
} else {
goToLogin(context, t);
return true;
}
}
/**
* 带接口的回调 (回调内容写在接口实现里面)
*
* @param context
* @param callBack
*/
public void checkLoginWithCallBack(Context context, T callBack) {
context = checkContext(context);
if (LoginUtil.isHasLogin()) {
if (callBack != null && callBack instanceof ICallBack) {//已经登录的情况 直接回调
((ICallBack) callBack).callBack();
clearCallback();
}
} else {
goToLogin(context, callBack);
}
}
/**
* 登陆
*
* @param t 需要回调点击事件的view
*/
public void goToLogin(Context context, T t) {
context = checkContext(context);
if (t instanceof ICallBack) {
callBack = (ICallBack) t;
} else {
this.tWeakRef = new WeakReference<>(t);
}
if (context instanceof Application) {
Intent intent =
new Intent(TheApplication.getApplication(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TheApplication.getApplication().startActivity(intent);
} else {
context.startActivity(new Intent(context, LoginActivity.class));
}
}
/**
* 登陆之后的动作
*/
public void onLoginSuccessAction() {
if (tWeakRef != null && tWeakRef.get() != null) {
if (tWeakRef.get() instanceof View) {
View view = (View) (tWeakRef.get());
if (view.getContext() != null
&& view.getContext() instanceof LoginActivity) {//防止记录记录页面的控件,导致重复触发
tWeakRef = null;
return;
}
view.performClick();
}
tWeakRef = null;
} else {
if (callBack != null) {
callBack.callBack();
}
callBack = null;
}
}
/**
* loginActivity finish 时候调用这个方法清空view 或者其他callback
*/
public void clearCallback() {
tWeakRef = null;
callBack = null;
}
/**
* 基类baseActivity onDestroy 回调的方法(判断如果当前finish得activity如何和纪录事件的activity是同一个activity时清空事件)
*
* @param context
*/
public void onDestroyClearCallback(Context context) {
if (context != null && !TextUtils.isEmpty(activityName) && activityName.equals(context.getClass().getName())) {
PascLog.d("LoginSuccessActionUtils", "activity已经被finish,清空回调事件 current:" + context.getClass().getName() + " last:" + activityName);
clearCallback();
}
}
/**
* 是否有记录的事件(是否有下一步的点击回调动作)
*/
public boolean isHasNextStep() {
return (tWeakRef != null && tWeakRef.get() != null) || callBack != null;
}
private Context checkContext(Context context) {
activityName = context != null ? context.getClass().getCanonicalName() : null;
return context == null ? AppProxy.getContext() : context;
}
}
如何使用
- 支持View类型的回调(为了更简洁的调用)
if (!LoginSuccessActionUtils.getInstance().isNeedLogin(mContext, v)) {
//1、已经登录成功直接执行
// 2、未登录情况下,登录成功后再次触发view的点击事件
}
- 支持IcallBack
LoginSuccessActionUtils.getInstance().checkLoginWithCallBack(this, new ICallBack() {
@Override public void callBack() {
//1、已经登录成功直接回调
// 2、未登录情况下,登录成功后回调。
}
});