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. Swift学习笔记(14)--方法

    1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...

  2. Linux学习总结(1)——Linux命令大全完整版

    Linux命令大全完整版 目    录I 1. linux系统管理命令1 adduser1 chfn(change finger information)1 chsh(change shell)1 d ...

  3. mongoDB简单介绍及安装

    近期一段时间对mongoDB进行了简单的学习,从它是什么?干什么?怎么用?优缺点?这一系列的疑问到如今可以简单运用.我想须要对其进行简单的总结和概述.那么这一篇就从最基础的開始,对其主要的概念和安装来 ...

  4. Oracle HR 例子用户的建立 10g,11g均可

    Oracle HR 例子用户的建立 10g,11g均可 先将附件(见文章尾部)上的 10 个 .sql 文件放入这个路径中 : $ORACLE_HOME/demo/schema/human_resou ...

  5. hdu 1875 畅通project再续(kruskal算法计算最小生成树)

    畅通project再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. 动态游标(比如表名作为參数)以及动态SQL分析

    表名作为參数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...

  7. [欧拉回路] poj 1386 Play on Words

    题目链接: http://poj.org/problem?id=1386 Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total S ...

  8. 解决 php7 cli 模式下中文乱码的两中方法

    解决 php7 cli 模式下中文乱码的两中方法1. 给PHP文件开头加上 exec('chcp 936'); 然后把该文件以 ANSI 格式编码2. 在 php.ini 中设置 default_ch ...

  9. html元素的分类有哪些?

    今天零度给大家讲一下基本的html元素分类: HTML元素的分类其实主要有两种元素构成——块级元素和内联元素. html元素的分类有块级元素和行内元素 一.块级元素(block)的特点: 1.总是在新 ...

  10. 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序

    原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ...