闹铃


包括单次闹铃、按照星期设置循环闹铃及循环闹铃的取消

	/**
	 * 转换成hh:mm 的时间格式。
	 * @param hour
	 * @param minute
	 * @return eg:08:30
	 */
	public static String getTimeStr(int hour, int minute) {
		StringBuilder sb = new StringBuilder();
		if (hour < 10) sb.append("0");
		sb.append(hour).append(":");
		if (minute < 10) sb.append("0");
		sb.append(minute);
		return sb.toString();
	}
	
	public static int getAmPmType()
	{
		Calendar mCalendar = Calendar.getInstance();
		int ampm = mCalendar.get(Calendar.AM_PM);
		if(ampm == Calendar.AM)
		{
			return UpdateDef.isAm;
		}
		else
		{
			return UpdateDef.isPm;
		}
	}
	
	public static int getWeekType()
	{
		Calendar mCalendar = Calendar.getInstance();
		int ampm = mCalendar.get(Calendar.AM_PM);
		Log.i("sxy", "ampm="+ampm);
		return DAYS_KEY_MAP.indexOfValue(mCalendar.get(Calendar.DAY_OF_WEEK));
	}
	
	//-------------------------时间到了的闹铃-----------------------------
	//--目前只为小学的古诗词和小学中学的国学乐园发送时间到了的广播
	public static void setupTimeIsOverAlarm(Context con, int mListenDur)
	{
		Intent intent = new Intent(UpdateDef.TIMEISOVER_ACTION);
	    PendingIntent pendingIntent = PendingIntent.getBroadcast(con, UpdateDef.TIMEISOVER_ALARMID, intent, 0);
	    AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		
	    long now = System.currentTimeMillis();
		am.set(AlarmManager.RTC_WAKEUP, now+mListenDur*60*1000, pendingIntent);
		
		Log.i(TAG, "setupTimeIsOverAlarm alarm: alarmId="+UpdateDef.TIMEISOVER_ALARMID+", dur="+mListenDur);
	}
	
	//---------------------------闹铃-------------------------------
	private static final long INTERVAL = AlarmManager.INTERVAL_DAY * 7;// 7天
	private static final SparseIntArray DAYS_KEY_MAP = new SparseIntArray();
	static {
		DAYS_KEY_MAP.append(UpdateDef.week_mon, Calendar.MONDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_tue, Calendar.TUESDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_wed, Calendar.WEDNESDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_thu, Calendar.THURSDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_fri, Calendar.FRIDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_sat, Calendar.SATURDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_sun, Calendar.SUNDAY);
	}
	
	private static int alarmId = 0;//保证闹铃id唯一:Integer.valueOf(""+weekType+ampmType+stagetype)
	
	public final static int getAlarmId(int weektype, int ampmtype, int stagetype)
	{
		return Integer.valueOf(""+weektype+ampmtype+stagetype);//文件名由星期类型加上间隔符再加上早晚类型和年级类型组成
	}
	
	//设置单次闹铃
	public static void setOneAlarm(Context con, SaveDetailInfo mInfo)
	{
		if(mInfo == null || mInfo.isHasSet() == false || mInfo.isOpen() == false)
		{
			Log.i(TAG, "setup alarm error");
			return;
		}

		Calendar mCalendar = Calendar.getInstance();
		int currentHour = mCalendar.get(Calendar.HOUR_OF_DAY);
		int currentMinute = mCalendar.get(Calendar.MINUTE);
		int beginHour = mInfo.getBeginTime_hour();
		int beginMinute = mInfo.getBeginTime_min();
		if (beginHour < 0 
			|| beginMinute < 0
			|| beginHour < currentHour
			|| (beginHour == currentHour && beginMinute < currentMinute)) {
			return;
		}
		mCalendar.set(Calendar.HOUR_OF_DAY, beginHour);
		mCalendar.set(Calendar.MINUTE, beginMinute);
		mCalendar.set(Calendar.SECOND, 0);
		mCalendar.set(Calendar.MILLISECOND, 0);
		
		Intent intent = new Intent(UpdateDef.ACTION_UPDATE_REMIND);
		intent.putExtra(UpdateDef.mAmPm_Flag, mInfo.getAmPmType());
		intent.putExtra(UpdateDef.mWeek_Flag, mInfo.getWeekType());
		intent.putExtra(UpdateDef.mStage_Flag, mInfo.getStageType());
		
		PendingIntent pi = PendingIntent.getActivity(con, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		am.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pi);
	}
	
	//设置闹铃
	public static void setupAlarm(Context con, SaveDetailInfo mInfo) {
		if(mInfo == null || mInfo.isHasSet() == false || mInfo.isOpen() == false)
		{
			Log.i(TAG, "setup alarm error");
			return;
		}
		
		alarmId = getAlarmId(mInfo.getWeekType(), mInfo.getAmPmType(), mInfo.getStageType());
		cancelAlarm(con, mInfo);
		
		Calendar mCalendar = Calendar.getInstance();
		
		int beginHour = mInfo.getBeginTime_hour();
		int beginMinute = mInfo.getBeginTime_min();
		mCalendar.set(Calendar.DAY_OF_WEEK, DAYS_KEY_MAP.get(mInfo.getWeekType()));
		mCalendar.set(Calendar.HOUR_OF_DAY, beginHour);
		mCalendar.set(Calendar.MINUTE, beginMinute);
		mCalendar.set(Calendar.SECOND, 0);
		mCalendar.set(Calendar.MILLISECOND, 0);
		long triggerAtTime = mCalendar.getTimeInMillis();
		
		long now = System.currentTimeMillis();
        if (triggerAtTime/1000/60 < now/1000/60) { // 下周
            triggerAtTime += AlarmManager.INTERVAL_DAY * 7;
        }
		
        Intent intent = new Intent(UpdateDef.ACTION_UPDATE_REMIND);
		intent.putExtra(UpdateDef.mAmPm_Flag, mInfo.getAmPmType());
		intent.putExtra(UpdateDef.mWeek_Flag, mInfo.getWeekType());
		intent.putExtra(UpdateDef.mStage_Flag, mInfo.getStageType());
        
		PendingIntent pi = PendingIntent.getActivity(con, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		
		if(Hardware.getIsSHUTDOWN_WAKEUP())
		{
			am.setRepeating(AlarmManager.RTC_SHUTDOWN_WAKEUP, triggerAtTime, INTERVAL, pi);//深度关机时闹铃启动方式RTC_SHUTDOWN_WAKEUP
		}
		else
		{
			am.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, INTERVAL, pi);
		}
		
		Log.i(TAG, "set alarm: alarmId="+alarmId
				+", time=" + getTimeStr(beginHour, beginMinute)
				+", path="+mInfo.getBookPath()
				);
	}
	
	//取消闹铃
	public static void cancelAlarm(Context con, SaveDetailInfo mInfo) {
		if(mInfo == null || mInfo.isHasSet() == false)
		{
			Log.i(TAG, "cancel alarm error");
			return;
		}
		
		alarmId = getAlarmId(mInfo.getWeekType(), mInfo.getAmPmType(), mInfo.getStageType());
		
		Intent intent = new Intent(UpdateDef.ACTION_UPDATE_REMIND);
		PendingIntent pi = PendingIntent.getActivity(con, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		am.cancel(pi);
		
		Log.i(TAG, "cancel alarm: alarmId="+alarmId);
	}
	//-------------------------------------------------------------



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的实现具有闹铃功能的闹钟的代码和布局文件,闹钟可以自定义时间。 布局文件 alarm_clock.xml: ```xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/time_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="50sp" android:layout_centerInParent="true"/> <Button android:id="@+id/set_alarm_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置闹钟" android:layout_below="@id/time_text_view" android:layout_centerHorizontal="true"/> </RelativeLayout> ``` Java 代码 AlarmClockActivity.java: ```java 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.widget.Button; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import java.util.Calendar; public class AlarmClockActivity extends AppCompatActivity { private TextView mTimeTextView; private TimePicker mTimePicker; private Button mSetAlarmButton; private int mHour; private int mMinute; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alarm_clock); mTimeTextView = findViewById(R.id.time_text_view); mTimePicker = new TimePicker(this); mSetAlarmButton = findViewById(R.id.set_alarm_button); mSetAlarmButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHour = mTimePicker.getHour(); mMinute = mTimePicker.getMinute(); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, mHour); calendar.set(Calendar.MINUTE, mMinute); calendar.set(Calendar.SECOND, 0); Intent intent = new Intent(AlarmClockActivity.this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(AlarmClockActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); Toast.makeText(AlarmClockActivity.this, "闹钟设置成功!", Toast.LENGTH_SHORT).show(); } }); } } ``` Java 代码 AlarmReceiver.java: ```java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.widget.Toast; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "闹钟响了!", Toast.LENGTH_LONG).show(); MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.alarm_sound); mediaPlayer.start(); } } ``` 以上代码实现了一个简单的具有闹铃功能的闹钟,可以自定义时间。当设置的时间到达时,会弹出一个 Toast 提示用户,同时播放一个音乐文件。当然,还有很多细节需要完善,比如设置闹钟的时间不能早于当前时间等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值