Android_AlarmManager(全局定时器)

我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸 该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能。 更换壁纸的API为android.app.WallpaperManager,它提供了clear()方法来清除壁纸,还提供了如下方法来设置壁纸。 setResource(int resid) 将壁纸设置为resid资源所代表的图片 setBitmap(Bitmap bitma 阅读详情

一、简介      

       AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,linux实现的设备名 为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列 表找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当 然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间还有一层封装,那就是JNI。

  AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。

二、API

// 取消已经注册的与参数匹配的闹铃   
void   cancel(PendingIntent operation)  
  //注册一个新的闹铃  
void   set(int type, long triggerAtTime, PendingIntent operation)  
  //注册一个重复类型的闹铃  
void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)  
    //设置时区  
void   setTimeZone(String timeZone)  

       全局定时器的五种类型:

        其中PendingIntent可以说是 Intent的进一步封装,他既包含了Intent的描述又是Intent行为的执行(这种定义也许不太严格),如果将Intent比作成一个订单的 话,PendingIntent更像是一个下订单的人,因为它既要负责将订单发出去,也要负责订单发送后的处理,比如发送成功后要准备验收订单货物,发送 失败后要重发还是取消订单等操作。开发者可以通过调用getActivity(Context, int, Intent, int),getBroadcast(Context, int, Intent, int),
getService(Context, int, Intent, int)三种不同方式来得到一个PendingIntent实例。
       1.getBroadcast——通过该函数获得的PendingIntent将会 扮演一个广播的功能,就像调用 Context.sendBroadcast()函数一样。当系统通过它要发送一个intent时要采用广播的形式,并且在该intent中会包含相应的 intent接收对象,当然这个对象我们可以在创建PendingIntent的时候指定,也可以通过ACTION 和CATEGORY等描述让系统自动找到该行为处理对象。

       2.getActivity——通过该函数获得的PendingIntent可以直 接启动新的activity, 就像调用 Context.startActivity(Intent)一样.不过值得注意的是要想这个新的Activity不再是当前进程存在的Activity 时。我们在intent中必须使用Intent.FLAG_ACTIVITY_NEW_TASK.

       3.getService——通过该函数获得的PengdingIntent可以直接启动新的Service,就像调用Context.startService()一样。

       需要注意的是:如果是通过启动服务来实现闹钟提 示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用 PendingIntent.getBroadcast(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用 PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。

三、DEMO

      先看下效果图:



       我们通过一个全局定时器来开启一个广播,广播接收者接收到广播后周期性显示Toast或者定时显示Toast,我们可以观察到周期性显示Toast,无论我们锁屏后打开还是关闭了app,都可以周期性的显示Toast!

       最后我们来看下代码的实现:

先来看下AlarmTimer的工具类:

package com.liangdianshui.utils;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;

public class AlarmTimer {

	/**
	 * 设置周期性闹钟
	 * 
	 * @param context
	 * @param firstTime
	 * @param cycTime
	 * @param action
	 * @param AlarmManagerType
	 *            闹钟的类型,常用的有5个值:AlarmManager.ELAPSED_REALTIME、
	 *            AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、
	 *            AlarmManager.RTC_WAKEUP、AlarmManager.POWER_OFF_WAKEUP
	 */
	public static void setRepeatingAlarmTimer(Context context, long firstTime,
			long cycTime, String action, int AlarmManagerType) {
		Intent myIntent = new Intent();
		myIntent.setAction(action);
		PendingIntent sender = PendingIntent.getBroadcast(context, 0, myIntent,
				0);
		AlarmManager alarm = (AlarmManager) context
				.getSystemService(Context.ALARM_SERVICE);
		alarm.setRepeating(AlarmManagerType, firstTime, cycTime, sender);
	}

	/**
	 * 设置定时闹钟
	 * 
	 * @param context
	 * @param firstTime
	 * @param cycTime
	 * @param action
	 * @param AlarmManagerType
	 *            闹钟的类型,常用的有5个值:AlarmManager.ELAPSED_REALTIME、
	 *            AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、
	 *            AlarmManager.RTC_WAKEUP、AlarmManager.POWER_OFF_WAKEUP
	 */
	public static void setAlarmTimer(Context context, long cycTime,
			String action, int AlarmManagerType) {
		Intent myIntent = new Intent();
		myIntent.setAction(action);
		PendingIntent sender = PendingIntent.getBroadcast(context, 0, myIntent,
				0);
		AlarmManager alarm = (AlarmManager) context
				.getSystemService(Context.ALARM_SERVICE);
		alarm.set(AlarmManagerType, cycTime, sender);
	}

	/**
	 * 取消闹钟
	 * 
	 * @param context
	 * @param action
	 */
	public static void cancelAlarmTimer(Context context, String action) {
		Intent myIntent = new Intent();
		myIntent.setAction(action);
		PendingIntent sender = PendingIntent.getBroadcast(context, 0, myIntent,
				0);
		AlarmManager alarm = (AlarmManager) context
				.getSystemService(Context.ALARM_SERVICE);
		alarm.cancel(sender);
	}
}
然后是广播接受者,接收到广播后显示Toast

package com.liangdianshui.receiver;

import com.liangdianshui.data.GlobalValues;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver {

	private Toast mToast;
	private Context mContext;

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		mContext = context;
		if (intent.getAction().equals(GlobalValues.TIMER_ACTION_REPEATING)) {
			showToast("AlarmTimer-------->Repeating");
		} else if (intent.getAction().equals(GlobalValues.TIMER_ACTION)) {
			showToast("AlarmTimer-------->Timer");
		}
	}

	private void showToast(String text) {
		if (mToast == null) {
			mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT);
		} else {
			mToast.setText(text);
		}
		mToast.show();
	}

}
主界面是四个Button,分别用来启动全局定时器和关闭取消全局定时器

