我的启动器图标当前启动登录活动。我已将登录状态存储在SharedPreferences中。有没有办法正确跳过登录活动,直接进入主要活动,没有任何 UI故障。 finish()
中涉及onCreate()
的所有现有解决方案都会导致登录活动标题短暂可见或其他一些短暂的空白屏幕UI故障。
答案 0 :(得分:39)
启动一个没有UI的启动器,决定打开MainActivity或LoginActivity。您可以使用以下命令声明无用户界面:
android:theme="@android:style/Theme.NoDisplay"
另外两种可能的解决方案:
反过来说:将mainActivity作为启动器并检查用户是否已登录。然后在不是这种情况下重定向到loginActivity。
另一种方法是使用片段。有一个可以加载mainFragment和loginFragment的基本活动。供参考:https://developer.android.com/training/basics/fragments/index.html
答案 1 :(得分:2)
您可以创建一个基本活动,检查用户的用户名和密码是否已经在SharedPreferences
中,如果不存在则启动活动。
示例:强>
public class BeanStalkBaseActivity extends SherlockActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(SavedPreference.getUserName(this).length() == 0)
{
Intent intent = new Intent(this,LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
startActivity(intent);
}else
{
Intent intent = new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
startActivity(intent);
}
}
}
BeanStalkBaseActivity 应该是您的启动器,因为它只用作检查程序。
答案 2 :(得分:1)
如果您检查用户是否已经在主要活动或当前活动中登录,然后在登录后切换到另一个活动,这将导致UI故障,即您的当前活动将显示一秒钟或一半,然后它将切换到目标活动。
您可以这样做:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAuth = FirebaseAuth.getInstance();
if (mAuth.getCurrentUser() != null) {
Toast.makeText(MainActivity.this, "Already Logged In",
Toast.LENGTH_LONG).show();
Intent intent = new Intent(MainActivity.this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
} else {
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
BtnSignUp = findViewById(R.id.btnSignUp);
BtnLogIn = findViewById(R.id.btnLogIn);
BtnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent signUp = new Intent(MainActivity.this, SignUpActivity.class);
startActivity(signUp);
}
});
BtnLogIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent logIn = new Intent(MainActivity.this, Login.class);
startActivity(logIn);
}
});
}
}
答案 3 :(得分:0)
您还可以在启动画面活动期间检查登录状态(如果有)。启动画面非常适合让用户知道应用程序在加载时没有停止,也可以用来将应用程序重定向到适当的屏幕。
我第一次参加这个伟大的指南:https://www.bignerdranch.com/blog/splash-screens-the-right-way/
答案 4 :(得分:0)
在主要活动中,只检查用户是否为空,然后启动主页
firebaseAuth = FirebaseAuth.getInstance();
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
finish();
startActivity(new Intent(MainActivity.this, UserHomeActivity.class));
}
答案 5 :(得分:0)
如果有人想用什么来代替
android:theme="@android:style/Theme.NoDisplay"
使用
android:theme="@style/TextAppearance.AppCompat.Display4"
不要忘记在 finish()
之前将 startActivity(intent)
添加到您的活动中