如何在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,提问作者리척수
相关产品推荐
相关产品推荐

