android 设置单个闹铃并取消单个闹铃,并支持多个闹铃(一)

来源:互联网 发布:免费淘宝店铺推广软件 编辑:程序博客网 时间:2024/05/30 04:25

android 有一个闹铃管理的东西叫:AlarmManager;这个用来管理闹铃的发起和停止,我们可以service,broadcastreceiver或Activity来接受AlarmManager发出的信息,AlarmManager类通过getSystemService(Activity.ALARM_SERVICE)方法来实例化;在这里注意下这个方法:

    // 取消已经注册的与参数匹配的闹铃        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)  
再来介绍下闹铃的几种样式:
public static final int ELAPSED_REALTIME        //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3。        public static final int ELAPSED_REALTIME_WAKEUP        //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2  。        public static final int RTC        //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。        public static final int RTC_WAKEUP        //能唤醒系统,用法同RTC类型,系统值为 0 。        Public static final int POWER_OFF_WAKEUP        //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4。

下面看下小DEMO:

入口:AlarmActivity

package com.glacier.demo;import java.util.Calendar;import android.app.Activity;import android.app.AlarmManager;import android.app.PendingIntent;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.DatePicker;import android.widget.DatePicker.OnDateChangedListener;import android.widget.TextView;import android.widget.TimePicker;import android.widget.TimePicker.OnTimeChangedListener;/*** * 闹铃管理(提示:设置过去的时间会一直提示:大家在把时间设置成闹铃的时间取消即可) * @author wangyubin * */public class AlarmActivity extends Activity implements OnClickListener {private TextView mTitleTv, mDatePickerTv, mTimePickerTv;private DatePicker mDatePicker;private TimePicker mTimePicker;private Button mInstallBtn, mCancelBtn;private Calendar calendar;private int year, month, day, hour, minute;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_alarm);init();}private void init() {mTitleTv = (TextView) findViewById(R.id.tv_title);mDatePicker = (DatePicker) findViewById(R.id.datePicker);mTimePicker = (TimePicker) findViewById(R.id.timePicker);mDatePickerTv = (TextView) findViewById(R.id.tv_datepicker);mTimePickerTv = (TextView) findViewById(R.id.tv_timepicker);mInstallBtn = (Button) findViewById(R.id.btn_install);mCancelBtn = (Button) findViewById(R.id.btn_cancel);calendar = Calendar.getInstance();// 得到当前时间并设置到日历里面calendar.setTimeInMillis(System.currentTimeMillis());// 获取到当前的时间year = calendar.get(Calendar.YEAR);month = calendar.get(Calendar.MONTH);day = calendar.get(Calendar.DATE);hour = calendar.get(Calendar.HOUR_OF_DAY);minute = calendar.get(Calendar.MINUTE);// 设置date控件的初始化以及监听mDatePicker.init(year, month, day, new OnDateChangedListener() {public void onDateChanged(DatePicker view, int year,int monthOfYear, int dayOfMonth) {mDatePickerTv.setText("您选择的日期是:" + year + "年"+ (monthOfYear + 1) + "月" + dayOfMonth + "日");AlarmActivity.this.year = year;AlarmActivity.this.month = monthOfYear;AlarmActivity.this.day = dayOfMonth;}});// 设置24小时制mTimePicker.setIs24HourView(true);mTimePicker.setOnTimeChangedListener(new OnTimeChangedListener() {public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {mTimePickerTv.setText("您选择的时间是:" + hourOfDay + "时" + minute+ "分");AlarmActivity.this.hour = hourOfDay;AlarmActivity.this.minute = minute;}});// 设置闹铃按钮监听mInstallBtn.setOnClickListener(this);mCancelBtn.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {// 这里讲一个我们遇到的命名的问题:仔细看case后面都带一个大括号,这样里面的switch里面的局部变量就变成了单独的case里面的局部变量,防止命名冲突case R.id.btn_install: {// 设置闹铃的时间(年,月,日,时,分,秒)calendar.set(year, month, day, hour, minute, 0);Intent intent = new Intent(this, AlamrReceiver.class);// 设置intent的动作,识别当前设置的是哪一个闹铃,有利于管理闹铃的关闭intent.setAction(year + "年" + month + "月" + day + "日" + hour + "时"+ minute + "分");// 用广播管理闹铃PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);// 获取闹铃管理AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);// 设置闹钟am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);// 设置闹钟重复时间am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), 10 * 1000, pi);// 获取到的月份是0~11,所以要加1int newMonth = month + 1;mTitleTv.setText("您选择的闹铃为:" + year + "年" + newMonth + "月" + day+ "日" + hour + "时" + minute + "分");break;}case R.id.btn_cancel: {Intent intent = new Intent(this, AlamrReceiver.class);// 找出当前控件选择的闹铃时间,并关闭当前选择的闹铃intent.setAction(year + "年" + month + "月" + day + "日" + hour + "时"+ minute + "分");PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);am.cancel(pi);int newMonth = month + 1;mTitleTv.setText("您取消了" + year + "年" + newMonth + "月" + day + "日"+ hour + "时" + minute + "分" + "的闹铃!!!");break;}}}}
下面看下广播的接收:

package com.glacier.demo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;/** * 闹铃接受器 * @author wangyubin * */public class AlamrReceiver  extends BroadcastReceiver {        @Override      public void onReceive(Context context, Intent intent) {          // TODO Auto-generated method stub         Toast.makeText(context, "闹钟时间到:"+intent.getAction(), Toast.LENGTH_LONG).show();      }  }

这个广播需要注册成:

<receiver            android:name=".AlamrReceiver"            android:process=":remote" >        </receiver>

android:process=":remote" 要注意是为了这个广播能被AlarmManager调用


还有布局文件activity_alarm:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:layout_gravity="center_horizontal"    android:orientation="vertical" >    <TextView        android:id="@+id/tv_title"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:text="@string/btn_install" />    <DatePicker        android:id="@+id/datePicker"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="27dp" />    <TextView        android:id="@+id/tv_datepicker"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TimePicker        android:id="@+id/timePicker"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />        <TextView        android:id="@+id/tv_timepicker"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:id="@+id/btn_install"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:layout_weight="1"            android:text="@string/btn_install" />        <Button            android:id="@+id/btn_cancel"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:layout_weight="1"            android:text="@string/btn_cancel" />    </LinearLayout></LinearLayout>

还有两个String:

<string name="btn_install">设置闹铃</string>
<string name="btn_cancel">取消闹铃</string>

真机下效果:想抓弹出来的吐司没抓到


猿码:点击打开下载