有很多地方需要登陸,當(dāng)用戶(hù)點(diǎn)擊該控件如果用戶(hù)未登錄的情況下,會(huì)觸發(fā)登陸尤勋,在登陸成功的時(shí)候喘落,我們希望能夠簡(jiǎn)潔順利的回調(diào)之前的點(diǎn)擊動(dòng)作,由此而寫(xiě)此簡(jiǎn)易回調(diào)類(lèi)最冰。
整體思路
- 觸發(fā)點(diǎn)擊如果需要跳轉(zhuǎn)登陸的話(huà)瘦棋,記錄此控件。
- 登陸成功后暖哨,如果有記錄的控件赌朋,則觸發(fā)此控件相應(yīng)事件。
- 登陸頁(yè)面關(guān)閉時(shí)候篇裁,清空此控件的記錄沛慢,防止錯(cuò)亂回調(diào)。
注意事項(xiàng)
- 控件使用弱引用达布,防止內(nèi)存泄露团甲。
- 目前實(shí)現(xiàn)了一般view和tab的回調(diào),如有其他控件需求可以繼續(xù)添加完善黍聂。
工具類(lèi)代碼
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;
/**
* 登陸成功后觸發(fā)點(diǎn)擊動(dòng)作
* Created by zc on 2017年12月18日11:04:05
*/
public class LoginSuccessActionUtils {
private volatile static LoginSuccessActionUtils instance = null;
//弱引用自定義view 防止內(nèi)存泄露
private WeakReference tWeakRef;
//親測(cè) callback 用弱引用躺苦,極容易被回收調(diào),所以針對(duì)性處理
private ICallBack callBack;
//調(diào)用處activity的名字(用于及時(shí)清空回調(diào)邏輯)
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 需要回調(diào)點(diǎn)擊事件的view
* @return true 需要
*/
public <T> boolean isNeedLogin(Context context, T t) {
context = checkContext(context);
if (LoginUtil.isHasLogin()) {
clearCallback();
return false;
} else {
goToLogin(context, t);
return true;
}
}
/**
* 帶接口的回調(diào) (回調(diào)內(nèi)容寫(xiě)在接口實(shí)現(xiàn)里面)
*
* @param context
* @param callBack
*/
public <T> void checkLoginWithCallBack(Context context, T callBack) {
context = checkContext(context);
if (LoginUtil.isHasLogin()) {
if (callBack != null && callBack instanceof ICallBack) {//已經(jīng)登錄的情況 直接回調(diào)
((ICallBack) callBack).callBack();
clearCallback();
}
} else {
goToLogin(context, callBack);
}
}
/**
* 登陸
*
* @param t 需要回調(diào)點(diǎn)擊事件的view
*/
public <T> 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));
}
}
/**
* 登陸之后的動(dòng)作
*/
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) {//防止記錄記錄頁(yè)面的控件产还,導(dǎo)致重復(fù)觸發(fā)
tWeakRef = null;
return;
}
view.performClick();
}
tWeakRef = null;
} else {
if (callBack != null) {
callBack.callBack();
}
callBack = null;
}
}
/**
* loginActivity finish 時(shí)候調(diào)用這個(gè)方法清空view 或者其他callback
*/
public void clearCallback() {
tWeakRef = null;
callBack = null;
}
/**
* 基類(lèi)baseActivity onDestroy 回調(diào)的方法(判斷如果當(dāng)前finish得activity如何和紀(jì)錄事件的activity是同一個(gè)activity時(shí)清空事件)
*
* @param context
*/
public void onDestroyClearCallback(Context context) {
if (context != null && !TextUtils.isEmpty(activityName) && activityName.equals(context.getClass().getName())) {
PascLog.d("LoginSuccessActionUtils", "activity已經(jīng)被finish匹厘,清空回調(diào)事件 current:" + context.getClass().getName() + " last:" + activityName);
clearCallback();
}
}
/**
* 是否有記錄的事件(是否有下一步的點(diǎn)擊回調(diào)動(dòng)作)
*/
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類(lèi)型的回調(diào)(為了更簡(jiǎn)潔的調(diào)用)
if (!LoginSuccessActionUtils.getInstance().isNeedLogin(mContext, v)) {
//1、已經(jīng)登錄成功直接執(zhí)行
// 2脐区、未登錄情況下愈诚,登錄成功后再次觸發(fā)view的點(diǎn)擊事件
}
- 支持IcallBack
LoginSuccessActionUtils.getInstance().checkLoginWithCallBack(this, new ICallBack() {
@Override public void callBack() {
//1、已經(jīng)登錄成功直接回調(diào)
// 2牛隅、未登錄情況下扰路,登錄成功后回調(diào)。
}
});