使用workManager實現(xiàn)每日定時推送通知

寫這篇博客的緣由來自一個需求:

每日定時推送通知,提醒用戶完成簽到。如果后臺被清理缀踪,則在打開App后立即推送盈匾。

眾所周知腾务,如今的Android國產(chǎn)ROM想要實現(xiàn)定時操作需要做極強的保活削饵。

然而一旦做了毖沂荩活,那么程序就可能會消耗沒有必要的資源窿撬,變得很流氓启昧,這并不是我們想要看到的。

于是jobSchedule應運而生劈伴,這個庫應該是最完美的解決方案密末,但有api限制,并不能滿足我的需要跛璧。

后來嘗試了AlarmManager严里,這個工具也能較精確地定時工作,但是一旦程序被殺后臺追城,就再也不起作用刹碾。而且由于采用繼承Receiver的方式,在8點打開app無法收到本應是7點的通知座柱,因此也無法滿足需要迷帜。

于是選擇了workManager,這個比較新鮮的官方框架辆布。

各種情況是否定時推送 后臺未被清理 后臺被清理
原生ROM 推送 推送
國產(chǎn)ROM 推送 打開App后繼續(xù)推送

在程序沒有被殺的情況下瞬矩,能夠完成定時工作。

在程序被殺后锋玲,若是原生ROM景用,不會有影響;若是國產(chǎn)ROM惭蹂,不會自動推送通知伞插,但會在打開App的第一時間自動調用代碼,完成推送盾碗。

愚以為媚污,微博,知乎App也是用類似這樣的操作實現(xiàn)的推送廷雅,因為你殺掉后臺后并不能接收到推送(一加5t 氫os 8.1)耗美,但是一旦重新打開App京髓,會收到之前的提醒。
當然商架,這樣做的缺點就是無法做到精確定時堰怨,因為workManager的重復工作間隔必須大于15分鐘。因此即使使用最短的時間間隔蛇摸,也最多只能保證精度為15*2=30分鐘备图。

做到定時的原理就是,每15分鐘調用一次赶袄,查看時間是否是在指定的時間段揽涮。

如果在時間段內,且未推送饿肺,那么推送蒋困,并記錄。如果不在時間段內敬辣,則重置記錄為未推送家破。

有點繞,需要理一理=_=购岗。如果說精度大于一小時,就不用判斷了门粪。

至于使用方法就很簡單了喊积,其他博客也有詳細的講解,這里主要示例定時代碼玄妈,定時7點-7點30分推送任務乾吻。

1.添加依賴

implementation "android.arch.work:work-runtime:1.0.0-alpha09"

2.實現(xiàn)Worker的子類

import android.app.PendingIntent
import android.content.Intent
import androidx.work.Worker
import com.mredrock.cyxbs.common.utils.extensions.defaultSharedPreferences
import com.mredrock.cyxbs.common.utils.extensions.editor
import com.mredrock.cyxbs.mine.util.NotificationUtil
import java.util.*

/**
 * Created by zia on 2018/10/8.
 * 每日簽到提醒的work
 */
class SignWorker : Worker() {

    private val FLAG = "SIGNPUSH"

    override fun doWork(): Worker.Result {

        //讀取是否通知過
        val isPush = applicationContext.defaultSharedPreferences.getBoolean(FLAG, false)

        if (compareCurrentHour(7)) {
            if (!isPush) {
                //如果在指定時間段,并且沒有推送過通知
                applicationContext.defaultSharedPreferences.editor {
                    //寫入已通知
                    putBoolean(FLAG, true)
                }
                //繼續(xù)后面的推送通知代碼
            } else {
                //在指定時間段拟蜻,已推送過了绎签,則不再推送
                return Result.RETRY
            }
        } else {
            //不在時間段,重置標志位false
            applicationContext.defaultSharedPreferences.editor {
                putBoolean(FLAG, false)
            }
            return Result.RETRY
        }

        val resultIntent = Intent(applicationContext, DailySignActivity::class.java)
        val intent = PendingIntent.getActivity(applicationContext, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT)

        //推送通知
        NotificationUtil.makeNotification(applicationContext, "趕快去簽到領取積分哦~", CHANNEL_ID = "sign", pendingIntent = intent)

        return Worker.Result.SUCCESS
    }

    private fun compareCurrentHour(targetHour: Int): Boolean {
        val current = Calendar.getInstance().get(Calendar.HOUR_OF_DAY)
        return current == targetHour
    }
}

3.在其他地方調用

//獲取一個builder
val request = PeriodicWorkRequest
                        .Builder(SignWorker::class.java, 15, TimeUnit.MINUTES)
                        .build()
//插入worker隊列酝锅,并且使用enqueueUniquePeriodicWork方法诡必,防止重復
WorkManager.getInstance().enqueueUniquePeriodicWork(workName,ExistingPeriodicWorkPolicy.KEEP, request)

4.用戶取消推送

WorkManager.getInstance().cancelUniqueWork(workName)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市搔扁,隨后出現(xiàn)的幾起案子爸舒,更是在濱河造成了極大的恐慌,老刑警劉巖稿蹲,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扭勉,死亡現(xiàn)場離奇詭異,居然都是意外死亡苛聘,警方通過查閱死者的電腦和手機涂炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門忠聚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唱捣,你說我怎么就攤上這事两蟀。” “怎么了爷光?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵垫竞,是天一觀的道長。 經(jīng)常有香客問我蛀序,道長欢瞪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任徐裸,我火速辦了婚禮遣鼓,結果婚禮上,老公的妹妹穿的比我還像新娘重贺。我一直安慰自己骑祟,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布气笙。 她就那樣靜靜地躺著次企,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潜圃。 梳的紋絲不亂的頭發(fā)上缸棵,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音谭期,去河邊找鬼堵第。 笑死,一個胖子當著我的面吹牛隧出,可吹牛的內容都是我干的踏志。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胀瞪,長吁一口氣:“原來是場噩夢啊……” “哼针余!你這毒婦竟也來了?” 一聲冷哼從身側響起凄诞,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涵紊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幔摸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摸柄,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年既忆,在試婚紗的時候發(fā)現(xiàn)自己被綠了驱负。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦玖。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跃脊,靈堂內的尸體忽然破棺而出宇挫,到底是詐尸還是另有隱情,我是刑警寧澤酪术,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布器瘪,位于F島的核電站,受9級特大地震影響绘雁,放射性物質發(fā)生泄漏橡疼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一庐舟、第九天 我趴在偏房一處隱蔽的房頂上張望欣除。 院中可真熱鬧,春花似錦挪略、人聲如沸历帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挽牢。三九已至,卻和暖如春摊求,著一層夾襖步出監(jiān)牢的瞬間卓研,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工睹簇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寥闪。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓太惠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疲憋。 傳聞我的和親對象是個殘疾皇子凿渊,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評論 25 707
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料缚柳? 從這篇文章中你...
    hw1212閱讀 12,745評論 2 59
  • 極光推送: 1.JPush當前版本是1.8.2埃脏,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,724評論 10 16
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理秋忙,服務發(fā)現(xiàn)彩掐,斷路器,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 我們前篇介紹了點關于線程創(chuàng)建的方式以及Thread相關api的介紹灰追。這次我們說說線程中鎖的應用堵幽。多線程中狗超,數(shù)據(jù)同步...
    胖琪的升級之路閱讀 857評論 0 2