安卓学习日记——AlarmManager系统服务

  • AlarmManager简介

AlarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服务。
AlarmManager对象一般不直接实例化,而是通过Content.getSystemService(Content.ALARM_SERVICE)方法获得

  • AlarmManager常用属性和方法
    AlarmManager.RTC 硬件闹钟,不唤醒手机(也可能其它设备)休眠;当手机休眠时不发射闹钟。
    AlarmManager.RTC_WAKEUP 硬件闹钟,当闹钟发射时唤醒休眠手机。
    AlarmManager.ELAPSED_REALTIME 真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
    AlarmManager.ELAPSED_REALTIME_WAKEUP 真实时间流逝闹钟,当闹钟发射时唤醒手机休眠。

RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。

简易的闹钟实现(以Toast方式替代响铃操作)
自定义一个广播接收器,用来显示

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"起床了,起床了",Toast.LENGTH_SHORT).show();
    }
}

闹钟事件

public void startAlarmClick(View v){
        //获取到系统的闹钟服务
        AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        //触发闹钟的时间(毫秒)
        long triggerTime=System.currentTimeMillis()+3000;

        Intent intent=new Intent(this,AlarmReceiver.class);
        PendingIntent op=PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        //只会执行一次的闹钟
//        am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);//参数:类型,触发时间,操作
        //指定时间重复执行闹钟
        am.setRepeating(AlarmManager.RTC,triggerTime,5000,op);//参数:类型,第一次触发时间,之后每次循环触发间隔,操作

    }

效果图
在这里插入图片描述

模拟闹钟界面
创建一个Activity用于显示闹钟界面

public class AlarmActivity extends Activity {
        MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //唤醒屏幕
        Window win=getWindow();
        win.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        setContentView(R.layout.activity_alarm);
        mp=new MediaPlayer();
        try {
            mp.setDataSource(this, Uri.parse("/sdcard/Music/zhh.mp3"));
            mp.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mp.setLooping(true);//重复
        mp.start();
        alarmDialog();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mp!=null){
            if (mp.isPlaying()){
                mp.stop();
            }
            mp.release();
        }
    }

    public void alarmDialog(){
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setMessage("大哥赶紧起床啊!");
        builder.setPositiveButton("再来一次", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                alarm();
                finish();
            }
        });
        builder.setNegativeButton("停止", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        builder.show();
    }

    private void alarm(){
        //获取到系统的闹钟服务
        AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        //触发闹钟的时间(毫秒)
        long triggerTime=System.currentTimeMillis()+5000;
        Intent intent=new Intent(this,AlarmActivity.class);
        PendingIntent op=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        //只会执行一次的闹钟
        am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);//参数:类型,触发时间,操作

    }

启动闹钟的点击事件

 public void startSetAlarmClick(View v){
        //获取到系统的闹钟服务
        AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        //触发闹钟的时间(毫秒)
        long triggerTime=System.currentTimeMillis()+3000;
        Intent intent=new Intent(this,AlarmActivity.class);
        PendingIntent op=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        //只会执行一次的闹钟
        am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);//参数:类型,触发时间,操作
    }

清单文件添加样式
在这里插入图片描述
效果如下
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值