Android闹钟服务详解

通常情况下我们有这样的需求,规定程序在指定的时间内启动,这样就用到了android为我们提供的闹钟服务

下面就一个简单的例子,来说明如何使用android的闹钟服务

1、首先创建布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent" 
	android:gravity="center_horizontal">
	<TimePicker 
		android:id="@+id/time" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
	<TextView 
		android:id="@+id/msg" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" 
		android:text="当前没有设置闹钟" />
	<Button 
		android:id="@+id/set" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" 
		android:text="设置闹钟" />
	<Button 
		android:id="@+id/delete" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" 
		android:text="删除闹钟" />
</LinearLayout>

 第二步:在activity中使用闹钟服务

package com.jiao.alarm;

import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
import android.widget.Toast;

public class MyAlarmManager extends Activity {
	private AlarmManager alarm = null;							// 闹钟管理
	private Button set = null;									// 按钮组件
	private Button delete = null;								// 按钮组件
	private TextView msg = null;								// 文本显示组件
	private Calendar calendar = Calendar.getInstance();			// 取得Calendar对象
	private TimePicker time = null;								// 时间选择器
	private int hourOfDay = 0;									// 保存设置的时
	private int minute = 0;										// 保存设置的分

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.main); 					// 调用布局管理器
		time = (TimePicker) super.findViewById(R.id.time); // 取得时间选择器
		set = (Button) super.findViewById(R.id.set); 		// 取得按钮组件
		delete = (Button) super.findViewById(R.id.delete); // 取得按钮组件
		msg = (TextView) super.findViewById(R.id.msg);		// 取得组件
		set.setOnClickListener(new SetOnClickListenerImpl()); // 设置单击事件
		delete.setOnClickListener(new DeleteOnClickListenerImpl()); // 设置单击事件
		alarm = (AlarmManager) super.getSystemService(Context.ALARM_SERVICE); 	// 取得闹钟服务
		time.setOnTimeChangedListener(new OnTimeChangedListenerImpl());	 // 设置时间改变监听
		time.setIs24HourView(true); // 24小时制
	}

	private class OnTimeChangedListenerImpl implements OnTimeChangedListener {
		@Override
		public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
			calendar.setTimeInMillis(System.currentTimeMillis());	// 设置当前时间
			calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);		// 设置小时
			calendar.set(Calendar.MINUTE, minute);	// 设置分钟
			calendar.set(Calendar.SECOND, 0);	// 设置秒
			calendar.set(Calendar.MILLISECOND, 0);	// 设置毫秒
			hourOfDay = hourOfDay; 	// 保存设置的小时
			minute = minute; 		// 保存设置的分钟
		}
	}

	private class SetOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View view) {
			Intent intent = new Intent(MyAlarmManager.this,MyAlarmReceiver.class); // 指定跳转的Intent
			intent.setAction("com.jiao.action.setalarm"); 	// 定义广播的Action
			PendingIntent sender = PendingIntent.getBroadcast(MyAlarmManager.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);	// 指定PendingIntent
			alarm.set(AlarmManager.RTC_WAKEUP,MyAlarmManager.this.calendar.getTimeInMillis(), sender);	// 设置闹钟
			msg.setText("闹钟响起的时间是:"+ hourOfDay + "时"+ minute + "分。");	// 提示文字
			Toast.makeText(MyAlarmManager.this, "闹钟设置成功!",Toast.LENGTH_SHORT).show();	// 显示提示信息
		}
	}

      	private class DeleteOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View view) {
			if (alarm != null) {
				Intent intent = new Intent(MyAlarmManager.this,MyAlarmReceiver.class);// 设置Intent
				PendingIntent sender = PendingIntent.getBroadcast(MyAlarmManager.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);	// 指定PendingIntent
				alarm.cancel(sender);	// 取消闹钟
				msg.setText("当前没有设置闹钟。");	// 提示文字
				Toast.makeText(MyAlarmManager.this, "闹钟删除成功!",Toast.LENGTH_SHORT).show();	// 显示提示信息
			}
		}

	}
}

 第三步:在上一步的代码中自定义了一个广播接收者,所以再创建一个广播接收者

package com.jiao.alarm;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyAlarmReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent it = new Intent(context, AlarmMessage.class);// 定义要操作的Intent,要转到的activity在这里设置就可以了
		it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);	// 传递一个新的任务标记
		context.startActivity(it);	// 启动Intent
	}

}

 最后记得在清单文件中配置,注册广播接收者

<receiver 
  android:name="MyAlarmReceiver" 
  android:enabled="true"
  android:process=":remote">
	  <intent-filter>
		<action android:name="com.jiao.action.setalarm" />
	  </intent-filter>
</receiver>

 

 

posted @ 2013-04-03 11:32  Android、Boy  阅读(879)  评论(0编辑  收藏  举报