Android 用戶Session管理的設(shè)計方案
相信大家都知道,每一個App都需要登錄,登錄信息都保存在本地文件中,然后我們就寫一堆的操作SharedPreferences的代碼了。
現(xiàn)在,你可以完全拋棄這種方法,一句代碼搞定登錄信息,用戶信息管理。實現(xiàn)全局操作。為你的程序解耦。
public void sessionDemo() {
// 獲取登錄信息
TokenInfo token = SessionManager.getDefault().getUserToken();
// 獲取用戶信息
UserInfo userInfo = SessionManager.getDefault().getUser();
// 是否登錄
boolean isLogin = SessionManager.getDefault().isLogin();
// 退出登錄
SessionManager.getDefault().clear();
// 登錄成功后,設(shè)置用戶信息
SessionManager.getDefault().setUser(new UserInfo());
// 登錄成功后,設(shè)置登錄信息
SessionManager.getDefault().setUserToken(new TokenInfo());
// 這句請在Application onCreate 的時候調(diào)用初始化配置信息
SessionManager.initWithConfig(
new SessionManager.ConfigBuilder()
.context(this)
.tokenClass(TokenInfo.class)
.userClass(UserInfo.class)
.build());
Log.i("rae", "登錄信息:" + token);
Log.i("rae", "用戶信息:" + userInfo);
Log.i("rae", "是否登錄:" + isLogin);
}
一、設(shè)計
抽象工廠模式,整體UML如下圖,整體思路為:
抽象出SessionManager類,實際還是PreferencesSessionManager實現(xiàn)了這個抽象類,進行本地SharePreferences保存。

Config:負責維護實體類的class,用來做JSON序列化保存到本地的。這個類起到泛型解析的作用,getUser()返回的對象就由這個類去維護了。從而達到了解耦的作用。
ConfigBuild:構(gòu)建者模式,提供方便的會話配置。
SessionManager.getDefault(); 默認返回的是PreferencesSessionManager的實例。
二、自定義SessionManger
如果不想用SharePreferences來保存用戶信息,也可以繼承SessionManger類實現(xiàn)抽象方法實現(xiàn)自定義的Session管理。
如果你的自定義也想全局訪問,那么可以新增一個AppSessionManger的類,來實現(xiàn)一個單例方法,返回你自定義的實現(xiàn)。
參考SessionManger.getDefault()的實現(xiàn)就可以了。
三、 SessionManger 代碼實現(xiàn)
/**
* 會話管理
* Created by ChenRui on 2017/4/28 0028 17:27.
*/
public abstract class SessionManager {
public static class Config {
Class<?> userTokenClass;
Class<?> userClass;
Context context;
}
public static class ConfigBuilder {
private final Config mConfig;
public ConfigBuilder() {
mConfig = new Config();
}
public ConfigBuilder tokenClass(Class<?> cls) {
mConfig.userTokenClass = cls;
return this;
}
public ConfigBuilder userClass(Class<?> cls) {
mConfig.userClass = cls;
return this;
}
public ConfigBuilder context(Context applicationContext) {
mConfig.context = applicationContext;
return this;
}
public Config build() {
return mConfig;
}
}
private static Config sConfig;
private static WeakReference<SessionManager> managerWeakReference;
/**
* 獲取默認的會話管理器,默認的為cookie 管理器。
* 使用之前請使用{@link #initWithConfig(Config)} 來進行初始化配置。
*/
public static SessionManager getDefault() {
if (sConfig == null) {
Log.w("SessionManager", "session config from default");
sConfig = new ConfigBuilder().tokenClass(SessionToken.class).userClass(SessionUserInfo.class).build();
}
if (managerWeakReference == null || managerWeakReference.get() == null) {
synchronized (SessionManager.class) {
if (managerWeakReference == null || managerWeakReference.get() == null) {
managerWeakReference = new WeakReference<SessionManager>(new PreferencesSessionManager(sConfig));
}
}
}
return managerWeakReference.get();
}
/**
* 初始化會話管理器
*/
public static void initWithConfig(Config config) {
if (sConfig != null) {
sConfig = null;
System.gc();
}
sConfig = config;
}
SessionManager() {
}
/**
* 是否登錄
*/
public abstract boolean isLogin();
/**
* 清除會話信息,即退出登錄。
*/
public abstract void clear();
/**
* 獲取當前登錄的用戶信息,在調(diào)用該方法之前請先調(diào)用{@link #isLogin()}來判斷是否登錄
*/
public abstract <T> T getUser();
/**
* 設(shè)置當前用戶信息
*/
public abstract <T> void setUser(T user);
/**
* 設(shè)置用戶授權(quán)信息
*
* @param token 授權(quán)信息
*/
public abstract <T> void setUserToken(T token);
/**
* 獲取用戶授權(quán)信息
*/
public abstract <T> T getUserToken();
}
本文結(jié)束,非常簡單的實現(xiàn),但是卻非常實用!
GitHub開源:https://github.com/raee/retrofit-ext.git
總結(jié)
以上所述是小編給大家介紹的Android 用戶Session管理的設(shè)計方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- android10 隱藏SystemUI鎖屏下的多用戶圖標的示例代碼
- Android 如何攔截用戶頻繁操作(點擊事件)
- Android實現(xiàn)用戶圓形頭像和模糊背景
- Android實現(xiàn)簡單用戶注冊案例
- Android啟動頁用戶相關(guān)政策彈框的實現(xiàn)代碼
- 詳解Android Studio實現(xiàn)用戶登陸界面demo(xml實現(xiàn))
- android實現(xiàn)記住用戶名和密碼以及自動登錄
- Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限詳解
- Android百度地圖定位、顯示用戶當前位置
- Android模擬用戶點擊的實現(xiàn)方法
- Android EditText 監(jiān)聽用戶輸入完成的實例
- Android基于AlarmManager實現(xiàn)用戶在線心跳功能示例
- Android 多用戶詳情
相關(guān)文章
Android指紋識別功能深入淺出分析到實戰(zhàn)(6.0以下系統(tǒng)解決方案)
指紋識別在現(xiàn)實應(yīng)用中已經(jīng)很多了,本篇文章主要介紹了Android指紋識別功能,具有一定的參考價值,有需要的可以了解一下。2016-11-11
ViewPager+Fragment實現(xiàn)側(cè)滑導航欄
這篇文章主要為大家詳細介紹了ViewPager+Fragment實現(xiàn)側(cè)滑導航欄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05
Android使用SqLite實現(xiàn)登錄注冊功能流程詳解
這篇文章主要介紹了使用Android Studio自帶的sqlite數(shù)據(jù)庫實現(xiàn)一個簡單的登錄注冊功能,SQLite是一個軟件庫,實現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的SQL數(shù)據(jù)庫引擎,本文給大家介紹的非常詳細,需要的朋友可以參考下2023-12-12

