您的位置:首页 > 移动开发 > Android开发

Android应用的定时通知实现

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

我的思路大致如下:

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只会有一个。

具体大家可以参考:/article/2925400.html 点击打开链接

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

3.后台推送

最后的无奈之举,就是客户端转服务端了。通过服务端的定时任务,对客户端发送短信或者进行消息推送。一般来说,这个方法是是可靠性最高最成熟的方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: