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"/>

android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动的更多相关文章

  1. android不依赖具体activity弹出Dialog对话框,即全局性对话框

    最近在DialogUtil类中声明了一个静态的弹出Dialog方法,弹出的Dialog也是静态的,并且只在第一次进行创建,由于Dialog弹出依附于Activity,所以就出现了问题. 即:第一次调用 ...

  2. android开发技巧——仿新版QQ锁屏下弹窗

    新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是V ...

  3. Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法

    Android-服务中监听电源键和Home键的广播  http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...

  4. iBeacon在iPhone锁屏下有几率扫描不到蓝牙设备以及折中解决方案

    前言: 这个问题的确困扰了很久,查了国内外各种论坛.社区,都没找到一个有效的解决办法. 所幸后来用一种折中的办法解决了,但也不是从技术根本上解决的,所以有解决的兄弟还望指导下. 正文如下: 一.需求描 ...

  5. Android 底部弹出Dialog(横向满屏)

    项目中经常需要底部弹出框,这里我整理一下其中我用的比较顺手的一个方式(底部弹出一个横向满屏的dialog). 效果图如下所示(只显示关键部分): 步骤如下所示: 1.定义一个dialog的布局(lay ...

  6. ANDROID 通过监听来电去电,并弹出悬浮窗

    要监听android打电话和接电话,有一种的是通过新建一个Receiver继承自BroadcastReceiver. 还有一种也可通过PhoneStateListener来实现.今天就说说后面一种,废 ...

  7. 关于Android 打开新的Activity 虚拟键盘的弹出与不弹出

    关于Android 打开新的Activity 虚拟键盘的弹出与不弹出 打开Activity 时  在相应的情况 弹出虚拟键盘 或者 隐藏虚拟键盘 会给用户非常好的用户体验 , 实现起来也比较简单 只需 ...

  8. MVVM模式下弹出窗体

    原地址:http://www.cnblogs.com/yk250/p/5773425.html 在mvvm模式下弹出窗体,有使用接口模式传入参数new一个对象的,还有的是继承于一个window,然后在 ...

  9. 基于jQuery向下弹出遮罩图片相册

    今天给大家分享一款基于jQuery向下弹出遮罩图片相册.单击相册图片时,一个遮罩层从上到下动画出现.然后弹出显示图片.这款插件适用浏览器:IE8.360.FireFox.Chrome.Safari.O ...

随机推荐

  1. window安装MQTT服务器和client

    http://activemq.apache.org/apollo/download.html  官方下载地址   MQTT目录: MQTT简单介绍 window安装MQTT服务器和client ja ...

  2. 手把手教你在VMware虚拟机中安装Ubuntu14.04系统

    在VMware中创建完虚拟机之后,一般需要给虚拟机安装系统,比较受青睐的系统有Ubuntu和Centos,关于Centos系统的安装之前已经写过了,感兴趣的小伙伴可以戳这篇文章:靠谱的centos7. ...

  3. happy Mom ——php mysqli DES加密

    看完<爱你就像爱生命>这本书,真的看出小波哥很有才,跟小波哥比起来,我唯一拿的出手的可能就是我比他的颜值了.想起一句话,人不是因为美丽而可爱,而是因为可爱而美丽.所以我对我的要求是,继续修 ...

  4. How Javascript works (Javascript工作原理) (十三) CSS 和 JS 动画底层原理及如何优化其性能

    个人总结:读完这篇文章需要20分钟. 这是 JavaScript 工作原理的第十三章. 概述 正如你所知,动画在创建令人叹服的网络应用中扮演着一个关键角色.由于用户越来越注重用户体验,商户开始意识到完 ...

  5. React开发实时聊天招聘工具 -第五章 需求分析

    Axios的使用 axios.get('/data') .then(res=>{ if(res.status==200) this.setState(data:res.data) })

  6. 树莓派开机运行Python脚本 控制LED灯闪烁

    一.新建一个开机运行文件 在 /home/pi/.config 下创建一个文件夹,名称为 autostart,并在该文件夹下创建一个led.desktop文件(文件名以.desktop结尾) 编辑le ...

  7. Linux学习总结(6)——CenterOS7安装mysql5.5的方法

    首先centos7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安 ...

  8. UVA - 10032 Tug of War (二进制标记+01背包)

    Description Problem F: Tug of War A tug of war is to be arranged at the local office picnic. For the ...

  9. RvmTranslator6.4 is released

    RvmTranslator6.4 is released eryar@163.com RvmTranslator can translate the RVM file exported by AVEV ...

  10. linux 进程等待 wait 、 waitpid

    waitpid() 与 wait() 功能相似,都是用户主进程等待子进程结束或中断. 可用于进程之间的同步 wait 函数原型 pid_t wait(int *status); 函数说明 wait() ...