Android 用戶Session管理的設(shè)計(jì)方案
相信大家都知道,每一個(gè)App都需要登錄,登錄信息都保存在本地文件中,然后我們就寫一堆的操作SharedPreferences的代碼了。
現(xiàn)在,你可以完全拋棄這種方法,一句代碼搞定登錄信息,用戶信息管理。實(shí)現(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()); // 這句請(qǐng)?jiān)贏pplication onCreate 的時(shí)候調(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è)計(jì)
抽象工廠模式,整體UML如下圖,整體思路為:
抽象出SessionManager類,實(shí)際還是PreferencesSessionManager實(shí)現(xiàn)了這個(gè)抽象類,進(jìn)行本地SharePreferences保存。
Config:負(fù)責(zé)維護(hù)實(shí)體類的class,用來(lái)做JSON序列化保存到本地的。這個(gè)類起到泛型解析的作用,getUser()返回的對(duì)象就由這個(gè)類去維護(hù)了。從而達(dá)到了解耦的作用。
ConfigBuild:構(gòu)建者模式,提供方便的會(huì)話配置。
SessionManager.getDefault(); 默認(rèn)返回的是PreferencesSessionManager的實(shí)例。
二、自定義SessionManger
如果不想用SharePreferences來(lái)保存用戶信息,也可以繼承SessionManger類實(shí)現(xiàn)抽象方法實(shí)現(xiàn)自定義的Session管理。
如果你的自定義也想全局訪問(wèn),那么可以新增一個(gè)AppSessionManger的類,來(lái)實(shí)現(xiàn)一個(gè)單例方法,返回你自定義的實(shí)現(xiàn)。
參考SessionManger.getDefault()的實(shí)現(xiàn)就可以了。
三、 SessionManger 代碼實(shí)現(xiàn)
/** * 會(huì)話管理 * 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; /** * 獲取默認(rèn)的會(huì)話管理器,默認(rèn)的為cookie 管理器。 * 使用之前請(qǐng)使用{@link #initWithConfig(Config)} 來(lái)進(jìn)行初始化配置。 */ 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(); } /** * 初始化會(huì)話管理器 */ public static void initWithConfig(Config config) { if (sConfig != null) { sConfig = null; System.gc(); } sConfig = config; } SessionManager() { } /** * 是否登錄 */ public abstract boolean isLogin(); /** * 清除會(huì)話信息,即退出登錄。 */ public abstract void clear(); /** * 獲取當(dāng)前登錄的用戶信息,在調(diào)用該方法之前請(qǐng)先調(diào)用{@link #isLogin()}來(lái)判斷是否登錄 */ public abstract <T> T getUser(); /** * 設(shè)置當(dāng)前用戶信息 */ 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é)束,非常簡(jiǎn)單的實(shí)現(xiàn),但是卻非常實(shí)用!
GitHub開(kāi)源:https://github.com/raee/retrofit-ext.git
總結(jié)
以上所述是小編給大家介紹的Android 用戶Session管理的設(shè)計(jì)方案,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- android10 隱藏SystemUI鎖屏下的多用戶圖標(biāo)的示例代碼
- Android 如何攔截用戶頻繁操作(點(diǎn)擊事件)
- Android實(shí)現(xiàn)用戶圓形頭像和模糊背景
- Android實(shí)現(xiàn)簡(jiǎn)單用戶注冊(cè)案例
- Android啟動(dòng)頁(yè)用戶相關(guān)政策彈框的實(shí)現(xiàn)代碼
- 詳解Android Studio實(shí)現(xiàn)用戶登陸界面demo(xml實(shí)現(xiàn))
- android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)登錄
- Android權(quán)限如何禁止以及友好提示用戶開(kāi)通必要權(quán)限詳解
- Android百度地圖定位、顯示用戶當(dāng)前位置
- Android模擬用戶點(diǎn)擊的實(shí)現(xiàn)方法
- Android EditText 監(jiān)聽(tīng)用戶輸入完成的實(shí)例
- Android基于AlarmManager實(shí)現(xiàn)用戶在線心跳功能示例
- Android 多用戶詳情
相關(guān)文章
Android中使用ViewFlipper進(jìn)行手勢(shì)切換實(shí)例
這篇文章主要介紹了Android中使用ViewFlipper進(jìn)行手勢(shì)切換的方法,以實(shí)例形式詳細(xì)講述了XML文件的定義及功能函數(shù)的實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下2014-10-10Android指紋識(shí)別功能深入淺出分析到實(shí)戰(zhàn)(6.0以下系統(tǒng)解決方案)
指紋識(shí)別在現(xiàn)實(shí)應(yīng)用中已經(jīng)很多了,本篇文章主要介紹了Android指紋識(shí)別功能,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11ViewPager+Fragment實(shí)現(xiàn)側(cè)滑導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了ViewPager+Fragment實(shí)現(xiàn)側(cè)滑導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05制作獨(dú)立的Android模擬器實(shí)現(xiàn)方法
本文主要介紹如何制作獨(dú)立的Android模擬器,這里給大家提供詳細(xì)的制作流程,有需要的小伙伴可以參考下2016-08-08Android使用SqLite實(shí)現(xiàn)登錄注冊(cè)功能流程詳解
這篇文章主要介紹了使用Android Studio自帶的sqlite數(shù)據(jù)庫(kù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄注冊(cè)功能,SQLite是一個(gè)軟件庫(kù),實(shí)現(xiàn)了自給自足的、無(wú)服務(wù)器的、零配置的、事務(wù)性的SQL數(shù)據(jù)庫(kù)引擎,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12DataBinding onClick的七種點(diǎn)擊方式
這篇文章主要給大家介紹了關(guān)于DataBinding onClick的七種點(diǎn)擊方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07