Android提供的系统服务之--AlarmManager(闹钟服务)

Android提供的系统服务之--AlarmManager(闹钟服务)

——转载请注明出处:coder-pig

本节引言:

本节主要介绍的是Android系统服务中的---AlarmManager(闹钟服务),

除了开发手机闹钟外,更多的时候是作为一个全局的定时器,通常与Service

结合,在特定时间启动其他的组件!本节就来对这个AlarmManager来进行解析

同时通过小闹钟与自动换壁纸来演示这个AlarmManager的用法,好了,开始本节的

内容吧!

本节正文:

1.概念与相关属性方法图:

2.例子演示

好了,光看不练可不行,下面就来写两个简单的例子:

分别是定时闹钟提醒的实现与定时更换手机壁纸,一个是调用Activity,一个是调用Service

①一个简单的闹钟:

MainActivity.java:

package com.jay.example.alarmmanagerdemo;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;

public class MainActivity extends Activity {

	private Button btnSetClock;
	private Button btnbtnCloseClock;
	private AlarmManager alarmManager;
	private PendingIntent pi;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btnSetClock = (Button) findViewById(R.id.btnSetClock);
		btnbtnCloseClock = (Button) findViewById(R.id.btnCloseClock);

		// ①获取AlarmManager对象:
		alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
		// 指定要启动的是Activity组件,通过PendingIntent调用getActivity来设置
		Intent intent = new Intent(MainActivity.this, ClockActivity.class);
		pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);

		btnSetClock.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Calendar currentTime = Calendar.getInstance();
				// 弹出一个时间设置的对话框,供用户选择时间
				new TimePickerDialog(MainActivity.this, 0,
						new OnTimeSetListener() {
							@Override
							public void onTimeSet(TimePicker view,
									int hourOfDay, int minute) {
								//设置当前时间
								Calendar c = Calendar.getInstance();
								c.setTimeInMillis(System.currentTimeMillis());
								// 根据用户选择的时间来设置Calendar对象
								c.set(Calendar.HOUR, hourOfDay);
								c.set(Calendar.MINUTE, minute);
								// ②设置AlarmManager在Calendar对应的时间启动Activity
								alarmManager.set(AlarmManager.RTC_WAKEUP,
										c.getTimeInMillis(), pi);
								// 提示闹钟设置完毕:
								Toast.makeText(MainActivity.this, "闹钟设置完毕~",
										Toast.LENGTH_SHORT).show();
							}
						}, currentTime.get(Calendar.HOUR_OF_DAY), currentTime
								.get(Calendar.MINUTE), false).show();
				btnbtnCloseClock.setVisibility(View.VISIBLE);
			}
		});

		btnbtnCloseClock.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				alarmManager.cancel(pi);
				btnbtnCloseClock.setVisibility(View.GONE);
				Toast.makeText(MainActivity.this, "闹钟已取消", Toast.LENGTH_SHORT)
						.show();
			}
		});
	}
}

ClockActivity.java:

package com.jay.example.alarmmanagerdemo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.media.MediaPlayer;
import android.os.Bundle;

public class ClockActivity extends Activity {

	private MediaPlayer mediaPlayer;

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

		mediaPlayer = MediaPlayer.create(this, R.raw.pig);
		//mediaPlayer.setLooping(true);
		mediaPlayer.start();

		//创建一个闹钟提醒的对话框,点击确定关闭铃声与页面
		new AlertDialog.Builder(ClockActivity.this).setTitle("闹钟").setMessage("小猪小猪快起床~")
		.setPositiveButton("关闭闹铃", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				mediaPlayer.stop();
				ClockActivity.this.finish();
			}
		}).show();
	}
}

!!!另外别忘了需要在AndroidManifest.xml对ClockActivity进行注册哦!

运行截图:

总结核心流程吧:

①AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

获得系统提供的AlarmManager服务的对象

②Intent设置要启动的组件:

Intent intent = new Intent(MainActivity.this, ClockActivity.class);

③PendingIntent对象设置动作,启动的是Activity还是Service,又或者是广播!

PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);

④调用AlarmManager的set( )方法设置单次闹钟的闹钟类型,启动时间以及PendingIntent对象!

alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);

②后台Service定时更换壁纸:

