【问题标题】:show notification in android app when new article published新文章发布时在 android 应用中显示通知
【发布时间】:2018-06-13 06:05:29
【问题描述】:

我有一个从我网站上的 json 页面获取文章的应用程序(例如:test.com/api/v1/latest)

如果用户没有阅读最新文章,我想通知他们!

我保存了用户阅读的最后一篇文章的 id,然后我想获取最后发表的文章的 id(来自此页面:test.com/api/v1/lastid)!

当应用程序关闭且未运行时

然后检查:如果网站中的最后一篇文章 id 大于设备中保存的 id,则通过通知通知用户!

我想每 3 或 6 小时做一次!我怎样才能做到这一点 ?最好的方法是什么?

ps1:我应该说我在编码或创建 REST 应用程序方面没有任何问题,我正在寻找解决方案或提示来完成我的工作!

ps2:我使用意图服务和 gson 从网站获取文章,我知道 json 数组!

【问题讨论】:

    标签: android json api notifications notify


    【解决方案1】:

    您可以使用 WorkManager (https://developer.android.com/topic/libraries/architecture/workmanager)(用于定期计划任务)或 Firebase Cloud Messaging (https://firebase.google.com/docs/cloud-messaging/)(用于从您的服务器推送)。

    对于 WorkManager:

    将其添加到您的项目中,请参阅https://developer.android.com/topic/libraries/architecture/adding-components:

    allprojects {
        repositories {
            jcenter()
            google()
        }
    }
    

    将其添加到您的依赖项中:

    dependencies {
        def work_version = "1.0.0-alpha03"
    
        implementation "android.arch.work:work-runtime:$work_version-ktx"
    
        // optional - Firebase JobDispatcher support
        // this makes WorkManager work better at old Android Versions -
        // it depends on your target group if you need that
        implementation "android.arch.work:work-firebase:$work_version"
    
        // optional - Test helpers
        androidTestImplementation "android.arch.work:work-testing:$work_version"
    }
    

    您将需要最新版本的支持库。版本号是目标 SDK 版本(测试的最高版本),而不是最低 SDK。您仍然可以在较旧的 Android 版本上使用它。

    然后创建一个“Worker”来完成你的工作并安排它(例如从 MainActivity.onCreate())

    class UpdateContentWorker: Worker() {
        companion object {
            val TAG = "UpdateContentWork"
            val enqueueLock = Object()
    
            fun enqueuePeriodicallyIfNotDone() {
                // Async.disk is a ThreadPool; Just use anything to run it off the UI Thread
                Async.disk.submit {
                    synchronized(enqueueLock) {
                        val statuses = WorkManager.getInstance().synchronous().getStatusesByTagSync(TAG)
    
                        if (!scheduledOrRunning(statuses)) {
                            WorkManager.getInstance().synchronous().enqueueSync(
                                    PeriodicWorkRequestBuilder<UpdateContentWorker>(1L, TimeUnit.HOURS)
                                            .addTag(TAG)
                                            .setConstraints(
                                                    Constraints.Builder()
                                                            .setRequiresBatteryNotLow(true)
                                                            .setRequiredNetworkType(NetworkType.CONNECTED)
                                                            .build()
                                            )
                                            .build()
                            )
                        }
                    }
                }
            }
    
            private fun scheduledOrRunning(statuses: Collection<WorkStatus>): Boolean {
                return statuses.find {
                    it.state == State.RUNNING || it.state == State.BLOCKED || it.state == State.ENQUEUED
                } != null
            }
        }
    
        override fun doWork(): WorkerResult {
            // do what the function title says ...
    
            return WorkerResult.SUCCESS
        }
    }
    

    【讨论】:

    • 我看到了 Firebase !这就是我要的 。但我想自动检查我的服务器而不是 firebase 。在 firebase 我应该手动推送通知!我检查工作经理,让你知道我从中得到了什么;) tnx
    • workmanager 看起来很棒!但我找不到正确的依赖! :/ 我应该在 gradle 文件中写什么? ://
    • workmanager 的最低 sdk 太高(支持库 27.1)!我希望我的应用在 android 4.4 及更高版本中运行! :( 旧应用程序如何处理这样的工作?!
    • 当我写:在 gradle 文件依赖项中实现“android.arch.work:work-runtime:1.0.0-alpha02”时,它说无法解析!我想念什么?我应该向 android studio 添加什么? (我不使用 kotlin)@jonas-lochmann
    • 在所有项目和 buildscript 我有 google() 和 jcenter() :( 我想念什么?:( @jonas-lochmann
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多