android - 如何在登录屏幕出现时阻止用户返回,而不是终止活动(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 提供的身份验证程序.
谢谢!
解决方案
简而言之,您必须禁用后退按钮。
你可以这样做:
@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();
}
将此添加到您的登录活动中。这将创建一个警报对话框,而不是单击返回按钮返回,如下所示。
推荐阅读
- python - 使用 pandas 访问 excel 中的特定单元格值
- python - 从缓冲区 C 与 Python 中提取数据。建议?
- laravel-5.2 - 关系一对一的laravel 5.2
- python - 将额外的输入传递给 Keras 深度网络以计算自定义成本函数
- solr - Solr - 按查询中的值顺序对结果进行排序
- html - 如何在寓言中切换显示/隐藏元素?
- javascript - Javascript 使用 Math.random 在 for 循环中生成随机 rgba 值
- node.js - 每次我们向 db 中的特定 id 发出请求时,如何计算查看次数?
- r - 如何查看虚拟变量
- sql - CASE 和 UPIVOT 的区别在于找到跨列的最大日期;ORA-00904 错误信息