我在应用程序关闭时生成新字符串时遇到问题。
任务片段.kt
class TaskFragment : Fragment(), LifecycleObserver {
private lateinit var viewModel: TaskFragmentViewModel
private lateinit var binding: FragmentTaskBinding
private val firstTask: MutableList<String> = mutableListOf("Udělej si své oblíbené jídlo", "Pusť si svojí oblíbenou písničku", "Pusť si svůj oblíbený film/seriál", "Přečti si kapitolu svojí oblíbené knihy", "Pusť si svojí oblíbenou pohádku z dětství")
private val secondTask: MutableList<String> = mutableListOf("Projdi se do lesa", "Jdi na čerstvý vzduch", "Udělej si projížďku, autem nebo na kole", "Zahraj si svůj oblíbený sport", "Napiš své oblíbené osobě")
private val thirdTask: MutableList<String> = mutableListOf("Ukliď si pokoj a kochej se", "Udělej pro sebe něco hezkého (pochval se, udělej oblíbenou činnost)", "Převlékni si postel a udělej si útulné spací prostředí", "Vypij sklenici vody", "Udělej si vnitřní a vnější hygienu")
private lateinit var _currentFirstTask: String
val currentFirstTask: String
get() = _currentFirstTask
private lateinit var _currentSecTask: String
val currentSecTask: String
get() = _currentSecTask
private lateinit var _currentThirdTask: String
val currentThirdTask: String
get() = _currentThirdTask
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentTaskBinding.inflate(inflater, container, false)
viewModel = ViewModelProvider(this).get(TaskFragmentViewModel::class.java)
val sharedPrefs = requireActivity().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
binding.checkTaskOne.isChecked = sharedPrefs.getBoolean("checkbox1", false)
binding.checkTaskTwo.isChecked = sharedPrefs.getBoolean("checkbox2", false)
binding.checkTaskThree.isChecked = sharedPrefs.getBoolean("checkbox3", false)
changeTasks(true, sharedPrefs)
binding.apply {
checkTaskOne.text = currentFirstTask
checkTaskTwo.text = currentSecTask
checkTaskThree.text = currentThirdTask
}
binding.checkTaskOne.setOnCheckedChangeListener { _, isChecked ->
sharedPrefs.edit().putBoolean("checkbox1", isChecked).apply()
updateCheckboxes()
}
binding.checkTaskTwo.setOnCheckedChangeListener { _, isChecked ->
sharedPrefs.edit().putBoolean("checkbox2", isChecked).apply()
updateCheckboxes()
}
binding.checkTaskThree.setOnCheckedChangeListener { _, isChecked ->
sharedPrefs.edit().putBoolean("checkbox3", isChecked).apply()
updateCheckboxes()
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val sharedPrefs = requireActivity().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
updateCheckboxes()
changeTasks(true, sharedPrefs)
}
/*override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(this)
}*/
/*@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onFragmentResume() {
viewModel.changeTasks(false, requireContext().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE))
}*/
override fun onResume() {
super.onResume()
LocalBroadcastManager.getInstance(requireContext()).registerReceiver(
updateCheckboxesReceiver,
IntentFilter("com.example.mindhelper.UPDATE_CHECKBOXES")
)
/*viewModel.tasks.observe(viewLifecycleOwner) { tasks ->
binding.checkTaskOne.text = viewModel.currentFirstTask
binding.checkTaskTwo.text = viewModel.currentSecTask
binding.checkTaskThree.text = viewModel.currentThirdTask
}*/
}
override fun onPause() {
super.onPause()
updateCheckboxes()
val sharedPrefs = requireActivity().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
changeTasks(true, sharedPrefs)
LocalBroadcastManager.getInstance(requireContext())
.unregisterReceiver(updateCheckboxesReceiver)
//lifecycle.removeObserver(this)
}
private val updateCheckboxesReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val sharedPrefs = requireActivity().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
changeTasks(false, sharedPrefs)
binding.apply {
checkTaskOne.text = currentFirstTask
checkTaskTwo.text = currentSecTask
checkTaskThree.text = currentThirdTask
checkTaskOne.isChecked = false
checkTaskTwo.isChecked = false
checkTaskThree.isChecked = false
textView2.text = ""
}
}
}
fun changeTasks(fromCache: Boolean, sharedPrefs: SharedPreferences) {
_currentFirstTask = if (fromCache) {
sharedPrefs.getString("task1", firstTask.random())!!
} else {
firstTask.random().also { task ->
sharedPrefs.edit {
putString("task1", task)
}
}
}
_currentSecTask = if (fromCache) {
sharedPrefs.getString("task2", secondTask.random())!!
} else {
secondTask.random().also { task ->
sharedPrefs.edit {
putString("task2", task)
}
}
}
_currentThirdTask = if (fromCache) {
sharedPrefs.getString("task3", thirdTask.random())!!
} else {
thirdTask.random().also { task ->
sharedPrefs.edit {
putString("task3", task)
}
}
}
}
private fun updateCheckboxes() {
val allChecked = binding.checkTaskOne.isChecked && binding.checkTaskTwo.isChecked && binding.checkTaskThree.isChecked
binding.checkTaskOne.isEnabled = !allChecked || binding.checkTaskOne.isChecked
binding.checkTaskTwo.isEnabled = !allChecked || binding.checkTaskTwo.isChecked
binding.checkTaskThree.isEnabled = !allChecked || binding.checkTaskThree.isChecked
if (allChecked) {
binding.checkTaskOne.isEnabled = false
binding.checkTaskTwo.isEnabled = false
binding.checkTaskThree.isEnabled = false
binding.textView2.setText(R.string.splneno)
}
}
}
这里我有一个带有三个复选框的片段,它从池中获取随机任务。当所有复选框都被选中时,复选框将停用。有广播,一旦触发警报,它就会重新激活并取消选中复选框。这在应用程序打开或关闭时都正常工作。但字符串仅在片段出现在屏幕上时生成。
AlarmReciever.kt
override fun onReceive(context: Context, intent: Intent) {
val viewModel = TaskFragmentViewModel()
if (intent.action == "android.intent.action.BOOT_COMPLETED") {
val calendar: Calendar = Calendar.getInstance().apply {
timeInMillis = System.currentTimeMillis()
set(Calendar.HOUR_OF_DAY, 10)
set(Calendar.MINUTE, 0)
}
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val alarmIntent = Intent(context, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0)
alarmManager.setInexactRepeating(
AlarmManager.RTC,
calendar.timeInMillis,
AlarmManager.INTERVAL_FIFTEEN_MINUTES,
pendingIntent
)
}
val notificationUtils = NotiUtils(context)
val notification = notificationUtils.getNotificationBuilder().build()
notificationUtils.getManager().notify(150, notification)
val sharedPrefs = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
sharedPrefs.edit {
putBoolean("checkbox1", false).apply()
putBoolean("checkbox2", false).apply()
putBoolean("checkbox3", false).apply()
}
val updateCheckboxesIntent = Intent("com.example.mindhelper.UPDATE_CHECKBOXES")
LocalBroadcastManager.getInstance(context)
.sendBroadcast(updateCheckboxesIntent)
/*val updateTasksIntent = Intent("com.example.mindhelper.ACTION_CHANGE_TASKS")
LocalBroadcastManager.getInstance(context).sendBroadcast(updateTasksIntent)*/
}
这是我的闹钟接收器。如您所见,我注册了片段中的广播。任何帮助将不胜感激!