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

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配置:如

<receiver android:name=".CallAlarmReceiver" android:process=":remote" />

2、广播接收器:

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

public class CallAlarmReceiver extends BroadcastReceiver {

@Override
public 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不会出错。

   @Override
protected 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()中释放,否则会出错。

@Override
protected void onResume() {
    super.onResume();
    // 唤醒屏幕
    acquireWakeLock();
}

@Override
protected 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加上权限

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
原文地址:https://www.cnblogs.com/Free-Thinker/p/6704760.html