android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动

          

1、先简单设置一个闹钟提醒事件:

//设置闹钟    mSetting.setOnClickListener(new OnClickListener() {        @Override        public void onClick(View arg0) {            // TODO Auto-generated method stub            calendar.setTimeInMillis(System.currentTimeMillis());            int mHour=calendar.get(Calendar.HOUR_OF_DAY);            int mMinute=calendar.get(Calendar.MINUTE);            new TimePickerDialog(MainActivity.this,              new TimePickerDialog.OnTimeSetListener(){                                public void onTimeSet(TimePicker view,int hourOfDay,                                      int minute){                  // 设置时间                  calendar.setTimeInMillis(System.currentTimeMillis());                  calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);                  calendar.set(Calendar.MINUTE,minute);                  calendar.set(Calendar.SECOND,0);                  calendar.set(Calendar.MILLISECOND,0);                  //广播跳转                  Intent intent = new Intent(MainActivity.this, CallAlarmReceiver.class);                  //启动一个广播                  PendingIntent sender=PendingIntent.getBroadcast(                          MainActivity.this,0, intent, 0);                  //创建闹钟                  AlarmManager am;                  am = (AlarmManager)getSystemService(ALARM_SERVICE);                  am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),sender);                  String tmpS=format(hourOfDay)+":"+format(minute);                  mDate.setText(tmpS);                  //SharedPreferences保存数据,并提交                  SharedPreferences time1Share = getPreferences(0);                  SharedPreferences.Editor editor = time1Share.edit();                  editor.putString("TIME1", tmpS);                  editor.commit();                  Toast.makeText(MainActivity.this,"设置闹钟时间为"+tmpS,Toast.LENGTH_SHORT).show();                }                        },mHour,mMinute,true).show();        }    });

注意:CallAlarmReceiver 广播接收器,所以要在AndroidManifest.xml配置:如

2、广播接收器:

很简单一个继承BroadcastReceiver,然后跳转到弹框的Activity

public class CallAlarmReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {    // TODO Auto-generated method stub    Intent alaramIntent = new Intent(context, AlarmSettingAgain.class);    alaramIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    context.startActivity(alaramIntent);}}

3、接收后处理,包括弹出dialog,播放铃声,震动和锁屏状态下亮屏

(1)、首先要在onCreate()上加一句,确保在锁屏状态下弹出Dialog不会出错。

   @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    requestWindowFeature(Window.FEATURE_NO_TITLE); // hide title    Window win = getWindow();    WindowManager.LayoutParams winParams = win.getAttributes();    winParams.flags |= (WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD            | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);    startMedia();    startVibrator();    createDialog();}

(2)、锁屏状态下唤醒屏幕,要在onResume() 方法中启动,并且要在onPause()中释放,否则会出错。

@Overrideprotected void onResume() {    super.onResume();    // 唤醒屏幕    acquireWakeLock();}@Overrideprotected void onPause() {    super.onPause();    releaseWakeLock();}/** * 唤醒屏幕 */private void acquireWakeLock() {    if (mWakelock == null) {        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);        mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP                | PowerManager.SCREEN_DIM_WAKE_LOCK, this.getClass()                .getCanonicalName());        mWakelock.acquire();    }}/** * 释放锁屏 */private void releaseWakeLock() {    if (mWakelock != null && mWakelock.isHeld()) {        mWakelock.release();        mWakelock = null;    }}

(3)、播放铃声:

/** * 开始播放铃声 */private void startMedia() {    try {        mp.setDataSource(this,                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)); //铃声类型为默认闹钟铃声        mp.prepare();        mp.start();    } catch (Exception e) {        e.printStackTrace();    }}

(4)、震动:

/** * 震动 */private void startVibrator() {    /**     * 想设置震动大小可以通过改变pattern来设定,如果开启时间太短,震动效果可能感觉不到     *      */    vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);    long[] pattern = { 500, 1000, 500, 1000 }; // 停止 开启 停止 开启    vibrator.vibrate(pattern, 0);}

(5)、弹出Dialog对话框

private void createDialog() {        new AlertDialog.Builder(this)                .setIcon(R.drawable.clock)                .setTitle("闹钟提醒时间到了!!")                .setMessage("你使用闹钟时间到了!!!")                .setPositiveButton("推迟10分钟", new DialogInterface.OnClickListener() {                    public void onClick(DialogInterface dialog, int whichButton) {                        tenMRemind();                        mp.stop();                        vibrator.cancel();                        finish();                    }                })                .setNegativeButton("关闭", new DialogInterface.OnClickListener() {                    public void onClick(DialogInterface dialog, int whichButton) {                        mp.stop();                        vibrator.cancel();                        finish();                    }                }).show();    }/** * 推迟10分钟提醒 */private void tenMRemind(){    //设置时间    Calendar calendar_now =Calendar.getInstance();    calendar_now.setTimeInMillis(System.currentTimeMillis());    calendar_now.set(Calendar.HOUR_OF_DAY, calendar_now.get(Calendar.HOUR_OF_DAY));    calendar_now.set(Calendar.MINUTE, calendar_now.get(Calendar.MINUTE)+10);    calendar_now.set(Calendar.SECOND, 0);    calendar_now.set(Calendar.MILLISECOND, 0);    //时间选择好了    Intent intent = new Intent(this, CallAlarmReceiver.class);    //注册闹钟广播    PendingIntent sender = PendingIntent.getBroadcast(            this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);    AlarmManager am;    am = (AlarmManager) this.getSystemService(this.ALARM_SERVICE);    am.set(AlarmManager.RTC_WAKEUP, calendar_now.getTimeInMillis(), sender);}

(6)、因为震动和锁屏都是系统级的,所以要在AndroidManifest.xml加上权限

源代码

更多相关文章

  1. 关于 Android(安卓)4.4 系统屏幕旋转调研
  2. Android(安卓)Http请求框架二:xUtils 框架网络请求
  3. Android(安卓)Studio制作简易计算器源代码及详解
  4. 8.1.2 Android中的13种Drawable小结 Part 2
  5. 设置Android默认锁定屏幕旋转
  6. EditText常用属性
  7. 关于CoordinatorLayout展开与折叠相关属性
  8. Android(安卓)自定义CheckBox 样式
  9. 安卓模拟器设置网速和延迟

随机推荐

  1. Android ApiDemos示例解析(178):Views->L
  2. Android布局优化总结
  3. Android串口操作,简化android-serialport-
  4. Android 上进行签名的方法
  5. Android 文件读写工具类
  6. 数据存储之五网络数据交互
  7. Android获取文件的MD5值
  8. Rk3399 android7.1 camera 分析
  9. Android 用源代码写layout布局
  10. Android 系统版本