package com.liangdianshui.alarmmanager;

import com.liangdianshui.data.GlobalValues;
import com.liangdianshui.utils.AlarmTimer;

import android.app.Activity;
import android.app.AlarmManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

	private Button mBtSetRepeatingAlarmTimer;
	private Button mBtSetAlarmTimer;
	private Button mBtCancelAlarmTimer;
	private Button mBtCancelRepeatingAlarmTimer;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initView();
	}

	private void initView() {
		// TODO Auto-generated method stub
		mBtSetRepeatingAlarmTimer = (Button) findViewById(R.id.bt_setRepeatingAlarmTimer);
		mBtSetAlarmTimer = (Button) findViewById(R.id.bt_setAlarmTimer);
		mBtCancelAlarmTimer = (Button) findViewById(R.id.bt_cancelAlarmTimer);
		mBtCancelRepeatingAlarmTimer = (Button) findViewById(R.id.bt_cancelRepeatingAlarmTimer);
		mBtSetRepeatingAlarmTimer.setOnClickListener(this);
		mBtSetAlarmTimer.setOnClickListener(this);
		mBtCancelAlarmTimer.setOnClickListener(this);
		mBtCancelRepeatingAlarmTimer.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.bt_setRepeatingAlarmTimer:
			AlarmTimer.setRepeatingAlarmTimer(MainActivity.this,
					System.currentTimeMillis(), 3 * 1000,
					GlobalValues.TIMER_ACTION_REPEATING,
					AlarmManager.RTC_WAKEUP);
			break;
		case R.id.bt_setAlarmTimer:
			AlarmTimer.setAlarmTimer(MainActivity.this,
					System.currentTimeMillis() + 3 * 1000,
					GlobalValues.TIMER_ACTION, AlarmManager.RTC_WAKEUP);
			break;
		case R.id.bt_cancelRepeatingAlarmTimer:
			AlarmTimer.cancelAlarmTimer(MainActivity.this,
					GlobalValues.TIMER_ACTION_REPEATING);
			break;
		case R.id.bt_cancelAlarmTimer:
			AlarmTimer.cancelAlarmTimer(MainActivity.this,
					GlobalValues.TIMER_ACTION);
			break;
		}
	}

}
最后只是一个全局的数据类:

package com.liangdianshui.data;

public class GlobalValues {
	// 周期性的闹钟
	public final static String TIMER_ACTION_REPEATING = "com.liangdianshui.TIMER_ACTION_REPEATING";
	// 定时闹钟
	public final static String TIMER_ACTION = "com.liangdianshui.TIMER_ACTION";
}

Demo的下载地址:http://download.youkuaiyun.com/detail/two_water/9584146

