效果圖
簡介
項目源碼請參考 Android-IM
項目服務端使用極光JMessage
自動登陸的動畫使用了一個lottie的第三方庫,關于使用方法寫過一篇相關文章,需要的話可以參考
實現
自動登錄需要配合登錄使用,當登錄狀態發生變化時,自動登錄也會出現失效,所以需要對不同的登錄狀態做處理。
1、首次登錄
在首次安裝App,或者沒登錄過的情況下要進行第一次登錄,記錄登錄的信息用于下次的自動登錄。
showProgressDialog("正在登陸...");
JMessageClient.login(userName, passWord, new BasicCallback() {
@Override
public void gotResult(int i, String s) {
dismissProgressDialog();
switch (i) {
case 801003:
showToast(LoginActivity.this, "用戶名不存在");
break;
case 871301:
showToast(LoginActivity.this, "密碼格式錯誤");
break;
case 801004:
showToast(LoginActivity.this, "密碼錯誤");
handler.sendEmptyMessage(-1);
break;
case 0:
showToast(LoginActivity.this, "登陸成功");
sharedPrefHelper.setUserId(loginUsername.getText().toString());
sharedPrefHelper.setUserPW(loginPassWord.getText().toString());
initUserInfo(loginUsername.getText().toString(),type);
break;
default:
break;
}
}
});
接口使用JMessage提供的方法,參數傳遞用戶名和密碼。
當返回(0=1)登錄成功的時候,將登錄的賬號信息儲存到本地
通過SharedPreferences存儲,方便下次自動登錄
public void setUserId(String guestId) {
sharedPreferences.edit().putString("userName", guestId).commit();
}
public String getUserId() {
return sharedPreferences.getString("userName", "");
}
public void setUserPW(String guestId) {
sharedPreferences.edit().putString("userPW", guestId).commit();
}
public String getUserPW() {
return sharedPreferences.getString("userPW", "");
}
2、自動登錄
當登錄過一次之后,我們已經把賬號密碼存儲到了本地的文件,所以在這里只需要判斷一下賬號密碼是否存在即可。當不存在的時候跳轉到登錄界面,輸入賬號密碼手動登錄。
helper = SharedPrefHelper.getInstance();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (helper.getUserPW().equals("")) {
Intent intent = new Intent(LoadingActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}else{
JMessageClient.login(helper.getUserId(), helper.getUserPW(), new BasicCallback() {
@Override
public void gotResult(int i, String s) {
if (i==0){
showLongToast(LoadingActivity.this,"登陸成功");
initUserInfo();
startActivity(new Intent(getApplication(), MainActivity.class));
LoadingActivity.this.finish();
}else {
startActivity(new Intent(LoadingActivity.this,LoginActivity.class));
showToast(LoadingActivity.this, "登陸失敗:"+s);
}
}
});
}
}
}, 500);
}
這里的代碼只有登錄的方法,并沒有顯示動畫的加載相關的代碼。
這就是Lottie的強大和方便之處,要展示動畫,其實在布局文件里已經實現了
如果只是簡單的動效,就不需要再執行其他操作
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/loading_animation"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
app:lottie_fileName="permission.json"
app:lottie_loop="true"
app:lottie_autoPlay="true"/>
3、退出登錄
手動退出登錄的時候,需要把保存的密碼清空。
防止退出App后再次進入還會自動登錄的問題。
case R.id.setting_exit:
JMessageClient.logout();
helper.setUserPW("");
helper.setNakeName("");
Intent intent = new Intent(SettingActivity.this, LoginActivity.class);
startActivity(intent);
break;
4、重復登錄
重復登錄可以出現在任何地方,比如密碼泄露,在其他設備登錄。會出現該問題
所以需要在所有的頁面獲取重復登錄的事件。
android中項目都會自定義一個Activity的基類。比如BaseActivity
當我們在任何一個頁面獲取到重復登錄的事件,那么當前就會被強制下線
在文檔中提供的消息接收者方法是重寫onEventMainThread或者onEvent,參數是固定的
LoginStateChangeEvent,只用于接收處理重復登錄的事件。
public void onEventMainThread(LoginStateChangeEvent event) {
final LoginStateChangeEvent.Reason reason = event.getReason();
if (reason==user_logout) {
showLongToast(this, "該賬號在其他設備登錄,被強制下線");
JMessageClient.logout();
helper.setUserPW("");
helper.setNakeName("");
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}
}
項目地址:https://github.com/wapchief/Android-IM
相關文章推薦