我有一个应用程序,可以从我的网站上的json页面获取文章(例如:test.com/api/v1/latest)
我想通知用户他们是否没有阅读最新文章!
我保存了用户阅读的上一篇文章的ID,然后我想获取上一篇文章的ID(来自此页面:test.com/api/v1/lastid)!
当应用关闭且未运行<
时
然后检查:如果网站中的最后一篇文章ID大于设备中保存的ID,则通知用户通知!
我想每3或6小时做一次!我怎样才能做到这一点 ?最好的方法是什么?
ps1:我应该说我在编写或创建REST应用程序时没有任何问题,我正在寻找解决方案或提示来完成我的工作!
ps2:我使用意向服务和gson从网站上获取文章,我知道json数组!
答案 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
}
}