Android 通过AlarmManager实现单次闹钟和周期闹钟

实现闹钟的实例要通过闹钟管理者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);
    }

这样的话,我们的周期闹钟也可以了,如果有些人想弄恶作剧的话,那就看你们怎么去发挥想象啦,学会了这个,以后就再也不怕迟到了

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qiuqiu_qiuqiu123/article/details/55190222
今日推荐