登錄的方式
1.賬號登錄
使用在app上註冊的賬號和密碼進行登錄,登錄成功改變本地登錄狀態。
2.快捷登錄
使用QQ、微信進行快捷登錄,登錄成功改變本地登錄狀態。
登錄狀態管理
使用狀態模式進行登錄狀態管理,在用戶登錄和未登錄的情況下,對於同一事件處理行爲是不一樣的。在一些依賴狀態的操作,如果用戶是登錄狀態,則進行直接操作,如果不是登錄轉態那就不能進行直接操作。減少if-else邏輯,增強代碼的課拓展性和可維護性。
1.定義狀態接口
在接口中定義依賴登錄相關狀態的操作
import android.content.Context;
/**
* Created by Shinlone on 2016/6/14.
* 定義依賴狀態的操作,在這裏主要有登錄狀態和未登錄狀態會拓展此接口
* 後期可以根據此接口實現一些其他轉態,比如已經登錄但限制操作的狀態
*/
public interface UserState {
/**
* 購買操作
* @param context
*/
public void buy(Context context);
/**
*評論操作
* @param context
*/
public void comment(Context context);
/**添加其他與狀態相關的接口**/
}
2.實現狀態接口
實現UserState接口,分別構建登錄狀態和未登錄狀態
登錄狀態實現
import android.content.Context;
/**
* 已經登錄狀態
* Created by Shinlone on 2016/6/14.
*/
public class LoginedState implements UserState {
@Override
public void buy(Context context) {//可以正常購買
// 具體操作
}
@Override
public void comment(Context context) {//可以正常評論
// 具體操作
}
}
未登錄狀態實現
import android.content.Context;
/**
* Created by Shinlone on 2016/6/14.
*/
public class LogoutState implements UserState {
@Override
public void buy(Context context) {//註銷狀態下不能進行購買操作
// 具體操作,比如跳出登錄
}
@Override
public void comment(Context context) {
}
}
狀態管理實現
運用單例模式進行全局的狀態管理,默認狀態爲未登錄狀態,並提供獲取實例和切換狀態的方法。
import android.content.Context;
/**
* Created by Shinlone on 2016/6/14.
* 用戶狀態管理
*/
public class LoginContext {
//默認狀態爲未登錄狀態
UserState mState = new LogoutState();
static LoginContext sLoginContext = new LoginContext();
private LoginContext() {
}
/**
* 獲取操作實例
*
* @return
*/
public static LoginContext getsLoginContext() {
return sLoginContext;
}
/**
* 切換轉態
*
* @param mState 傳入狀態
*/
public void setState(UserState mState) {
this.mState = mState;
}
public void buy(Context context) {//當前狀態購物操作
mState.buy(context);
}
public void comment(Context context) {//當前狀態的評論操作
mState.comment(context);
}
}
狀態管理器使用
登錄轉態默認爲未登錄轉態,當用戶登錄成功後先保存用戶token及用戶信息然後將狀態切換至已經登錄狀態;在token超時的情況下先把狀態切換至未登錄狀態。具體使用代碼如下:
未登錄狀態
LoginContext.getsLoginContext().setState(new LogoutState());//切換至未登錄轉態,用戶超時切換至此狀態
LoginContext.getsLoginContext().buy(Activity.clsss);//執行購物操作不會直接購物,跳至登錄界面
登錄狀態
LoginContext.getsLoginContext().setState(new LoginedState());//切換至登錄狀態,登錄成功數據保存後切換至此狀態
LoginContext.getsLoginContext().buy(Activity.clsss);//執行購物操作跳轉至訂單生成頁面