首页 > 解决方案 > 如何在登录屏幕出现时阻止用户返回,而不是终止活动(Firebase 身份验证)

问题描述

我设计了一个带有自己独立活动(Splash Activity)的启动画面:

class SplachActivity:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    setTheme(R.style.AppTheme)
    val user = FirebaseAuth.getInstance().currentUser
    if (user != null)
    {
        AuthUI.getInstance().signOut(this)
        val startIntent = Intent(this,MainActivity::class.java)
        startIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
        startActivity(startIntent)
        finish()
    }
    else
    {
        val providers = arrayListOf(AuthUI.IdpConfig.EmailBuilder().build(), AuthUI.IdpConfig.GoogleBuilder().build())
        startActivityForResult(
            AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setLogo(R.drawable.ic_calculate)
                .setIsSmartLockEnabled(false)
                .setAvailableProviders(providers)
                .build(),
            0)

    }
    super.onCreate(savedInstanceState)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if(requestCode == 0)
    {
        val response = IdpResponse.fromResultIntent(data)
        if(resultCode == Activity.RESULT_OK)
        {

            val startIntent = Intent(this,MainActivity::class.java)
            startIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
            startActivity(startIntent)
            finish()
        }
        else
        {
            if (response != null) {
                Log.e("LogIn Error","${response.error?.errorCode}")
            }
        }
    }
}

如您所见,此启动屏幕在充当启动器的同时,还充当活动,如果用户未登录,则将用户带到登录屏幕。

但是,我试图阻止用户返回此活动(通过按后退按钮,因为此活动没有布局)。我尝试了以下方法:

        <activity android:name=".SplachActivity"
        android:theme="@style/AppTheme" android:noHistory="true" android:excludeFromRecents="true">
    </activity>

但是通过这样做,活动将在导航离开后被杀死,这导致 onActivityResult() 永远不会被调用。

所以我不确定我能做些什么来不终止活动但仍然阻止用户返回此活动(在登录期间和登录后),因为我无法更改 Firebase 提供的身份验证程序.

谢谢!

标签: androidauthenticationfirebase-authentication

解决方案


简而言之,您必须禁用后退按钮。

你可以这样做:

@Override
public void onBackPressed() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder.setTitle("Close Application?")
            .setMessage("Do you really want to exit?")
            .setCancelable(false)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    MainActivity.super.onBackPressed();
                }
            })

            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

    AlertDialog alertDialog = builder.create();
    alertDialog.show();
}

将此添加到您的登录活动中。这将创建一个警报对话框,而不是单击返回按钮返回,如下所示。

警报对话框的屏幕截图


推荐阅读