**最近项目中需要完成一个需求:实现类似于闹钟的功能,能够在指定的时间唤醒。于是开始使用alarmManager。。。。查了查别人的博客之后开始的代码是这么写的:**
private void setTime() {        // 当前设备上的系统时间        final Calendar cal = Calendar.getInstance();        // 弹出设置时间的窗口        new TimePickerDialog(this, new OnTimeSetListener() {            @Override            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {                Intent intent = new Intent(context, AlarmNotifyAcitivity.class);                PendingIntent pi = PendingIntent.getActivity(context, 0,                        intent, 0);                Calendar setCalendar = Calendar.getInstance();                setCalendar.set(Calendar.HOUR, hourOfDay);                setCalendar.set(Calendar.MINUTE, minute);                AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);                manager.setRepeating(AlarmManager.RTC_WAKEUP,                        setCalendar.getTimeInMillis(), 1000 * 60 * 60 * 24, pi);                timeSetBtn.setText(setCalendar.get(Calendar.HOUR) + ":"                        + setCalendar.get(Calendar.MINUTE));                Toast.makeText(context, "闹铃设置成功", Toast.LENGTH_SHORT).show();            }        }, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true)                .show();    }

intent中指定的activity用来处理逻辑
但是现实是–根本没有任何的反应!!
查了查官方的api发现,android在alarm设定之后,启动时发送的是广播,使用getActivity得到的pendingintent是无法实现效果的,并且需要一个继承自广播接收器的类接收广播,于是更改代码:

private void setTime() {        // 当前设备上的系统时间        final Calendar cal = Calendar.getInstance();        // 弹出设置时间的窗口        new TimePickerDialog(this, new OnTimeSetListener() {            @Override            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {                Intent intent = new Intent(context, AlarmNotifyReceiver.class);                PendingIntent pi = PendingIntent.getBroadcast(context, 0,                        intent, 0);                Calendar setCalendar = Calendar.getInstance();                setCalendar.set(Calendar.HOUR, hourOfDay);                setCalendar.set(Calendar.MINUTE, minute);                AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);                manager.setRepeating(AlarmManager.RTC_WAKEUP,                        setCalendar.getTimeInMillis(), 1000 * 60 * 60 * 24, pi);                timeSetBtn.setText(setCalendar.get(Calendar.HOUR) + ":"                        + setCalendar.get(Calendar.MINUTE));                Toast.makeText(context, "闹铃设置成功", Toast.LENGTH_SHORT).show();            }        }, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true)                .show();    }

用来接收广播的类:

public class AlarmNotifyReceiver extends BroadcastReceiver {    private MediaPlayer notice;    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "启动闹钟", Toast.LENGTH_SHORT).show();        notice = MediaPlayer.create(context,                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));        notice.setLooping(true);        try {            notice.prepare();            notice.start();        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        Builder builder = new AlertDialog.Builder(context);        builder.setTitle("日常提醒闹钟").setMessage("请执行操作")                .setPositiveButton("好哒~~", new OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        notice.stop();                    }                });        AlertDialog dialog=builder.create();        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);        dialog.show();    }}

这里我做的是显示一个alert,注意如果不设置settype再运行时会报错!!!注意如果不设置settype再运行时会报错!!!注意如果不设置settype再运行时会报错!!!重要的事情说三遍。。。
但是设置之后运行,依然还是报错:-。-
需要注册权限:

ok,大功告成!!
但是有点需要特别提醒,android自从4.4之后,唤醒的时间未必是完全准确的,系统会将某一段时间内需要唤醒的放在一个时间唤醒,而这个时间未必是你设定的时间。

更多相关文章

  1. Android(安卓)Room 框架学习
  2. android ListView+CheckBox实现单选
  3. Android在诸如editText等组件设置输入法半屏幕显示的说明
  4. Android(安卓)使用自定义Dialog打造ActionSheet菜单
  5. Android(安卓)文件系统的权限设置
  6. AndroidStudio2.2.3设置
  7. Android(安卓)动态加载menu
  8. Android(安卓)UI - TableLayout
  9. Android(安卓)设置开放隐性启动Intent

随机推荐

  1. 【Android】Android(安卓)permission 访
  2. android系统时间获取方式
  3. 有关Android中的java.lang.ClassCastExce
  4. android微信摇一摇功能
  5. Android(安卓)扫描SDCard上的音乐文件以
  6. android Toast工具BToast
  7. android之ListView和adapter配合显示图片
  8. Android(安卓)UDP广播包抓取
  9. android列表为空时提示语
  10. android 权限库,拿来就能用