android登陆成功后的回调点击工具类

有很多地方需要登陆,当用户点击该控件如果用户未登录的情况下,会触发登陆,在登陆成功的时候,我们希望能够简洁顺利的回调之前的点击动作,由此而写此简易回调类。

整体思路

  • 触发点击如果需要跳转登陆的话,记录此控件。
  • 登陆成功后,如果有记录的控件,则触发此控件相应事件。
  • 登陆页面关闭时候,清空此控件的记录,防止错乱回调。

注意事项

  • 控件使用弱引用,防止内存泄露。
  • 目前实现了一般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 <T> 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 <T> 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 <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));
        }
    }

    /**
     * 登陆之后的动作
     */
    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、未登录情况下,登录成功后回调。
            }
        });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容