从上面的代码我们发现AlarmManager的用法其实就那么几步,很简单,接下来我们弄一个Service

这里我们涉及到另外一个API:
WallpaperManager,管理壁纸的,提供了下述几个方法供我们使用:

setBitmap(Bitmap bitmap),setResource(int resid),setStream(InputStream data);

还有一个清除壁纸的clean方法!

流程和前面的闹钟原理差不多,就不讲解了,直接贴代码吧:

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.alarmmanagerdemo2.MainActivity" >

    <Button
        android:id="@+id/btnOn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开启自动换壁纸" />

    <Button
        android:id="@+id/btnOff"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="关闭自动换壁纸" />

    <Button
        android:id="@+id/btnCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清除壁纸" />

</LinearLayout>

接下来到MainActivity.java:

package com.example.alarmmanagerdemo2;

import java.io.IOException;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	private Button btnOn;
	private Button btnOff;
	private Button btnCancel;
	private AlarmManager alarmManager;
	private PendingIntent pi;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//①获得AlarmManager对象:
		alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);;
		//②指定要启动的Service,并指明动作是Servce:
		Intent intent = new Intent(MainActivity.this,WallPagerService.class);
		pi = PendingIntent.getService(MainActivity.this, 0, intent, 0);

		btnOn = (Button) findViewById(R.id.btnOn);
		btnOff = (Button) findViewById(R.id.btnOff);
		btnCancel = (Button) findViewById(R.id.btnCancel);
		btnOn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, 3000, pi);
				btnOn.setEnabled(false);
				btnOff.setEnabled(true);
				Toast.makeText(MainActivity.this, "自动更换壁纸设置成功", Toast.LENGTH_SHORT).show();
			}
		});

		btnOff.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				btnOn.setEnabled(true);
				btnOff.setEnabled(false);
				alarmManager.cancel(pi);
			}
		});

		btnCancel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				try {
					WallpaperManager.getInstance(getApplicationContext()).clear();
					Toast.makeText(MainActivity.this, "清除壁纸成功~", Toast.LENGTH_SHORT).show();
				} catch (IOException e) {e.printStackTrace();}
			}
		});

	}
}

还有我们自定义的换壁纸的Service:

package com.example.alarmmanagerdemo2;

import android.app.Service;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.IBinder;

public class WallPagerService extends Service {

	//定义当前壁纸下表
	int current = 0;

	//获取壁纸资源id数组
	private int[] paper = new int[] { R.drawable.gui_1, R.drawable.gui_2,
			R.drawable.gui_3, R.drawable.gui_4, };
	//定义WallpaperManager服务
	private WallpaperManager wManager;