因为电脑有加密系统,所以只要把上面的类复制到对应的java文件就可以运行了。







2019年上交电院计算机直博保研经历 本人选报的是上交六月一日在武汉举办的直博选拔,五月三十一日到达酒店,地点在武汉大学旁边(PS:上交是不管住宿、来回车票的,~划重点~包括夏令营),入住后当然是紧张的准备英语面试等等内容了,当天我是排在了下午面试,感觉还很好,上午可以多睡一会,最好能够去踩踩点上午,然后下午面试一定要早去,说是一点开始,但是老师十二点半就开始让学生进去了,有一个同学排在第二个,但是当时叫到他时还不到一点,没到,最后据... 阅读详情

相关推荐

IDEA类和方法注释模板设置(非常详细)

IDEA类和方法注释模板设置(非常详细)

黑桃A的博客 10万+

安卓电量优化之AlarmManager使用全部解析

版权声明:本文出自汪磊的博客,转载请务必注明出处。 一、AlarmManager概述 AlarmManager是安卓系统中一种系统级别的提示服务,可以在我们设定时间或者周期性的执行一个intent,这个intent可以是启动Service服务、发送广播、跳转Activity,看到这里是不是会想这不就是定时器Timer吗,Timer确实是一般定时需求的最便捷实现方式,但是试想一下手机空闲状态下,屏幕...

weixin_42405406的博客 503

java对接海康实现页面实时播放和回放

前言:之前已经写过一篇关于视频的文章,因为觉得有很多优化的地方,也谢谢同行们加我微信跟我提了一些需求和意见,所以在过年的假期重新写了一个比较能扩张的版本。 上一个版本的连接:https://blog.youkuaiyun.com/weixin_45848110/article/details/119363602 与之前的版本不同之处: 1.不需要安装ffmpeg 2.不需要安装nginx 3.直接运行jar即可 4.之前是完全脱离海康sdk,回放的录像是保存到本地服务,现在是直接在海康硬盘录像机获取录像回放 5.实时播

weixin_45848110的博客 1万+

Android之AlarmManager闹铃提醒工具类

Android的闹铃提醒有时候挺折腾人的,底层的提醒业务注册是根据requestCode来标识的,这点一定要牢记。其次,闹铃提醒的周期算法也有点麻烦,比如某个提醒需要在工作日提醒,而另一个提醒只在工作日提醒,这时候就要区分开了。由于时间有限,暂时编写个闹铃提醒的工具类,已经过上线测试,代码如下: 代码较为简单就不逐行解释了。 import android.app.AlarmManager; i

嘿,你好! 917

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1096

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

本教程基于群晖的NAS设备DS423+的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。MetaTube是一个媒体服务器插件,主要用于Emby和Jellyfin媒体服务器。它的主要功能是从互联网上抓取内容并响应 JSON 数据,然后通过预安装的 MetaTube 插件请求服务器并下载相应的元数据,以与 Jellyfin/Emby 服务器配合使用。使用 MetaTube 的步骤大致如下:部署后端:首先,需要部署一个名为​ 的后端 API 服务器来抓取内容。

小小笔记大大用处 1万+

Android 使用AlarmManager实现定时任务

Android 使用AlarmManager实现定时任务

邵旺运的博客 1494

告别手动拖拽!PyQt5/PyQt6 QTableView列宽自适应窗口的三种实战方案(附性能对比)

本文详细介绍了PyQt5/PyQt6中QTableView列宽自适应窗口的三种实战方案,包括Stretch模式、resizeEvent手动计算和ResizeToContents模式,并附有性能对比。帮助开发者解决窗口大小变化时列宽不变的常见问题,提升用户体验和开发效率。

weixin_42538752的博客 232

android4.4 AlarmManagerService深入分析

AlarmManager深入分析 转载地址http://blog.youkuaiyun.com/codefly/article/details/17058425,自己补充了一些代码分析   1.概述         在Android系统中,闹钟和唤醒功能都是由Alarm Manager Service控制并管理的。我们所熟悉的RTC闹钟以及定时器都和它有莫大的关系。为了

kc58236582的博客 6004

AttributeError: module ‘numpy‘ has no attribute ‘int‘解决方案

本文主要介绍了AttributeError: module ‘numpy’ has no attribute 'int’解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方案一 2.2 方案二

