实现闹钟的实例要通过闹钟管理者AlarmManager,使用闹钟管理者触发事件,这些事件可在特定的时刻或以固定的时间间隔发生
我们只需要五步就可以创建一个简单的闹铃
1》通过getSystemService获得闹钟管理者AlarmManager
2》确定设置闹钟的时刻
3》创建要调用的接受程序
4》创建一个挂起的PendingIntent,它可传递给闹钟管理器来调用接受程序
5》使用刚开始创建的时间和PendingIntent设置闹钟
但是为了更熟练的使用广播这个知识点,所以在写闹钟实例的时候,我会再通过广播在实现
首先我们在布局文件里写个Button,然后添加点击事件
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="setAlarm"
android:text="设置闹钟"
/>
在Activity的点击事件前,我们先通过getSystemService获得闹钟管理者AlarmManager
//获取闹钟的管理者
alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
在点击事件里,先弹出时间窗口,时间一到就发送广播,然后再通过广播去跳转Activity
public void setAlarm(View view){
//获取当前系统的时间
Calendar calendar=Calendar.getInstance();//实例化日历
int hour=calendar.get(Calendar.HOUR_OF_DAY);//得到小时
int munute=calendar.get(Calendar.MINUTE);//得到分
//弹出时间对话框
TimePickerDialog timePickerDialog=new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Calendar c=Calendar.getInstance(); //c是将来时间了 拿的是将来时间的毫秒数,而不是几点几分,所以在这里我们需要通过Calendar把他转成将来时间
c.set(Calendar.HOUR_OF_DAY,hourOfDay);
c.set(Calendar.MINUTE,minute);
Intent intent=new Intent();
intent.setAction("com.qqee.familyapp.RAING");//发送广播的名字
PendingIntent pendingIntent=PendingIntent.getBroadcast(SetAlarmActivity.this,0x101,intent,0);
//设置闹铃(单次闹钟) //唤醒屏幕 将来时间的毫秒数 跳转
alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),pendingIntent);
}
},hour,munute,true);
//显示对话框
timePickerDialog.show();
}
然后我们写一个广播接收者,在这个类里面,我们只需要跳转Activity,但是在跳的时候,一定注意要用context开始跳转
public class RaingRecived extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if("com.qqee.familyapp.RAING".equals(intent.getAction())){
Log.i("test","闹钟响了");
Intent intent1=new Intent(context,AlarmMusicActivity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//广播跳Activity
context.startActivity(intent1);
}
}
}
然后就是我们跳到闹钟响了唱歌的一个Activity,在这里我们只需要做一个简单的音乐播放就ok
public class AlarmMusicActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_music);
mediaPlayer = MediaPlayer.create(this, R.raw.loser);
mediaPlayer.start();
}
public void stop(View view){
mediaPlayer.stop();
finish();
}
}
布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="起床啦,太阳晒屁股了!!!!"
android:textSize="30sp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭"
android:onClick="stop"
/>
LinearLayout>
因为我们使用了广播,所以需要在Manifests里面声明
<receiver android:name=".RaingRecived">
<intent-filter>
<action android:name="com.qqee.familyapp.RAING">action>
intent-filter>
receiver>
那么单次闹钟也就可以了
设置周期闹钟只需要改一行代码就行
//设置闹铃(周期闹钟) //唤醒屏幕 将来时间的毫秒数 周期(毫秒) 跳转
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),5000, pendingIntent);
因为是周期闹钟,为了不耽误时间,我这里的间隔是每隔五秒响一次,所以,我们还需要写一个停止闹钟按钮,不然它就停不下来了,那你们就只能卸载咯
public void canselAlarm(View view){
alarmManager.cancel(pendingIntent);
}
这样的话,我们的周期闹钟也可以了,如果有些人想弄恶作剧的话,那就看你们怎么去发挥想象啦,学会了这个,以后就再也不怕迟到了