	//初始化WallPagerManager
	@Override
	public void onCreate() {
		super.onCreate();
		wManager = WallpaperManager.getInstance(this);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		if(current >= 4)current = 0;
		try{
			wManager.setResource(paper[current++]);
		}catch(Exception e){e.printStackTrace();}
		return START_STICKY;
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

}

别忘了在AndroidManifest.xml文件中添加壁纸的权限哦!以及为我们的Service注册!!!

<uses-permission android:name="android.permission.SET_WALLPAPER" />

运行效果图:

最后说两句:

就是这么简单,关于这个AlarmManager(闹钟服务)就学习到这里吧,在后面我们在Service实例讲解

处还会做一个后台定时发送短信的例子,敬请期待~

本节代码下载:

1.定时闹钟:http://pan.baidu.com/s/1qW9eiWc

2.定时切换壁纸:http://pan.baidu.com/s/1dDhasGp

参考资料:

李刚老师的:《疯狂Android讲义》

网上的一篇文章:http://www.360doc.com/content/13/0110/23/11991_259460170.shtml

时间: 2024-10-20 04:54:33

Android提供的系统服务之--AlarmManager(闹钟服务)的相关文章

Android提供的系统服务之--PowerManager(电源服务)

Android提供的系统服务之--PowerManager(电源服务) --转载请注明出处:coder-pig 本节引言: 本节主要讲解的Android为我们提供的系统服务中的:PowerManager电源管理的一个API, 用于管理CPU运行,键盘或者屏幕亮起来;不过,除非是迫不得已吧,不然的话,否则应该尽量避免 使用这个类,并且使用完以后一定要及时释放!本节并不太深入的去讲解,因为这个设计到底层的 一些东西,以后需要用到再深入研究,到时再另外写一篇blog总结!所以本节介绍的主要是 一些基本

Android提供的系统服务之--LayoutInflater(布局服务)

Android提供的系统服务之--LayoutInflater(布局服务) --转载请注明出处:coder-pig 本节引言: 本节我们只要是介绍Android系统服务中的--LayoutInflater(布局服务), 相信大家已经习惯了通过Activity.setContentView( )方法来我们的布局文件, 底层的底层还是通过这个系统的LayoutInflater来完成的! 工作原理就是使用Android内置的pull解析器来解析布局~ 而在前几天写的blog中用到的动态布局,就是用到这

Android提供的系统服务之--WindowManager(窗口管理服务)

Android提供的系统服务之--WindowManager(窗口管理服务) --转载请注明出处:coder-pig 本节引言: 本节我们来探讨下这个Android系统服务中的WindowManager(窗口管理服务), 他是显示View的最底层,好像我们的Actviity和Dialog,以及Toast的底层实现都用到 这个WindowManager,他是全局的!核心其实就是WindowManager调用addView, removeView,updateViewLayout这几个方法来显示Vi

Android提供的系统服务之--SmsManager(短信管理器)

Android提供的系统服务之--SmsManager(短信管理器) --转载请注明出处:coder-pig SmsManager相关介绍以及使用图解: 当然为了方便各位,把代码粘一粘吧,就不用麻烦大家写代码了: 有需要的时候就复制粘贴下吧! 1)调用系统发送短信的功能: public void SendSMSTo(String phoneNumber,String message){ //判断输入的phoneNumber是否为合法电话号码 if(PhoneNumberUtils.isGloba

Android提供的系统服务之--TelephonyManager(电话管理器)

Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设备信息.sim卡信息以及网络信息), 侦听电话状态(呼叫状态服务状态.信号强度状态等)以及可以调用电话拨号器拨打电话! 如何获得TelephonyManager的服务对象: TelephonyManager tManager = (TelephonyManager)getSystemService(

Android提供的系统服务之--AudioManager(音频管理器)

Android提供的系统服务之--AudioManager(音频管理器) ----转载请注明出处:coder-pig AudioManager相关简介与常用方法图: 简单的使用例子: 使用Mediaplayer播放音乐,通过AudioManager调节音量大小与静音: 这里,我们需要把要播放的音频文件放到res下的raw文件夹,这个文件夹默认是没有的,需要自己创建哦! 用来放原生资源的,就是打包编译的时候不会把他变成二进制文件!!! 先来看看效果图吧: 就是播放音乐,然后调高音量的时候可以看到滑

Android提供的系统服务之--Vibrator(振动器)

Android提供的系统服务之--Vibrator(振动器) --转载请注明出处:coder-pig Vibrator简介与相关方法: 简单demo--设置频率不同的振动器 对于Vibrator用的最广泛的莫过于所谓的手机按摩器类的app,在app市场一搜,一堆,笔者随便下了几个下来瞅瞅 ,都是大同小异的,这点小玩意竟然有8W多的下载量...好吧,好像也不算多,不过普遍功能都是切换振动频率来完成 所谓的按摩效果,是否真的有效就不得而知了,那么接下来 我们就来实现一个简单的按摩器吧! 核心其实就是

Android 轮询之 Service + AlarmManager+Thread (转)

android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询. 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高.但服务器主动推送需要单独开发一套能让客户端持久连接的服务端程序,不过现在已经有很多开源的代码实现了基于xmmp协议的推送方案,而且还可以使用谷歌的推送方案.但有些情况下并不需要服务端主动推送,而是在一定的时间间隔内客户端主动发起查询. 譬如有这样一个app,实时性要求不高,每天只要能获取10次最新数据就能满足要

Android英文文档翻译系列(1)——AlarmManager

原文:个人翻译,水平有限,欢迎看官指正. public class AlarmManager extends Object java.lang.Object    ? android.app.AlarmManager Class Overview This class provides access to the system alarm services. 这个类可以提供访问系统闹钟服务, These allow you to schedule your application to be r