安卓的登录怎么实现

先从核心代码开始看:

public class GoLoginUtil {

    public static final String CLASSNAME = "className";

    public static final int CODE_LOGIN = 1; // 登录成功回调 用于onActivityForResult 判断


    /**
 * 登录成功之后,通过 activityResult 回调到当前界面
 *
 * @param activity
 * @param intent
 * @param requestCode
 */
    private static void startActivity(Activity activity, Intent intent, int requestCode) {
        if (requestCode == -1) {
            String targetClass = intent.getComponent().getClassName();  // 目标类
            intent.putExtra(CLASSNAME, targetClass);
        }
        intent.setClass(activity, LoginActivity.class); // 跳转重定向到登录界面
        activity.startActivityForResult(intent, requestCode);
    }


    /**
 * 登录成功之后,直接跳转目标 Activity
 *
 * @param activity
 * @param intent
 */
    public static void startActivity(Activity activity, Intent intent) {
        startActivity(activity, intent, -1);
    }

    /**
 * 登录成功回调到当前界面
 * 使用 onActivityResult 方法接收, requestCode = CODE_LOGIN
 *
 * @param activity
 * @param intent
 */
    public static void startActivityForResult(Activity activity, Intent intent) {
        startActivity(activity, intent, CODE_LOGIN);
    }

}

这里可以看到,最主要的就是第一个 private 修饰的 startActivity 方法,看过 Android Activity 的 startActivity 方法源码的应该知道,它里面其实就是调用的 startActivityForResult(intent , -1) . 所以我们这里也来用一下它的写法。如果 等于 -1 ,那么就说明是有跳转目标 Activity 的,那么我们就通过 Intent.getComponent().getClassName() 来获取目标 Activity 的类名,再次添加到 Intent参数中,用于我们登录成功之后的后续跳转目标。当然,intent 中的其他参数是会一直携带着的,这里不用担心其他参数。 不等于 -1 那么就是要进行 setResult 回调了。所以,我们是通过 requestCode 是否等于 -1 来区分是继续跳转,还是回调当前界面。 工具类中的下面两个方法,就把功能区分开了,这里基本上看着系统源码来的。

然后再来进行一下二次封装,这里就需要判断当前 登录状态了,这里我也是模拟一下登录状态,代码如下:

public class IntentUtil {

    public static boolean isLogin;  // 模拟获取当前用户登录状态。

    /**
 * 需要登录判断
 *
 * @param activity
 * @param clazz
 * @param bundle
 */
    public static void startToLogin(Activity activity, Class clazz, Bundle bundle) {
        Intent intent = new Intent(activity, clazz);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        if (isLogin) {
            activity.startActivity(intent);
        } else {
            GoLoginUtil.startActivity(activity, intent);
        }
    }

    /**
 * 登录成功会有回调
 * requestCode = Contants.CODE_LOGIN
 *
 * @param activity
 * @param bundle
 */
    public static void startToLoginResult(Activity activity, Bundle bundle) {
        Intent intent = new Intent();
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        GoLoginUtil.startActivityForResult(activity, intent);
    }
}
  • ,基本上需要进行登录跳转界面的,可以直接调用 startToLogin 方法,根据登录状态进行跳转。至于 startToLoginResult 方法,目前还需要在调用时进行判断一下登录状态,进行区分处理,然后还要在 onActivityForResult 方法中进行回调处理,这个暂时没想到其他好的方法,各位大神如果有什么好的处理方式还请多多指教。

这里还没完呢,我们的登录界面也是需要一定的处理逻辑去进行配合的。我们来看一下怎么去配合:

public class LoginActivity extends FragmentActivity {

    private String targetClass;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        targetClass = getIntent().getStringExtra(GoLoginUtil.CLASSNAME);  // 目标跳转类


    }

    public void onLoginClick(View view) {
        // 模拟登录成功操作
        if (!TextUtils.isEmpty(targetClass)) {
            // 这里就是执行继续跳转操作
            try {
                Class clazz = Class.forName(targetClass);
                getIntent().setClass(this, clazz);
                startActivity(getIntent());
                finish();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            // 这里是登录成功,回调到之前界面 onActivityForResult()中 方法可根据自己需求处理。。
            setResult(RESULT_OK);
            finish();
        }
    }
}

最后来看一下我们的调用方式:

/**
 * 登录跳转
 *
 * @param view
 */
    public void onClick1(View view) {
        Bundle bundle = new Bundle();
        bundle.putString("content", et_content.getText().toString());
        IntentUtil.startToLogin(this, LoginSuccessActivity.class, bundle);
    }

    /**
 * 登录回调
 *
 * @param view
 */
    public void onClick2(View view) {
        if (!IntentUtil.isLogin) {
            IntentUtil.startToLoginResult(this, null);
        } else {
            tv_text.setText("登录成功");
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == CODE_LOGIN) {
            tv_text.setText("登录成功");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxpr_ybgg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值