系统服务详解之时间服务3

4、全局定时器:AlermManager

全局定时器是与应用程序独立的系统时间服务,并不依赖应用程序而存在。

该对象通过

AlarmManage alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

获得。

通过PendingIntent指定一个Activity,再通过setRepeating方法设置定时器

                                intent = new Intent(this, MyActivity.class);
				pendingActivityIntent = PendingIntent.getActivity(this, 0,
						intent, 0);
				alarmManager.setRepeating(AlarmManager.RTC, 0, 5000,
						pendingActivityIntent);

通过全局定时器,我们来演示一个每5秒更换手机壁纸的程序:

更换壁纸的Service类:

public class ChangeWallpaperService extends Service
{
	private static int index = 0;
	private int[] resIds = new int[]
	{ R.raw.wp1, R.raw.wp2, R.raw.wp3, R.raw.wp4, R.raw.wp5

	};

	@Override
	public void onStart(Intent intent, int startId)
	{

		if(index == 5)
			index = 0;
		InputStream inputStream = getResources().openRawResource(resIds[index++]);
		try
		{
			setWallpaper(inputStream);
		}
		catch (Exception e)
		{

		}
		super.onStart(intent, startId);
	}

	@Override
	public void onCreate()
	{
		super.onCreate();
	}

	@Override
	public IBinder onBind(Intent intent)
	{
		// TODO Auto-generated method stub
		return null;
	}

在mainfirst中配置

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

全局定时器:

public class Main extends Activity implements OnClickListener
{
	private Button btnStart;
	private Button btnStop;
	@Override
	public void onClick(View view)
	{
		AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
		PendingIntent pendingIntent = PendingIntent.getService(this, 0,
				new Intent(this, ChangeWallpaperService.class), 0);
		switch (view.getId())
		{
			case R.id.btnStart:
				alarmManager.setRepeating(AlarmManager.RTC, 0, 5000,
						pendingIntent);
				btnStart.setEnabled(false);
				btnStop.setEnabled(true);
				break;

			case R.id.btnStop:
				alarmManager.cancel(pendingIntent);
				btnStart.setEnabled(true);
				btnStop.setEnabled(false);
				break;
		}
	}
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		btnStart = (Button) findViewById(R.id.btnStart);
		btnStop = (Button) findViewById(R.id.btnStop);
		btnStop.setEnabled(false);
		btnStart.setOnClickListener(this);
		btnStop.setOnClickListener(this);
	}
}

在创建PendingIntent对象时与service绑定,那么AlarmManager在执行时就会执行service的onStart方法(不是onCreate方法,因为他只会执行一次),获得Service的PendingIntent对象是使用getService方法,同理getActivity,getBroadcast。

下面演示另一个全局定时器的例子,本例是实现多次定时提醒功能。

定时提醒的原理:在添加时间节点后,需要将所添加的时间节点保存在文件或数据库中。本例使用前面介绍过的SharedPreferances来保存。然后使用AlarmManager每隔一分钟扫描一次,在扫描过程中获得当前时间的value,如果成功则说明当前时间为时间点,否则继续扫描。

本例使用BroadcastReceiver来处理定时提醒任务:

public class AlarmReceiver extends BroadcastReceiver
{

	@Override
	public void onReceive(Context context, Intent intent)
	{
		SharedPreferences sharedPreferences = context.getSharedPreferences(
				"alarm_record", Activity.MODE_PRIVATE);
		String hour = String.valueOf(Calendar.getInstance().get(
				Calendar.HOUR_OF_DAY));
		String minute = String.valueOf(Calendar.getInstance().get(
				Calendar.MINUTE));
		String time = sharedPreferences.getString(hour + ":" + minute, null);
		if (time != null)
		{
			MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.ring);
			mediaPlayer.start();
		}

	}

}

配置文件:

	<receiver android:name=".AlarmReceiver" android:enabled="true" />

主程序中每添加一个时间点就会在XML文件中保存所添加的时间点:

public class Main extends Activity implements OnClickListener
{
	private TextView tvAlarmRecord;
	private SharedPreferences sharedPreferences;

