新文章发布时在Android应用中显示通知

时间:2018-06-13 06:05:29

标签: android json api notifications notify

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

我想通知用户他们是否没有阅读最新文章!

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

  

当应用关闭且未运行<

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以使用WorkManager(https://developer.android.com/topic/libraries/architecture/workmanager)(用于常规计划任务)或Firebase云消息传递(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版本中使用它。

然后创建一个"工人"做你的工作并安排它(例如从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
    }
}