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

android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动_第1张图片          android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动_第2张图片

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 自定义时间控件
  2. android模仿铃声选择功能
  3. Android 程序获取、设置铃声和音量
  4. Android 程序获取、设置铃声、音量、静音、扬声器
  5. Android仿iPhone的日期时间选择器
  6. Android 自定义日期和时间和星期的弹窗

随机推荐

  1. Android和JAVA面试题相关资料
  2. mono for android 获取手机照片或拍照并
  3. Android(安卓)获取设备信息
  4. eclipse ADT在线安装 https://dl-ssl.goo
  5. android 监听去电实现ip拨号 广播接收者
  6. 【Android(安卓)view】获取状态栏高度sta
  7. android测试器
  8. Android(安卓)9Patch图片
  9. Android(安卓)学习
  10. canvas 画一个圆上有 旋转角度 的直线