You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Firebase登录启动页的Android应用中实现无网络弹窗?

实现Android Firebase登录注册+无网络提示弹窗方案

我来一步步帮你落地这个需求,整体拆分为几个核心模块:设置启动页、网络状态检测、无网络弹窗、Firebase登录注册逻辑,下面是详细实现步骤:

1. 将登录页设为应用启动页

首先修改AndroidManifest.xml,给登录Activity添加MAINLAUNCHER的intent-filter,确保它是用户打开应用时的第一个页面:

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

注意:如果其他页面也有LAUNCHER标签,记得移除,避免启动页冲突。

2. 添加网络相关权限

AndroidManifest.xml根节点下添加权限,用于检测网络状态和访问网络(Firebase依赖网络):

<!-- 允许检测设备网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许应用访问互联网 -->
<uses-permission android:name="android.permission.INTERNET" />

3. 实现网络状态检测工具类

写一个全局可用的工具类,适配Android 6及以上版本的新网络检测API(旧API已过时):

import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.Build

object NetworkUtil {
    // 判断当前是否有可用的互联网连接
    fun isNetworkAvailable(context: Context): Boolean {
        val connectivityManager = 
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // Android 6+ 使用新API检测网络有效性
            val activeNetwork = connectivityManager.activeNetwork ?: return false
            val networkCapabilities = 
                connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false
            
            // 验证是否有可用的互联网连接(不是仅连接到WiFi但无网的状态)
            return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
                   networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
        } else {
            // 适配Android 6以下版本
            val activeNetworkInfo = connectivityManager.activeNetworkInfo
            return activeNetworkInfo != null && activeNetworkInfo.isConnected
        }
    }
}

4. 实现无网络提示弹窗

在登录/注册页面中添加弹窗方法,用于在无网络时提示用户:

private fun showNoNetworkDialog() {
    AlertDialog.Builder(this)
        .setTitle("网络连接异常")
        .setMessage("请检查您的移动网络或WiFi连接,然后重试")
        .setPositiveButton("确定") { dialog, _ ->
            dialog.dismiss()
        }
        .setCancelable(false) // 禁止点击外部关闭弹窗,确保用户关注提示
        .show()
}

5. 结合Firebase登录注册逻辑

在登录、注册的关键操作前,先检测网络状态:无网络则弹窗提示,有网络再执行Firebase的登录/注册操作。

登录页面(LoginActivity)示例

class LoginActivity : AppCompatActivity() {
    private lateinit var emailEt: EditText
    private lateinit var passwordEt: EditText
    private lateinit var loginButton: Button
    private lateinit var goToRegisterBtn: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        // 初始化视图组件
        emailEt = findViewById(R.id.et_email)
        passwordEt = findViewById(R.id.et_password)
        loginButton = findViewById(R.id.btn_login)
        goToRegisterBtn = findViewById(R.id.btn_go_to_register)

        // 登录按钮点击事件
        loginButton.setOnClickListener {
            val email = emailEt.text.toString().trim()
            val password = passwordEt.text.toString().trim()

            // 优先检测网络状态
            if (!NetworkUtil.isNetworkAvailable(this)) {
                showNoNetworkDialog()
                return@setOnClickListener
            }

            // 执行Firebase登录逻辑
            FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
                .addOnCompleteListener { task ->
                    if (task.isSuccessful) {
                        // 登录成功,跳转到应用首页
                        startActivity(Intent(this, MainActivity::class.java))
                        finish()
                    } else {
                        // 登录失败,提示错误信息
                        Toast.makeText(this, task.exception?.message, Toast.LENGTH_SHORT).show()
                    }
                }
        }

        // 跳转到注册页面
        goToRegisterBtn.setOnClickListener {
            startActivity(Intent(this, RegisterActivity::class.java))
        }
    }

    // 无网络弹窗实现
    private fun showNoNetworkDialog() {
        AlertDialog.Builder(this)
            .setTitle("网络连接异常")
            .setMessage("请检查您的移动网络或WiFi连接,然后重试")
            .setPositiveButton("确定") { dialog, _ ->
                dialog.dismiss()
            }
            .setCancelable(false)
            .show()
    }
}

注册页面(RegisterActivity)示例

class RegisterActivity : AppCompatActivity() {
    private lateinit var emailEt: EditText
    private lateinit var passwordEt: EditText
    private lateinit var registerButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        emailEt = findViewById(R.id.et_email)
        passwordEt = findViewById(R.id.et_password)
        registerButton = findViewById(R.id.btn_register)

        registerButton.setOnClickListener {
            val email = emailEt.text.toString().trim()
            val password = passwordEt.text.toString().trim()

            // 网络状态检测
            if (!NetworkUtil.isNetworkAvailable(this)) {
                showNoNetworkDialog()
                return@setOnClickListener
            }

            // 执行Firebase注册逻辑
            FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener { task ->
                    if (task.isSuccessful) {
                        Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show()
                        finish() // 注册完成后返回登录页
                    } else {
                        Toast.makeText(this, task.exception?.message, Toast.LENGTH_SHORT).show()
                    }
                }
        }
    }

    private fun showNoNetworkDialog() {
        AlertDialog.Builder(this)
            .setTitle("网络连接异常")
            .setMessage("请检查您的移动网络或WiFi连接,然后重试")
            .setPositiveButton("确定") { dialog, _ ->
                dialog.dismiss()
            }
            .setCancelable(false)
            .show()
    }
}

6. 可选:实时监听网络状态变化

如果想在用户操作过程中网络突然断开时自动弹窗,可以添加网络状态监听:

private lateinit var networkCallback: ConnectivityManager.NetworkCallback

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)

    // 初始化网络监听
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onLost(network: Network) {
            super.onLost(network)
            // 回到主线程更新UI(网络操作在子线程,弹窗必须在主线程)
            runOnUiThread {
                showNoNetworkDialog()
            }
        }

        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            runOnUiThread {
                Toast.makeText(this@LoginActivity, "网络已恢复", Toast.LENGTH_SHORT).show()
            }
        }
    }

    // 注册网络监听
    connectivityManager.registerNetworkCallback(
        NetworkRequest.Builder()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            .build(),
        networkCallback
    )

    // 其他初始化逻辑...
}

override fun onDestroy() {
    super.onDestroy()
    // 注销监听,避免内存泄漏
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    connectivityManager.unregisterNetworkCallback(networkCallback)
}

最后:Firebase依赖配置

确保项目已集成Firebase Auth,在Module级build.gradle中添加依赖:

// 推荐使用Firebase BOM管理版本,避免版本冲突
implementation platform('com.google.firebase:firebase-bom:32.7.0')
implementation 'com.google.firebase:firebase-auth'

同时在项目级build.gradle中添加Google服务插件:

plugins {
    id 'com.android.application' version '7.4.2' apply false
    id 'com.google.gms.google-services' version '4.4.0' apply false
}

并在Module级build.gradle顶部应用插件:

plugins {
    id 'com.android.application'
    id 'com.google.gms.google-services'
}

这样就完成了所有需求:登录页作为启动页,无网络时自动弹窗提示,同时实现完整的Firebase登录注册功能。

内容的提问来源于stack exchange,提问作者user8637744

火山引擎 最新活动