在移动应用的开发中,我们经常会遇到定时提醒用户的需求,比如:电影票预订后在电影开始前两个小时提醒用户电影时间。

我的思路大致如下:

1.使用AlarmManager设置闹钟

既然要使用定时服务,那么自然第一个想到的是闹钟。AlarmManager可在指定的时间或者指定周期启动其他组件(包括Activity、Service、BroadcastReceiver)。

比如:

<span style="font-family:SimSun;font-size:18px;">   // 指定启动AlarmActivity组件Intent intent = new Intent(AlarmTest.this,AlarmActivity.class);// 创建PendingIntent对象PendingIntent pi = PendingIntent.getActivity(AlarmTest.this, 0, intent, 0);Calendar c = Calendar.getInstance();// 根据用户选择时间来设置Calendar对象c.set(Calendar.HOUR, hourOfDay);c.set(Calendar.MINUTE, minute);// 设置AlarmManager将在Calendar对应的时间启动指定组件aManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);                          // 显示闹铃设置成功的提示信息Toast.makeText(AlarmTest.this, "闹铃设置成功啦", Toast.LENGTH_SHORT).show();
</span>

其中

AlarmManager的set方法为:

set(int type, long triggerAtTime, PendingIntent operation):设置在triggerAtTime时间启动由operation参数指定的组件。其中第一个参数指定定时服务的类型。比如RTC_WAKEUP是指定当系统调用System.currentTimeMills()方法返回值与triggerAtTime相等时启动operation所对应的组件。即使是系统关机也会执行。

但是理想很丰满,现实很骨感。

Android源码的逻辑是:当应用被强停后,alarm会被清除掉,所以闹钟会失效。alarm做闹钟需要保证应用不被强停。那么如果每次应用启动重新把Alarm重新定一遍,应用关闭时闹钟还是不会响,影响用户体验。

2.使用service

通过应用启动service的线程,维护alarm的数据库,不断循环进行alarm是否应该被触发的判断(类似于Looper)。这里的关键是保证service不被杀死,有一些牛虻软件确实做到了,比如微信、小米运动、搜狗输入法等。要做到这一点,主要方法有:

(1)在service的onStartCommand中手动返回START_STICKY。当service因为内存不足是被kill后,当内存足够是service会被重新启动。

(2)在intent-filter中提升service进程的优先等级(android:priority=1000)。

(3) 提升service的优先级,比如在onStartCommand通过startForeground启动一个notification使进程进入前台。类似于音乐播放器,当你在播放音乐的时候,音乐播放器是不会被kill的。

(4)在service的onDestroy()重新启动service,或者发送一个广播,接受到广播后启动service.

(5)广播监听系统消息(比如开机),启动service

还有最后一个绝招,也是很多大厂App常用的方法,那就是App之间相互唤醒。比如说启动百度地图时,在百度地图的service里启动百度贴吧的service。无论怎么启动,一个service只会有一个。

具体大家可以参考:http://blog.csdn.net/primer_programer/article/details/25987439 点击打开链接

但是,没有完全不死的service。安卓系统把握着service的生杀大权,当系统内存不够时,安卓系统将会杀死其他service来保证当前程序的流畅。另外,像华为手机,系统会提示哪些程序的进程还在耗电,用户可以选择一键杀死。但貌似有的程序直接杀怎么也杀不死,比如小米运动,囧。

3.后台推送

最后的无奈之举,就是客户端转服务端了。通过服务端的定时任务,对客户端发送短信或者进行消息推送。一般来说,这个方法是是可靠性最高最成熟的方案。

