AlarmManager、PaddingIntent的使用\
\附件Home监听十分钟后再次启动应用取消服务
对应AlarmManage有一个AlarmManagerServie服务程 序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,linux实现的设备名 为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列 表找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当 然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间还有一层封装,那就是JNI。
AlarmManager将应用与服务分割开来后,使得应用程序开发者不用 关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。
在android系统中,AlarmManage提供了5个接口5种类型的闹铃服务。
5个接口:
- // 取消已经注册的与参数匹配的闹铃
- void cancel(PendingIntent operation)
- //注册一个新的闹铃
- void set(int type, long triggerAtTime, PendingIntent operation)
- //注册一个重复类型的闹铃
- void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
- //设置时区 设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限
- void setTimeZone(String timeZone)
- void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。
内置的几个interval为:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。
5个闹铃类型
- public static final int ELAPSED_REALTIME
- // 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。
- 在指定的延时过后,发送广播,但不唤醒设备。
- public static final int ELAPSED_REALTIME_WAKEUP
- //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
- 在指定的演示后,发送广播,并唤醒设备
延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的 - public static final int RTC
- //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
- 在指定的时刻,发送广播,但不唤醒设备
- public static final int RTC_WAKEUP
- //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
- 在指定的时刻,发送广播,并唤醒设备
- Public static final int POWER_OFF_WAKEUP
- //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。
注意一个重要的参数PendingIntent。这个PendingIntent可以说是 Intent的进一步封装,他既包含了Intent的描述又是Intent行为的执行(这种定义也许不太严格),如果将Intent比作成一个订单的 话,PendingIntent更像是一个下订单的人,因为它既要负责将订单发出去,也要负责订单发送后的处理,比如发送成功后要准备验收订单货物,发送 失败后要重发还是取消订单等操作。开发者可以通过调用
getActivity(Context, int, Intent, int)
getBroadcast(Context, int, Intent, int)
getService(Context, int, Intent, int)
三种不同方式来得到一个PendingIntent实例。
getBroadcast——通过该函数获得的PendingIntent将会 扮演一个广播的功能,就像调用 Context.sendBroadcast()函数一样。当系统通过它要发送一个intent时要采用广播的形式,并且在该intent中会包含相应的 intent接收对象,当然这个对象我们可以在创建PendingIntent的时候指定,也可以通过ACTION 和CATEGORY等描述让系统自动找到该行为处理对象。
- Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
- PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this, 0, intent, 0);
getActivity——通过该函数获得的PendingIntent可以直 接启动新的activity, 就像调用 Context.startActivity(Intent)一样.不过值得注意的是要想这个新的Activity不再是当前进程存在的Activity 时。我们在intent中必须使用Intent.FLAG_ACTIVITY_NEW_TASK.
- // The PendingIntent to launch our activity if the user selects this notification
- PendingIntent contentIntent = PendingIntent.getActivity(this , 0 , new Intent( this , AlarmService. class ), 0 );
getService——通过该函数获得的PengdingIntent可以直接启动新的Service,就像调用Context.startService()一样。
- PendingIntent mAlarmSender = PendingIntent.getService(AlarmService.this ,
- 0 , new Intent(AlarmService. this , AlarmService_Service. class ), 0 );
5s后发送指定广播
- AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
- int requestCode = 0;
- PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
- requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- // 5秒后发送广播,只发送一次
- int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
- alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent);
5s后发送指定广播,然后每个10秒重复发送广播
- AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
- int requestCode = 0;
- PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
- requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- // 5秒后发送广播,然后每个10秒重复发广播。广播都是直接发到AlarmReceiver的
- int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
- int interval = 10 * 1000;
- alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, interval, pendIntent);
取消一个闹钟
- AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
- PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
- 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- // 与上面的intent匹配(filterEquals(intent))的闹钟会被取消
- alarmMgr.cancel(pendIntent);
相关推荐
本文将深入探讨这两个组件的使用,并结合给定的“附件Home监听十分钟后再次启动应用取消服务”的场景进行详细解释。 首先,`AlarmManager`是Android系统提供的一个服务,它允许应用程序安排在未来某个时间点执行一...
在Android开发中,`AlarmManager` 是一个非常重要的系统服务,用于实现应用程序的定时任务,如定期发送数据、唤醒设备、启动服务等。本篇文章将详细介绍如何使用`AlarmManager`来启动广播`BroadcastReceiver`、服务`...
`PendingIntent`则是一个抽象的意图(Intent),它封装了对一个操作的请求,当`AlarmManager`触发时,会使用这个`PendingIntent`来启动或广播目标操作。`PendingIntent`确保只有授权的应用程序可以执行相关操作,...
3. **取消闹钟**:在不再需要闹钟时,记得调用`AlarmManager.cancel(PendingIntent)`取消相应的闹钟。 4. **测试**:由于模拟器和设备的限制,测试闹钟时可能需要在真实设备上进行。 通过以上内容,你应该已经掌握...
这种设计使得我们可以放心地将PendingIntent传递给第三方应用,如通知系统或闹钟服务。 PendingIntent的创建通常通过以下方法: 1. `getActivity(Context context, int requestCode, Intent intent, int flags)`: ...
在Android开发中,`AlarmManager`是一个至关重要的组件,它允许开发者安排系统在特定时间执行某些操作,如启动服务、发送广播等。本教程将深入探讨`AlarmManager`的使用,以及如何通过它来实现一个实用的闹钟功能。 ...
在Android开发中,`AlarmManager`和`BroadcastReceiver`是两个关键组件,它们协同工作可以实现定时任务的循环启动。让我们深入探讨这两个组件以及如何在实际应用中结合使用。 `AlarmManager`是Android系统服务,它...
4. **取消闹钟**:如果用户取消了闹钟,可以通过`AlarmManager`的`cancel()`方法和`PendingIntent`来取消已经设置的闹钟。 ```java alarmManager.cancel(pendingIntent); ``` 5. **更新闹钟**:如果用户修改了闹钟...
【AlarmManager】是Android系统中的一个关键组件,用于在指定的时间或者间隔执行特定的任务,它在后台服务中工作,能够确保即使应用不运行时也能触发预定的事件。这个功能对于实现定时提醒、自动同步数据或者执行...
在Android开发中,PendingIntent是一个非常关键且独特的组件,它为应用程序提供了跨进程通信的能力,使得一个应用可以请求系统在未来的某个时刻执行特定的操作。PendingIntent不仅涉及到了Android的权限模型,还涉及...
`AlarmManager`通过向系统注册闹钟事件,当达到设定的时间点时,会触发一个`PendingIntent`,这个`PendingIntent`通常会启动一个广播接收器(BroadcastReceiver)来处理相应的任务,比如显示通知、更新UI或者执行...
它允许应用程序安排在未来某个时间点或周期性地执行工作,例如启动服务、发送广播等。本教程将深入探讨如何利用`AlarmManager`设置多个闹钟,并确保这些闹钟在设备重启后仍然能够正常工作。 1. **AlarmManager的...
3. 为了确保服务能够在应用被卸载后仍能运行一段时间,可以使用`AlarmManager`设置一个定时任务,让服务在一段时间后执行。这可以帮助解决应用被迅速卸载而未完成清理工作的问题。 4. 同时,考虑到Android系统的...
- **系统服务(System Services)**:例如AlarmManager服务,可以安排在特定时间使用PendingIntent执行任务,如启动服务或发送广播。 - **权限控制**: PendingIntent提供了对Intent操作的访问控制,确保只有持有...
在Android开发中,`AlarmManager` 是一个至关重要的服务组件,它允许开发者安排应用程序在未来某个时间点执行特定的任务。这个组件常用于实现定时任务,如后台数据同步、定期提醒、闹钟等。在不同的Android版本中,`...
在Android开发中,`AlarmManager`是系统服务之一,它允许应用程序安排在未来某个时间点或周期性地执行任务。这通常用于实现定时提醒、后台同步或其他时间敏感的操作。本篇文章将详细讲解如何在Android中使用`...
在Android开发中,`AlarmManager` 是一个非常重要的系统服务,用于安排应用程序在特定时间执行任务,例如定时提醒、后台同步等。在这个场景中,需求是实现一个功能,让用户能够根据服务器设定的时间段(比如周一、...
2. **后台服务定时启动**:应用可能需要在特定时间启动服务进行清理缓存、检查更新等操作。 3. **提醒功能**:创建闹钟提醒用户某个事件的发生,如会议、生日等。 4. **节省电池**:通过合理使用`AlarmManager`,...
5. **取消定时任务**:如果需要取消已设置的定时任务,可以调用AlarmManager的`cancel()`方法并传入相同的PendingIntent。 ### 实现定时更换壁纸 在`WallpaperChangeReceiver`的`onReceive()`方法中,你可以编写...
本篇通过AlarmManager和PendingIntent实现定时提醒功能,界面运用Button、TextView、Switch进行布局 同时这也是中国大学慕课移动终端应用开发的网课作业18,我会持续更新我的作业,如果有需要关注一下吧 说明 具体的...