You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AlarmReceiver的notifyNotification中获取CheckBox状态并上传Firebase

问题根因

你无法在AlarmReceiver中调用findViewById的核心原因是:findViewById是Activity/View类独有的方法,仅能在界面存活、处于内存中时调用获取控件实例。而AlarmReceiver是独立的广播接收器组件,运行时你的App可能已经退到后台、甚至被系统杀死,MainActivity不在内存中,自然无法获取CheckBox实例。

解决方案

通过全局可访问的SharedPreferences存储CheckBox的选中状态,闹钟触发时直接读取存储的状态判断是否需要上传数据到Firebase即可,不需要获取控件实例。

具体代码修改

1. 修改MainActivity代码

首先添加CheckBox状态的存储、读取逻辑:

第一步:在MainActivity的companion object中新增存储用的key

companion object {
    // 原有常量保留,新增以下三个key
    private const val CHECKBOX_A_KEY = "checkbox_a"
    private const val CHECKBOX_B_KEY = "checkbox_b"
    private const val CHECKBOX_C_KEY = "checkbox_c"

    private const val SHARED_PREFERENCES_NAME = "time"
    private const val ALARM_KEY = "alarm"
    private const val ONOFF_KEY = "onOff"
    private const val ALARM_REQUEST_CODE = 1000
}

第二步:在MainActivity的onCreate方法中添加CheckBox状态监听与存储逻辑

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

    // 原有逻辑保留,新增以下代码
    val checkboxA = findViewById<CheckBox>(R.id.checkbox)
    val checkboxB = findViewById<CheckBox>(R.id.checkbox1)
    val checkboxC = findViewById<CheckBox>(R.id.checkbox2)
    val sp = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)

    // 回显之前保存的选中状态
    checkboxA.isChecked = sp.getBoolean(CHECKBOX_A_KEY, false)
    checkboxB.isChecked = sp.getBoolean(CHECKBOX_B_KEY, false)
    checkboxC.isChecked = sp.getBoolean(CHECKBOX_C_KEY, false)

    // 选中状态变化时自动保存到SharedPreferences
    checkboxA.setOnCheckedChangeListener { _, isChecked ->
        sp.edit().putBoolean(CHECKBOX_A_KEY, isChecked).apply()
    }
    checkboxB.setOnCheckedChangeListener { _, isChecked ->
        sp.edit().putBoolean(CHECKBOX_B_KEY, isChecked).apply()
    }
    checkboxC.setOnCheckedChangeListener { _, isChecked ->
        sp.edit().putBoolean(CHECKBOX_C_KEY, isChecked).apply()
    }

    // 原有按钮点击逻辑保留
    initOnOffButton()
    initChangeAlarmTimeButton()
    // ...其余原有代码不变
}

2. 修改AlarmReceiver代码

读取SharedPreferences中存储的状态判断上传逻辑:

private fun notifyNotification(context: Context) {
    // 原有通知发送逻辑保留
    with(NotificationManagerCompat.from(context)) {
        val build = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
            .setContentTitle("알람")
            .setContentText("일어날 시간입니다.")
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
        notify(NOTIFICATION_ID, build.build())
    }

    // 读取存储的CheckBox状态
    val sp = context.getSharedPreferences("time", Context.MODE_PRIVATE)
    val isCChecked = sp.getBoolean("checkbox_c", false)
    // 如果需要判断A、B的选中状态,同理读取即可
    // val isAChecked = sp.getBoolean("checkbox_a", false)
    // val isBChecked = sp.getBoolean("checkbox_b", false)

    val firebaseDatabase = FirebaseDatabase.getInstance()
    val databaseReference = firebaseDatabase.reference
    if (isCChecked) {
        databaseReference.child("c").setValue("C")
    }
    // 对应A、B的上传逻辑同理添加即可
}

内容的提问来源于stack exchange,提问作者리척수

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:54:00