показывать уведомление в приложении для Android при публикации новой статьи - PullRequest
0 голосов
/ 13 июня 2018

У меня есть приложение, которое получает статьи со страницы json на моем сайте (например: test.com/api/v1/latest)

Я хочу уведомить пользователей, если они не читали последнюю версиюстатьи!

я сохранил идентификатор последней статьи, которую прочитал пользователь, затем я хочу получить идентификатор последней статьи, которая была опубликована (с этой страницы: test.com/api/v1/lastid)!

когда приложение закрыто и не запущено <</p>

, затем проверьте: если последний идентификатор статьи на веб-сайте больше, чем сохраненный идентификатор на устройстве, то уведомите пользователя с уведомлением!

Я хочу делать это каждые 3 или 6 часов!Как я могу это сделать ?Каков наилучший способ сделать это?

ps1: я должен сказать, что у меня нет проблем с кодировкой или созданием REST-приложения, я ищу решение или совет для своей работы!

ps2: я использую службу намерений и gson, чтобы получить статьи с веб-сайта, и я знаю массив json!

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете использовать 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.

Затем создайте «Рабочий» длявыполнять свою работу и планировать ее (например, из 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
    }
}
...