	@Override
	public void onClick(View v)
	{
		View view = getLayoutInflater().inflate(R.layout.alarm, null);
		final TimePicker timePicker = (TimePicker) view
				.findViewById(R.id.timepicker);
		timePicker.setIs24HourView(true);
		new AlertDialog.Builder(this).setTitle("设置提醒时间").setView(view)
				.setPositiveButton("确定", new DialogInterface.OnClickListener()
				{

					@Override
					public void onClick(DialogInterface dialog, int which)
					{
						String timeStr = String.valueOf(timePicker
								.getCurrentHour())
								+ ":"
								+ String.valueOf(timePicker.getCurrentMinute());
						tvAlarmRecord.setText(tvAlarmRecord.getText()
								.toString()
								+ "\n" + timeStr);
						sharedPreferences.edit().putString(timeStr, timeStr)
								.commit();

					}
				}).setNegativeButton("取消", null).show();
	}

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button btnAddAlarm = (Button) findViewById(R.id.btnAddAlarm);
		tvAlarmRecord = (TextView) findViewById(R.id.tvAlarmRecord);
		btnAddAlarm.setOnClickListener(this);
		sharedPreferences = getSharedPreferences("alarm_record",
				Activity.MODE_PRIVATE);

		AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
		Intent intent = new Intent(this, AlarmReceiver.class);
		PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
				intent, 0);
		alarmManager
				.setRepeating(AlarmManager.RTC, 0, 60 * 1000, pendingIntent);

	}
}
时间: 2024-10-04 01:54:59

系统服务详解之时间服务3的相关文章

系统服务详解之时间服务0

Android SDK中内置了多种时间服务,用于处理时间相关的操作. 1.计时器:Chronometer组件 这个组件可以以1秒为时间间隔进行计时. 示例如下: public class Main extends Activity implements OnClickListener, OnChronometerTickListener { private Chronometer chronometer; private TextView tvTime; @Override protected

系统服务详解之时间服务1

2.Handler是处理定时操作的核心类.通过Handler可以提交和处理一个Runnable对象.该类通过3个方法来处理Runnable对象:                  立即执行:post :指定时间执行:postAtTime:指定的时间间隔:postDelayed 因为该类处理对象为Runnable,所以在调用这3个方法之前,需要实现Runnable接口的run方法. public class Main extends Activity implements OnClickListe

系统服务详解之时间服务2

3.定时器:Timer Timer和Chronometer类似,但功能更加强大.Timer类通过schedule方法设置执行方式和时间,schedule方法的第一个参数为TimerTask,TimerTask类实现了Runnable接口,因此Timer实际上是在线程中执行run方法. 虽然Timer和Handler的处理代码都放在run方法中,但Timer是在线程中执行run方法,Handler是将执行的动作添加到Android系统的消息队列.因此使用Timer执行run方法时,在run方法中不

RHEL/CentOS 6.x 系统服务详解

PS:RHEL/CentOS 6.x的系统服务比5.x系列的要多了很多新面孔,估计很多童鞋不甚理解,网上这方面资料也很少.理解这个对运维人员是必要的,因为开启不必要的服务越多,系统就相对越不安全.不需开启的服务尽量关闭.本人结合自己的应用经验做一些讲解说明,有不同理解的童鞋欢迎交流. 1.下面列表是在RHEL/CentOS 6.x最小化桌面环境安装下显示出来的系统服务,其中红色字体标注的是用官方的minimal ISO最小化安装系统后的服务列表. 服务名称 功能  默认   建议  备注说明 N

linux系统服务详解

1.NetworaManager:在无线和有线网络之间快速切换.一般用于移动终端. 2.NetworkManagerDispatcher:在多种网络环境之间来回切换,与NetworkManager相同. 3.acpid:(没有预设端口)电源管理配置服务. 4.anacron:(没有预设端口)一个自动化运行任务.Red Hat Linux 随带四个自动化任务的工具:cron.anacron.at.和 batc.当你的Linux主机并不是全天候开机,这个anacron就可以帮你执行在"chontab

系统服务详解之电话服务、音频服务

接听电话时,会显示两个状态:来点状态和接听状态.下面示例演示了如何使用电话服务. public class Main extends Activity { public class MyPhoneCallListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { //通话状态 case Tele

CentOS启动和停止服务详解

  CentOS启动和停止服务详解            服务简介 Linux 系统服务是在Linux启 动时自动加载,并在Linux退出时自动停止的系统任务.在Linux 启动过程中,我们可以看得很多"starting - "提示信息,该信息表示正在启动系统服务;而在Linux 退出时,我们也能够看到相应的"Stopping - "信息,表示系统服务正在停止.Linux自身有许多系统任务,如"network" 服务用于支持网络连接等.CAMS

Android中Service(后台服务)详解

  这篇文章主要介绍了Android中Service(后台服务)详解,本文讲解了Service的概念.作用.生命周期.启动方式和代码实例等内容,需要的朋友可以参考下 1.概念: (1).Service可以说是一个在后台运行的Activity.它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了. (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示. (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用. 2.作用: (1).它用于处理一

HTTP协议详解

HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发 展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出. HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式. 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.PO