Android应用的定时通知实现相关推荐

  1. android 实现定时通知,在Android中创建定时通知(例如,针对事件)

    对于某些Android应用程序,我想集成以下功能: 用户可以定义他想要被提醒的时间.当时间到了,应用程序应该在通知栏中创建通知,即使此时用户没有使用该应用程序. 为此,需要查看AlarmManager ...

  2. elecV2P实现任务定时通知

    elecV2P - customize personal network. 一款基于 NodeJS,可通过 JS 修改网络请求,以及定时运行脚本或 SHELL 指令的网络工具 第一节:elecV2P的 ...

  3. android o preview 3,Android O Preview 之 通知渠道(Notification Channels)

    介绍 Android O 引入了 通知渠道(Notification Channels),以提供统一的系统来帮助用户管理通知,如果是针对 android O 为目标平台时,必须实现一个或者多个通知渠道 ...

  4. android 通知栏样式_Android通知样式

    android 通知栏样式 We've discussed and implemented basic Notifications in this post. In this tutorial, we ...

  5. Android 5.0状态栏通知图标的实现

    Android 5.0状态栏通知图标的实现 我之前的博客文章中有一片是介绍了关于Android5.0 下拉通知栏快捷开关的添加,文章牵扯到一个知识点就是Android 5.0状态栏通知图标的实现.那么 ...

  6. android 自动发彩信,Android编程实现定时发短信功能示例

    本文实例讲述了Android编程实现定时发短信功能.分享给大家供大家参考,具体如下: 第一,要实现发短信的功能,必须要用到android系统中发短信的权限,即在AndoridManifest.xml中 ...

  7. android手机没电怎么恢复电量,Android手机电池电量剩下通知

    Android手机电池电量剩余通知 1:手机电池电量剩余通知 Intent.ACTION_BATTERY_CHANGED 手机电池电量变化系统发出的Intent的action. 这个Intent携带两 ...

  8. Android篇 --Notification(消息通知)

    Android篇 --Notification(消息通知) 消息通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望用户发出一些提示信息,而该应用又不在前台运 ...

  9. 如何在 Android 上自定义来电通知?带有代码示例

    您将从本文中学习如何在 Android 上进行从基本布局到高级布局的来电通知.使用我们的示例自定义通知屏幕. 今天,我们将处理来电通知:我们将从最简单和最简约的通知开始,并以采用非系统设计的全屏通知结 ...

最新文章

  1. FIN_WAIT_2
  2. 16岁日本神童打造日版「健康码」,追踪用户行动数据抗击疫情
  3. Keil μVision 5版新建工程详细步骤(版本2)
  4. Eclipse 安装Spring tool suite 解决官网下载jar文件无法安装/安装过程出错,及如何下载对应版本zip文件等问题,避坑
  5. MySQL(10)数据库实现高可用架构之MHA
  6. java.security.InvalidKeyException: Illegal key size
  7. nodejs随笔(二)
  8. iOS开发日记29-UIAlertController
  9. Comsol学习——经典案例:水净化反应器
  10. 小卡机器人积木教程_一盒56种玩法!这套智能积木机器人秒杀家中99%的益智玩具!| 新年礼物...
  11. nds android7.0模拟器,nds最佳MD模拟器jEnesisDS 0.7更新
  12. 计算机监理培训计划,监理人员培训计划书.doc
  13. 软件测试如何设计测试用例
  14. SLAM学习入门(1)针孔相机模型公式推导
  15. 家有经济适用男牛仔很忙
  16. 爬虫python创意_爬虫案例:利用python爬虫关键词批量下载高清大图
  17. 如何在应用中打开系统播放器
  18. 心路历程:当win10遇上win7激活程序...请默哀
  19. flask+ vue 开发二手书App
  20. PMP考试关键字和黄金法则大全

热门文章

  1. python爬大学生就业数据_小猪的Python学习之旅 —— 16.再尝Python数据分析:采集拉勾网数据分析Android就业行情...
  2. 暴雪首席任务设计师谈论任务设计
  3. 画论41 孙鑛《月峰画跋》
  4. 关于获取带特殊符号的微信昵称
  5. 郑建新 计算机 山西大学商务学院官网,迎新第一天 | 这是送给2020级新商院人的独家记忆...
  6. 第一次做项目经理总结_实用的施工项目经理年终总结3篇
  7. Octane Render是一款独立软件,可以不基于任何软件运行
  8. jquery.cookie读取、存储
  9. 经典兔子问题python视频_【Python】【demo实验14】【练习实例】【斐波那契数列】【经典兔子生小兔子问题】...
  10. python3的保留字有哪些_Python3 的33个保留字