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  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、未登录情况下,登录成功后回调。
            }
        });

你可能感兴趣的:(android登陆成功后的回调点击工具类)