相信大家都知道,每一個(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());
Log.i("rae", "登錄信息:" + token);
Log.i("rae", "用戶信息:" + userInfo);
Log.i("rae", "是否登錄:" + isLogin);
}
初始化配置
// 這句請(qǐng)?jiān)贏pplication onCreate 的時(shí)候調(diào)用初始化配置信息
SessionManager.initWithConfig(
new SessionManager.ConfigBuilder()
.context(this)
.tokenClass(TokenInfo.class)
.userClass(UserInfo.class)
.build());
自定義用戶信息UserInfo實(shí)體類
默認(rèn)的UserInfo類型字段不滿足需求?沒問題访诱,完全可以自定義垫挨!
// 初始化配置信息
SessionManager.initWithConfig(
new SessionManager.ConfigBuilder()
.context(this)
.tokenClass(MyTokenInfo.class) // 你自定義的TokenInfo類
.userClass(MyUserInfo.class) // 你自定義的UserInfo類
.build());
引用庫(kù):
compile 'com.rae.swift:rae-library:1.0.1'
如果下載失敗,請(qǐng)?jiān)诟夸?build.gradle添加:
allprojects {
repositories {
maven { url "https://dl.bintray.com/raee/Android" }
}
}
一触菜、設(shè)計(jì)
抽象工廠模式九榔,整體UML如下圖,整體思路為:
抽象出SessionManager類涡相,實(shí)際還是PreferencesSessionManager實(shí)現(xiàn)了這個(gè)抽象類哲泊,進(jìn)行本地SharePreferences保存。
Config: 負(fù)責(zé)維護(hù)實(shí)體類的class,用來做JSON序列化保存到本地的。這個(gè)類起到泛型解析的作用息罗,getUser()返回的對(duì)象就由這個(gè)類去維護(hù)了拧簸。從而達(dá)到了解耦的作用抛计。
ConfigBuild: 構(gòu)建者模式,提供方便的會(huì)話配置。
SessionManager.getDefault(); 默認(rèn)返回的是PreferencesSessionManager的實(shí)例喳魏。
二、自定義SessionManger
如果不想用SharePreferences來保存用戶信息怀薛,也可以繼承SessionManger類實(shí)現(xiàn)抽象方法實(shí)現(xiàn)自定義的Session管理刺彩。
如果你的自定義也想全局訪問,那么可以新增一個(gè)AppSessionManger的類,來實(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)} 來進(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()}來判斷是否登錄
*/
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();
}