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

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;

	@Override
	public 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);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (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,所以要加1
			int 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>

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


猿码:点击打开下载



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用中,我们经常需要为多个按钮添加点击事件监听器。如果每个按钮都有一个单独的监听器,这样会让我们的代码显得非常冗长。在这种情况下,我们可以使用单个监听器来监听多个按钮的点击事件。 要实现此功能,我们可以在Activity中实现OnClickListener接口,并在onClick方法中根据被点击的按钮来执行相应的操作。具体步骤如下: 1.为所有需要添加监听器的按钮设置相同的id,例如: ``` <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button 1" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button 2" /> ``` 2.在Activity中实现OnClickListener接口,并在onClick方法中根据被点击的按钮来执行相应的操作,例如: ``` public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 为所有需要添加监听器的按钮设置相同的id Button btn1 = findViewById(R.id.btn1); Button btn2 = findViewById(R.id.btn2); // 为所有按钮添加同一个监听器 btn1.setOnClickListener(this); btn2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn1: // 处理按钮1的点击事件 break; case R.id.btn2: // 处理按钮2的点击事件 break; default: break; } } } ``` 通过这种方式,我们可以使用单个监听器来监听多个按钮的点击事件,代码更加简洁和易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值