weixin_43178406的博客 28万+

Java代码变更影响分析:从静态解析到动态调用图的实战全链路

本文介绍了Java代码提交影响分析的核心原理与实现方法。主要内容包括:1)静态分析技术,通过JavaParser解析AST构建调用图,记录类与方法间的调用关系;2)动态分析技术,使用ByteBuddy进行字节码增强,捕获运行时调用路径;3)JCCI工具实现,结合javalang、unidiff等技术分析代码改动影响,并将结果存储到SQLite数据库。文章提供了完整的代码示例,展示了从AST解析、动态调用跟踪到实际工具应用的完整技术栈,为代码变更影响分析提供了实用解决方案。

墨夶的博客 1252

Android系统Alarm机制介绍

当我们在开发与闹钟定时有关的Android程序时,我们一般选择使用AlarmManager来实现,但实际上Android中与定时闹钟有关的方法功都在AlarmManagerService中,AlarmManager需要调用AlarmManagerService中的方法来实现定时服务。

panqingchao的博客 3415

小波变换(深入浅出)

小波变换

weixin_46713695的博客 3万+

android全局计时_Android定时器AlarmManager

AlarmManager是Android的全局定时器。就是在指定时间做一个事情(封装在PendingIntent)。通过PendingIntent的getActivity()、getService()或getBroadcast()来执行。听起来AlarmManager和Timer很类似,但是Timer有可能因为手机休眠而被杀掉服务,但是AlarmManager可以做到唤醒手机。创建方式AlarmM...

weixin_39609166的博客 325

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 定时器 alarmmanager,Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作...

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.下面的代码详细的介绍了两种定时...

weixin_35473679的博客 1935

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android全局定时器AlarmManager

<br /> 全局定时器AlarmManager<br />在编写ChangeWallpaperService类时应注意如下3点:<br />为了通过InputStream获得图像资源,需要将图像文件放在res/raw目录中,而不是res/drawable目录中。<br />本例采用了循环更换壁纸的方法。也就是说,共有5个图像文件,系统会从第1个图像文件开始更换,更换完第5个文件后,又从第1个文件开始更换。<br />更换壁纸需要使用Context.setWallpaper方法,该方法需要一个描述图像的In

super005的专栏 4895

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android的全局定时器AlarmManager详解

<br />AlarmManager对象配合Intent使用,可以定时开启一个Activity,发送一个BroadCast或者开启一个Service。<br /> <br />AlarmManager有如下用法:<br /> <br />(1)在指定时间后,执行某操作<br /> <br />Intent intent=new Intent(this,ShowUtil.class); PendingIntent sender=PendingIntent.getBroadcast(this, 0, inte

博客迁移到 http://www.blog4app.com/ 1万+

Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作 AlarmManager对象配合Intent使用

z516518的专栏 960

android全局计时_Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作...

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.下面的代码详细的介绍了两种定时...

weixin_42422648的博客 319

android全局计时_android全局定时器AlarmManager

全局定时器AlarmManager在编写ChangeWallpaperService类时应注意如下3点:为了通过InputStream获得图像资源,需要将图像文件放在res/raw目录中,而不是res/drawable目录中。本例采用了循环更换壁纸的方法。也就是说,共有5个图像文件,系统会从第1个图像文件开始更换,更换完第5个文件后,又从第1个文件开始更换。更换壁纸需要使用Context.setW...

weixin_42122878的博客 341

Android-AlarmManager(全局定时器/闹钟)

android 检测碰撞 汇总http://www.eoeandroid.com/thread-203518-1-1.html Android 3D特效源码汇总http://www.eoeandroid.com/thread-203549-1-1.html 仿Siri的中文语音助理源码http://www.eoeandroid.com/thread-203444-1-1.html   Al...

weixin_33805743的博客 135

Android重复闹钟(每天)的实现 Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

作者:韩梦飞沙 QQ:313134555 Android重复闹钟(每天)的实现 - 推酷 Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作 - 智慧云端日记 - 博客园

韩梦飞沙_韩亚飞 2409

Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.下面的代码详细的介绍了两种定时

承影 1291

android之AlarmManager 全局定时器

AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver)。 概述: 该类提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后自动...

weixin_34235457的博客 164
上一篇: 设计模式_观察者模式
下一篇: Android_Service(1)基本用法
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值