簡體   English   中英

Android:如果有用戶登錄,則啟動不同的活動

[英]Android: Start different activity if there is a user logged in

我正在構建一個 Android 應用程序,其中一個活動是登錄屏幕。 當應用程序打開時,如果用戶已經登錄,我想跳過 LoginActivity 並將用戶定向到另一個。 當用戶登錄我的應用(使用 Google Firebase)時,我將他們的用戶名和其他數據保存在他們設備的共享首選項中。 當他們注銷時,他們的共享首選項將被清除。

我目前擁有清單文件的方式是,啟動應用程序時唯一可以打開的活動是 LoginActivity:

        <activity android:name=".LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

在 LoginActivity 的 OnCreate() 方法中,如果共享首選項中保存了用戶名(意味着用戶已登錄),我會立即更改活動:

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SharedPreferences userData = getApplicationContext().
                getSharedPreferences("userdata", 0);
        String n = userData.getString("username", "");
        if (!userData.getString("username", "").equals(""))
        {
            Intent myIntent = new Intent(LoginActivity.this, TabbedActivity.class);
            startActivity(myIntent);
        }
}

但是,這種方法存在問題。 很多時候,在啟動 TabbedActivity 之前,LoginActivity 仍會顯示一秒鍾。 我想解決這個問題,以便在用戶登錄時實際上根本看不到 LoginActivity。

我認為我采取的方法都是錯誤的,並且有一種更簡潔的方法可以立即打開正確的活動。 對此的任何幫助將不勝感激。

一種可能的方法:

  1. 為飛濺主題創建樣式:
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:statusBarColor">@color/background_splash</item>
    <item name="android:windowBackground">@drawable/background_splash</item>
</style>
  1. 為飛濺創建一個背景可繪制對象(drawable/background_splash.xml):
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <color android:color="@color/background_splash"/>
    </item>
    <item>
        <bitmap
            android:src="@drawable/ic_splash_logo"
            android:gravity="center"/>
    </item>
</layer-list>
  1. 在您的清單中,將SplashTheme設置為您的應用程序/啟動器活動主題:
<application
    ...
    android:theme="@style/SplashTheme">

<!-- or -->

<activity
    ...
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

  1. 如果用戶未登錄,則在onCreate() LoginActivity中設置正常的應用主題和內容視圖,並在MainActivity設置應用主題(或在清單中設置)
public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        val isUserLoggedIn = ...
        if (!isUserLoggedIn)
        {
            setTheme(R.style.AppTheme)
            setContentView(R.layout.activity_login)
        } 
        else {
            //Navigate to Main Activity
        }
    }
}

啟動畫面參考

我不確定這是否是最好的方法,但是您可以創建一個 Loading 活動來啟動在任何情況下所需的活動。

public class LoadingActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SharedPreferences userData = getApplicationContext().
                getSharedPreferences("userdata", 0);
        String n = userData.getString("username", "");
        if (!userData.getString("username", "").equals(""))
        {
            Intent myIntent = new Intent(LoginActivity.this, TabbedActivity.class);
            startActivity(myIntent);
        }else{
            Intent myIntent = new Intent(OtherActivity.this, TabbedActivity.class);
            startActivity(myIntent);
        }
}

關於視圖,同時添加 gif 或徽標。

我有一個實現,但沒有共享首選項,而且我在任何時候都看不到登錄屏幕。

我的結構如下:我有一個初始啟動畫面,然后是一個主要活動,我在這里重寫 onStart 方法以檢查用戶是否有一個打開的部分,如果它被傳遞給主活動。

我希望它可以幫助你,如果你不告訴我,我會添加更多的代碼。

public override fun onStart() {
    super.onStart()
    // if user is loged goto Home Activity
    if (firebaseUser != null) {
        // Name, email address, and profile photo Url
        val name = firebaseUser?.displayName
        val email = firebaseUser?.email
        val photoUrl = firebaseUser?.photoUrl
        val uid = firebaseUser?.uid
        val emailVerified = firebaseUser!!.isEmailVerified
                  
        goToActivity<HomeActivity>()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM