【问题标题】:How to direct user to its specific activity?如何将用户引导至其特定活动?
【发布时间】:2018-04-22 09:06:45
【问题描述】:

我正在构建一个应用程序,当用户第一次安装它时,在 MainActivity(Launcher Activity) 中,应用程序询问他是什么类型的用户(假设是 Driver 或 Rider)?基于用户选择,他被引导到相应的登录屏幕。用户登录后,他定向到 HomeActivity。如果他在没有注销的情况下关闭了应用程序,那么下次他打开应用程序时,他应该会直接看到 HomeActivity(基于他选择的用户类型)。对于一位用户,MainActivity 中的代码如下:

@Override
protected void onStart() {
    super.onStart();

    // Check if user is signed in (non-null) and update UI accordingly.
    FirebaseAuth mAuth = FirebaseAuth.getInstance();
    FirebaseUser currentUser = mAuth.getCurrentUser();
    if (currentUser != null) {
        sendToStart();

    }
}

private void sendToStart() {

    Intent startIntent = new Intent(MainActivity.this,DriverHomeActivity.class);
    startActivity(startIntent);
    finish();
}

我是 Android 和 Firebase 的新手。我不知道这应该如何为两种类型的用户完成。

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    创建一个登录屏幕,在该屏幕中用户可以选择工作类型(两个按钮或单选按钮)。

    如果他选择了 Driver,那么在数据库中创建一个 Driver 节点,其中包含他编写的信息,并将他引导到 home Activity:

    FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
    DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Drivers").child(user.getUid());
    ref.child("name").setValue(name);
    Intent startIntent = new Intent(MainActivity.this,DriverHomeActivity.class);
    startActivity(startIntent);
    finish();
    

    也为 Rider 做同样的事情。


    如果用户,关闭应用程序而不注销。在应该打开的第一个活动中(例如:启动活动),检查是否有当前用户并检查用户类型:

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    DatabaseReference driver = FirebaseDatabase.getInstance().getReference().child("Drivers"); 
    DatabaseReference rider = FirebaseDatabase.getInstance().getReference().child("Riders");
    
      if (user != null) {
        driver.child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() { 
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) { 
                        Intent i = new Intent(SplashActivity.this, DriverHomeActivity.class);
                        startActivity(i);
                        finish();
                    } else {
                        Intent intent = new Intent(SplashActivity.this, RiderHomeActivity.class);
                        startActivity(intent);
                        finish();
                      }
                @Override
              public void onCancelled(DatabaseError databaseError) {
    
                   }
               });
    

    这里在启动活动中,它会检查是否有当前用户(如果用户已登录)user.getUid() 将返回当前用户 ID,然后检查此用户 ID 是否在 Drivers 节点下,并且然后它会将他引导到司机的家中活动。

    【讨论】:

    • 上面的代码对我来说似乎是正确的,但即使我以 Driver 身份登录,应用程序也会打开 RiderHomeActivity。
    • 我检查了很多次,它总是指向 RiderHomeActivity。
    • 是的,当然。我弄错了,有一个节点用户,其中存在 Drivers 和 Rider 节点。感谢您的帮助。
    【解决方案2】:

    您的问题可以通过使用SharedPreference 机制来解决。 在这里,您可以将登录状态保持在SharedPreference,如下所示:-。

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(); 
    prefs.edit().putBoolean("login", true).commit();
    

    当用户不会退出并返回时,您应该使用SharedPreference 变量检查初始屏幕中的登录状态并将用户移动到相应的活动。

    Boolean loginStatus = prefs.getBoolean("login", false);

    if (loginStatus) {
    // Move to Home activity
    } else {
    //Move to login screen
    }
    

    一点点文档here

    【讨论】:

      【解决方案3】:

      您可以考虑在您的 android 应用程序中保留一个LauncherActivity,这将决定进一步启动哪个活动。示例 LauncherActivity 可能如下所示。

      public class LauncherActivity extends AppCompatActivity {
      
          private boolean loggedIn = false;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              boolean isLoggedInAsDriver = getSharedPreferences.getBoolean("is_driver", false);
              startApplication(isLoggedInAsDriver);
              finish();
          }
      
          private void startApplication(boolean isLoggedInAsDriver) {
              Intent intent;
              if (isLoggedInAsDriver) {
                  intent = new Intent(LauncherActivity.this, DriverActivity.class);
                  startActivity(intent);
                  finish();
              } else {
                  intent = new Intent(LauncherActivity.this, RiderActivity.class);
                  startActivity(intent);
                  finish();
              }
          }
      }
      

      您的应用程序只能有一个启动器,因此在AndroidManifest.xml 中将LauncherActivity 标记为您的android 应用程序的启动器,如下所示。

      <activity
          android:name=".LauncherActivity"
          android:label="Your app name"
          android:theme="@style/AppTheme.NoActionBar">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
      

      现在您可能已经注意到我使用了一个标志(即isLoggedInAsDriver)从LauncherActivity 开始所需的活动。这是您需要存储在SharedPreferences 中的首选项数据,当您可以确定用户是司机还是骑手时。然后每次通过LauncherActivity 启动应用程序时,检查存储的值并获取用户类型。根据用户类型,启动第二个活动。

      【讨论】:

      • 我对 SharedPreferences 一无所知。您能否提供您在最后一段中谈论的代码。应该为此创建一个 java 类还是什么?
      【解决方案4】:

      在清单中使用此代码 并且 您应该将用户类型和用户 ID 保存在数据库中,并在启动应用程序时首先检查此内容,然后显示主页。

      <activity android:name=".MainActivity/>    
          <activity android:name=".DriverHomeActivity">
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
      
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      

      【讨论】:

      • 这个答案是错误的。请仔细检查提出的问题,然后回答。
      • 您应该将用户类型和用户 ID 保存在数据库中,并在启动应用程序时先检查此内容,然后显示主页。
      • 将此添加到您的答案中,而不是在此处发表评论。
      猜你喜欢
      • 2019-10-04
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      相关资源
      最近更新 更多