Android应用的定时通知实现

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

我的思路大致如下:

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.后台推送

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值