gpt4 book ai didi

Android Notification - 如何根据模型属性创建系统

转载 作者:行者123 更新时间:2023-12-02 13:22:30 25 4
gpt4 key购买 nike

我一直在尝试在我的应用程序中实现通知,但没有成功。以下是我的观察:

要求:

  • 安排通知后,必须每月重复一次。
  • 通知将被一些模型对象数据膨胀,因此需要将对象传递给通知构建器。

  • 到目前为止我是如何解决这个问题的:

    我创建了一个 NotificationScheduler基本上创建 PendingIntent 的对象通知被解雇。
    object NotificationScheduler {
    fun scheduleNotification(context: Context, model: Model, cal: Calendar) {
    cal.set(Calendar.HOUR_OF_DAY, 11)
    val notificationIntent = Intent(context, NotificationPublisher::class.java)
    notificationIntent.putExtra("model", Utils.parcelToBytes(model))

    val pendingIntent = PendingIntent.getBroadcast(context, 1, notificationIntent,
    PendingIntent.FLAG_UPDATE_CURRENT)
    val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
    alarmManager.set(AlarmManager.RTC_WAKEUP, cal.timeInMillis, pendingIntent)
    }
    }

    然后我有一个 NotificationPublisher应该显示通知并通过调用 NotificationScheduler 设置下一个通知的类再次。
    class NotificationPublisher: BroadcastReceiver() {
    var model: Model? = null

    override fun onReceive(context: Context?, intent: Intent?) {
    val modelBytes = intent?.getByteArrayExtra("model")

    if (modelBytes != null) {
    model = Utils.bytesToParcel(modelBytes, Model.CREATOR)
    }

    val notificationBuilder = NotificationBuilder(context!!, model!!)
    val notification = notificationBuilder.buildNotification()

    val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.notify(1, notification)

    //schedules the next notification

    NotificationScheduler.scheduleNotification(context, model!!, Calendar.getInstance())
    }
    }
    NotificationBuilder类只需要 contextmodel并构建通知
    class NotificationBuilder(val context: Context, val model: Model) {

    fun buildNotification(): Notification {
    generateNotificationChannel(context)

    val builder = NotificationCompat.Builder(context, "ID")
    .setSmallIcon(R.drawable.sub)
    .setContentTitle(model.title)
    .setPriority(NotificationCompat.PRIORITY_HIGH)

    return builder.build()
    }

    private fun generateNotificationChannel(context: Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val name = "Test"
    val description = "description"
    val importance = NotificationManager.IMPORTANCE_DEFAULT

    val channel = NotificationChannel("ID", name, importance)
    channel.description = description

    val notificationManager = context.getSystemService(NotificationManager::class.java)
    notificationManager?.createNotificationChannel(channel)
    }
    }

    我对这种方法的问题:

    如果我在创建通知后故意显示通知,它会起作用,但是每当用户重新启动他的设备或终止进程时,我都会收到 NullPointerException。在调试时我发现我存储在 notificationIntent 中的数据在 NotificationScheduler ,一旦设备重新启动, onReceive() 中将不再可用的 NotificationPublisher因此会产生一个NPE。

    我认为我在使用这种方法时在概念上做错了什么,我希望您能帮助我弄清楚如何实现上述要求。

    最佳答案

    好吧..,我不会详细介绍您的编程问题,也不会帮助您找到错误..但是我已经仔细阅读了您的问题,并且也得到了问题及其解决方案..!!这有点理论化..但我可以看到你的编程技巧很好..所以你只需要方向和概念许可。

    开始了 :

    It works if I purposely display the notification as soon as it is created, but I get a NullPointerException whenever the user, for example, reboots his device or kills the process.



    这是问题的主要原因。每当系统重新启动或系统杀死应用程序时。

    What causing it...?



    每当系统重新启动时“ AlarmManager 设置的所有警报都不再保留,需要应用程序再次重新安排”

    What is work around then...?



    维护一个预定警报表。一旦系统触发 ON_BOOT_COMPLETE重新安排一切。

    Most of the devices in market not triggering my ON_BOOT_COMPLETE receiver..!!



    是的,现在大多数设备只保留主要公司的服务,如 google , facebook , whatsapp , twitter , instagram其余所有在启动时被丢弃。

    Why mobile manufacturers does this?



    因为它是一项业务,它还提高了整个设备的性能和速度。如果他们不允许上述公司在重启时提供服务..,那么没有人会使用这样的手机..!!

    Any solution for this..?



    使用 firebase 作业调度程序。让 Google Play 服务处理您的服务。

    如果我错了或者需要进一步澄清这个问题,我希望它能帮助你并纠正我。谢谢

    编辑 2

    我建议通过您的主要 Activity context 创建一个工作计划作业并让它处理 google play 服务,这些服务将在 every reboot 上开始执行作业.该作业应调用具有适当通知的前台服务。并通过该前台服务再次调用 intentservice这将 re-schedule所有 alarms通过从 Sqlite 表中一一读取。

    编辑:3

    即使您遵循此处建议的所有范式...您还会注意到另一个问题..

    Google play not starting My foreground service on reboot..!!



    是的...,作为帖子 Marshmallowmodified ROMs (包括库存的 android 和移动制造商修改过的操作系统,如 OxygenOs、FunTouchOs、ColorOs,.. 这个列表也永远不会结束)由于电池已优化,并且没有私有(private)应用程序进程在重新启动时可以进入内存..!!

    Now is there any way i can tackle this problem too...?



    是的..向用户显示一个大胆而明亮的警报:
    If You want to perform this app normally, 
    you must stop optimising battery for this
    app from settings..!!

    That what the ways we can tackle these many problems.. Yes i understand it has no well documentation from google and no sample codes too, Still in case if you require any help regarding implementing any sub-point I will help you in implementing these all sub-points as well



    谢谢你,因为它帮助了你

    关于Android Notification - 如何根据模型属性创建系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52368109/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com