android - 新文章发布时在 android 应用中显示通知
问题描述
我有一个从我网站上的 json 页面获取文章的应用程序(例如:test.com/api/v1/latest)
如果用户没有阅读最新文章,我想通知他们!
我保存了用户阅读的最后一篇文章的 id,然后我想获取最后发表的文章的 id(来自此页面:test.com/api/v1/lastid)!
当应用程序关闭且未运行时 <
然后检查:如果网站中的最后一篇文章 id 大于设备中保存的 id,则通过通知通知用户!
我想每 3 或 6 小时做一次!我怎样才能做到这一点 ?最好的方法是什么?
ps1:我应该说我在编码或创建 REST 应用程序方面没有任何问题,我正在寻找解决方案或提示来完成我的工作!
ps2:我使用意图服务和 gson 从网站获取文章,我知道 json 数组!
解决方案
您可以使用 WorkManager(https://developer.android.com/topic/libraries/architecture/workmanager)(用于定期计划任务)或 Firebase 云消息传递(https://firebase.google.com/docs/cloud- messing/ )(用于从您的服务器推送)。
对于 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
}
}
推荐阅读
- sql - 在同一个数据库sql server中使用一些过滤器将值从一个表A复制到表B
- php - PHP使用XPATH从HTML页面获取文本和Href
- c - C中的指针和“非法指令(核心转储)”
- node.js - 无法从我的前端使用 axios 发送表单数据。出现网络错误。但是当我试图从邮递员那里打后端时,它工作正常
- r - 在 Shiny 的 pickerInput 中将答案下拉框移到右侧
- python - 人脸检测项目报错如何解决
- c# - 在 WPF 中获取十六进制颜色代码时出错
- python - 查找字长
- asp.net - ASP.NET MVC - IIS Express(谷歌浏览器)
- acumatica - 如何在 SOLine_RowUpdated 事件中跳过基本逻辑