Android登錄的簡單處理
今天整理一下之前在項目中寫的關(guān)于某些界面需要登錄判斷處理。這里整理了一個簡易的 Demo 模擬一下 登錄情況 和 未登錄情況 下的界面跳轉(zhuǎn)處理, 效果如圖:

以上分別模擬了,未登錄和已登錄 情況下的 界面跳轉(zhuǎn)和當前界面事件處理。接下來我們來看一下實現(xiàn)方式。
先從核心代碼開始看:
public class GoLoginUtil {
public static final String CLASSNAME = "className";
public static final int CODE_LOGIN = 1; // 登錄成功回調(diào) 用于onActivityForResult 判斷
/**
* 登錄成功之后,通過 activityResult 回調(diào)到當前界面
*
* @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); // 跳轉(zhuǎn)重定向到登錄界面
activity.startActivityForResult(intent, requestCode);
}
/**
* 登錄成功之后,直接跳轉(zhuǎn)目標 Activity
*
* @param activity
* @param intent
*/
public static void startActivity(Activity activity, Intent intent) {
startActivity(activity, intent, -1);
}
/**
* 登錄成功回調(diào)到當前界面
* 使用 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 方法源碼的應(yīng)該知道,它里面其實就是調(diào)用的 startActivityForResult(intent , -1) . 所以我們這里也來用一下它的寫法。如果 等于 -1 ,那么就說明是有跳轉(zhuǎn)目標 Activity 的,那么我們就通過 Intent.getComponent().getClassName() 來獲取目標 Activity 的類名,再次添加到 Intent參數(shù)中,用于我們登錄成功之后的后續(xù)跳轉(zhuǎn)目標。當然,intent 中的其他參數(shù)是會一直攜帶著的,這里不用擔(dān)心其他參數(shù)。 不等于 -1 那么就是要進行 setResult 回調(diào)了。所以,我們是通過 requestCode 是否等于 -1 來區(qū)分是繼續(xù)跳轉(zhuǎn),還是回調(diào)當前界面。 工具類中的下面兩個方法,就把功能區(qū)分開了,這里基本上看著系統(tǒng)源碼來的。
然后再來進行一下二次封裝,這里就需要判斷當前 登錄狀態(tài)了,這里我也是模擬一下登錄狀態(tài),代碼如下:
public class IntentUtil {
public static boolean isLogin; // 模擬獲取當前用戶登錄狀態(tài)。
/**
* 需要登錄判斷
*
* @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);
}
}
/**
* 登錄成功會有回調(diào)
* 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);
}
}
寫到現(xiàn)在這樣,基本上需要進行登錄跳轉(zhuǎn)界面的,可以直接調(diào)用 startToLogin 方法,根據(jù)登錄狀態(tài)進行跳轉(zhuǎn)。至于 startToLoginResult 方法,目前還需要在調(diào)用時進行判斷一下登錄狀態(tài),進行區(qū)分處理,然后還要在 onActivityForResult 方法中進行回調(diào)處理,這個暫時沒想到其他好的方法,各位大神如果有什么好的處理方式還請多多指教。
這里還沒完呢,我們的登錄界面也是需要一定的處理邏輯去進行配合的。我們來看一下怎么去配合:
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); // 目標跳轉(zhuǎn)類
}
public void onLoginClick(View view) {
// 模擬登錄成功操作
if (!TextUtils.isEmpty(targetClass)) {
// 這里就是執(zhí)行繼續(xù)跳轉(zhuǎn)操作
try {
Class clazz = Class.forName(targetClass);
getIntent().setClass(this, clazz);
startActivity(getIntent());
finish();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} else {
// 這里是登錄成功,回調(diào)到之前界面 onActivityForResult()中 方法可根據(jù)自己需求處理。。
setResult(RESULT_OK);
finish();
}
}
}
最后來看一下我們的調(diào)用方式:
/**
* 登錄跳轉(zhuǎn)
*
* @param view
*/
public void onClick1(View view) {
Bundle bundle = new Bundle();
bundle.putString("content", et_content.getText().toString());
IntentUtil.startToLogin(this, LoginSuccessActivity.class, bundle);
}
/**
* 登錄回調(diào)
*
* @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("登錄成功");
}
}
基本上要整理的就這么多。寫法上的一些不足,還請各位多多指點。
Demo 地址
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android基于高德地圖完全自定義Marker的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android基于高德地圖完全自定義Marker的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
Android編程之listView中checkbox用法實例分析
這篇文章主要介紹了Android編程之listView中checkbox用法,結(jié)合實例形式分析了Android中checkbox的頁面布局及功能實現(xiàn)相關(guān)技巧,需要的朋友可以參考下2016-01-01
解決Android加殼過程中mprotect調(diào)用失敗的原因分析
本文探討的主要內(nèi)容是mprotect調(diào)用失敗的根本原因,以及在加殼實現(xiàn)中的解決方案,通過本文的闡述,一方面能夠幫助遇到同類問題的小伙伴解決心中的疑惑,另一方面能夠給大家提供可落地的實現(xiàn)方案,需要的朋友可以參考下2022-01-01
Flutter 和 Android 互相傳遞數(shù)據(jù)的實現(xiàn)
這篇文章主要介紹了Flutter 和 Android 互相傳遞數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

