应用关闭时生成新字符串

问题描述 投票:0回答:0

我在应用程序关闭时生成新字符串时遇到问题。

任务片段.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)*/

}

这是我的闹钟接收器。如您所见,我注册了片段中的广播。任何帮助将不胜感激!

android kotlin broadcastreceiver
© www.soinside.com 2019 - 2024. All rights reserved.