android - Android Studio 中基于角色的自动登录
问题描述
我正在创建一个应用程序,其中有 5 个不同的用户可用,其中四个是工人,一个是客户。所有用户都可以使用他们的电子邮件和密码登录应用程序,但我希望这 5 个用户中的 4 个用户重定向到一个活动,剩下的一个用户重定向到另一个不同的活动,这工作正常,但在自动时间登录我希望同样的事情会发生,但是每当我以 WORKER 身份登录然后从内存中清除应用程序时,并且在自动登录时,客户端每次都会登录。
在注册时,每个用户都必须选择他们的名称,并且每次尝试让用户根据我用作用户类型的名称自动登录时,客户端名称都将保持为空。
我希望有时自动登录四个用户(工人)重定向到不同的一个活动,而作为客户端的一个用户重定向到另一个不同的活动。我必须为此使用什么,哪种方法对我更好?
解决方案
我有用户会话来保存当前登录用户类型,它工作得很好。
这是我的会话代码:-
private SharedPreferences prefs;
private static AppSession session;
public static AppSession getInstance(Context cntx) {
if (session == null)
session = new AppSession(cntx);
return session;
}
public AppSession(Context cntx) {
// TODO Auto-generated constructor stub
prefs = PreferenceManager.getDefaultSharedPreferences(cntx);
}
public void setHasLoging(boolean value) {
prefs.edit().putBoolean("hasLoging", value).commit();
}
public void setUserHasLoging(boolean value){
prefs.edit().putBoolean("UserHasLoging", value).commit();
}
public boolean getHasLoging() {
return prefs.getBoolean("hasLoging", false);
}
public boolean getUserHasLoging(){
return prefs.getBoolean("UserHasLoging", false);
}
public void clear() {
prefs.edit().clear().commit();
}
登录活动代码:-
userDatabaseReference = FirebaseDatabase.getInstance().getReference().child("users").child(RegisteredUserID);
userDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String userType = dataSnapshot.child("designation").getValue().toString();
if (userType.equals("CA")){
mAppSession.setHasLoging(true);
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
else if (userType.equals("CLIENT")){
mAppSession.setUserHasLoging(true);
Intent intent = new Intent(LoginActivity.this, DashBoardActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
else if (userType.equals("ADVOCATE")){
mAppSession.setHasLoging(true);
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
else if (userType.equals("CMA")){
mAppSession.setHasLoging(true);
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
else if (userType.equals("CS")){
mAppSession.setHasLoging(true);
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
} else {
SweetToast.info(LoginActivity.this, "Email is not verified. Please verify first");
mAuth.signOut();
}
}
Here Splash Screen I used as Launcher Activity to check the condition which user is logged in.
AppSession mSession;
private FirebaseAuth mAuth;
private DatabaseReference mDatabaseReference;
@Override
protected void onStart() {
super.onStart();
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
if (user == null){
Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
else if (user != null){
mDatabaseReference.child(user.getUid()).child("online").setValue(ServerValue.TIMESTAMP);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
mSession = AppSession.getInstance(this);
rightAction();
}
private void rightAction(){
if (mSession.getHasLoging()) {
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
else if (mSession.getUserHasLoging()){
Intent intent1 = new Intent(SplashActivity.this, DashBoardActivity.class);
startActivity(intent1);
finish();
}
推荐阅读
- javascript - 对 getElementById 使用字典键
- angular - 在 Ionic 4 中传递 Iframe src 值
- azure - 无法通过 azure 函数填充自定义 azure B2C 属性
- android - 包含片段的 setContentView 布局上的 android.view.InflateException
- go - 为什么golang时间功能在某些日期会失败
- php - 制作一个多线程 websocket
- python - 如何在ROS中用Kinova Jaco2画一个圆?
- listview - 有没有办法改变 Flutter 上 ListTile 的领导背景?
- c# - C# List.AddRange in Parallel.For 发生 ArgumentException
- firebase - Google Cloud Platform 网络控制台 - 云功能指标图表未显示