利用AlarmManager实现闹钟设置

//设置本地闹钟,actiongString:闹钟标识
setLocAlarm(int week, String actionString) { Calendar currentCalendar = Calendar.getInstance();
currentCalendar.setTime(new Date());
int nowWeek = currentCalendar.get(Calendar.DAY_OF_WEEK);
int nowHour = currentCalendar.get(Calendar.HOUR_OF_DAY);
int nowMinute = currentCalendar.get(Calendar.MINUTE); int setHour = mTimePicker.getCurrentHour();
int setMinute = mTimePicker.getCurrentMinute(); Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, week);//星期
calendar.set(Calendar.HOUR_OF_DAY, setHour);//时
calendar.set(Calendar.MINUTE, setMinute);//分
calendar.set(Calendar.SECOND, 0);//秒
//代表设置的的是过去的时间加上7*24*60*60秒
if (week < nowWeek || (week == nowWeek && setHour < nowHour) || (week == nowWeek && setHour == nowHour && setMinute < nowMinute)) {
calendar.add(Calendar.SECOND, 7 * 24 * 60 * 60);
}
Intent intent = new Intent(getActivity(), AlarmService.class);
intent.setAction(actionString); PendingIntent pendingIntent = PendingIntent.getService(getActivity(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
//指定唤醒service
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
//设置准确时间也可以利用manager.setRepeating();设置重复闹钟(时间不准)
manager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); }

2.取消闹钟

//根据表示取消闹钟
void cancelAlarm(String actionString) {
Intent intent = new Intent(getActivity(), AlarmService.class);
intent.setAction(actionString);
PendingIntent pendingIntent = PendingIntent.getService(getActivity(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
}

3.在service中处理闹钟

public class AlarmService extends Service {
public AlarmService() {
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
LogUtil.d("sss","收到了。。action=="+intent.getAction());
// 如果是重复的闹钟就根据当前时间重新设置下
if (needRepeat) {
resetAlarm(intent.getAction());
} Intent intent1 = new Intent();
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//打开闹钟提示activity
intent1.setClass(this, AlarmTipActivity.class); //若果是在前台收到的闹钟消息
if (LHTool.isForeceground(this)) {
intent1.putExtra("fromhead",true);
}else {
intent1.putExtra("fromhead",false);
}
startActivity(intent1);
return super.onStartCommand(intent,flags,startId); }
//重新设置下周当前时间的闹钟
private void resetAlarm(String actionStr){
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.SECOND, 7 * 24 * 60 * 60);
Intent intent = new Intent(this, AlarmService.class);
intent.setAction(actionStr); PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
// manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 7 * 24 * 60 * 60 * 1000, pendingIntent);
manager.setExact(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent); } }

 4.在acitivity中进行相关提示操作


public class AlarmTipActivity extends AppCompatActivity {

    private MediaPlayer mMediaPlayer;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_tip);
AlertDialog.Builder builder = new AlertDialog.Builder(this); final AlertDialog dialog = builder.create();
builder.setMessage("Alarm Clock!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) { dialog.cancel();
Intent intent = getIntent();
//如果不是从前台过来的闹钟就启动MainActivity
if (!intent.getBooleanExtra("fromhead", false)) {
Intent intent1 = new Intent();
intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent1.setClass(AlarmTipActivity.this, MainActivity.class);
startActivity(intent1);
}
finish();
}
});
//点击空白处不可取消alert
builder.setCancelable(false);
builder.show();
wakeUpScreen();
}
@Override
protected void onStart() {
super.onStart();
//确保唤醒后也能播放音乐
playMusic();
} private void playMusic() { mMediaPlayer = MediaPlayer.create(this, LHSharePreferenceTool.getAlarmRing(this));
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.start(); }
/*唤醒屏幕*/
private void wakeUpScreen() {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON|WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
|WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
} @Override
protected void onStop() {
super.onStop();
if (mMediaPlayer != null) { mMediaPlayer.release();
mMediaPlayer = null;
}
}
}

相关权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

Android简单闹钟设置的更多相关文章

  1. Android闹钟设置的解决方案

    Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmMan ...

  2. android 闹钟设置问题

    Android开发中,alarmManager在5.0以上系统,启动时间设置无效的问题 做一个app,需要后台保持发送心跳包.由于锁屏后CPU休眠,导致心跳包线程被挂起,所以尝试使用alarmMana ...

  3. Android系统默认设置

    修改Settings源码,可修改系统设置项,Settings数据被存放于com.android.providers.settings/databases/settings.db中,如果想修改系统启动后 ...

  4. 【Android】 TextView设置个别字体样式

    SpannableString msp = new SpannableString("测试"+XM+"更换当前号码将从手机发送一条普通短信进行验证"); msp ...

  5. Android 编程下设置 Activity 切换动画

    为 Activity 设置切换动画 我们知道,我们可以在 AndroidManifest.xml 文件中,通过 android:theme 属性设置 Activity 的主题.主题中定义了关于 Act ...

  6. Android 小闹钟程序

    最近写了个闹钟的程序,看到SharedPreferences在一个程序中可以共享数据,SharedPreferences是一个轻量级的键值存储机制,只可以存储基本数据类型.我就拿来用用,没想到Shar ...

  7. Android 实现闹钟功能

      原文地址:Android 实现闹钟功能作者:Android_Learners 一.手机闹钟主要用到了AlarmManager类,AlarmManager类提供了访问系统定时服务的途径,开发人员可以 ...

  8. Android开发技巧——设置系统状态栏颜色

    开门见山,先来三张效果图: 然后我们再来讲如何实现以及如何快速地实现. 如何实现 实现设置系统状态栏颜色需要至少在Android 4.4.2(API 19)以上.这是因为,在这个版本以下,没有任何的A ...

  9. 基于Android的闹钟的软件

    一.本课题要求:设计一个基于Android的闹钟的软件. 实现的功能有:能通过界面设置闹钟的启动条件建立后台服务进程,当满足触发条件时,闹钟响应相应事件. 二.需求分析 该课题实现在手机操作系统And ...

随机推荐

  1. RabbitMQ 入门教程(PHP版) 延迟队列,延迟任务

    延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...

  2. 在Django中template遇到 "context must be a dict rather

    原代码: # 使用模板文件 # 1.加载模板文件,获取一个模板文件 temp = loader.get_template('booktest/index.html') # 2.定义模板上下文:给模板文 ...

  3. Ansible-Ad_Hoc临时命令的使用

    Ad_Hoc临时命令的使用 1.使用场景: 所有的临时获取信息的都可以使用,比如节前健康检查.临时更新配置文件. 2.用法: ansible -i 主机 -m 模块 选项 3.常用的命令选项: -v ...

  4. 线性链条件随机场(CRF)的原理与实现

    基本原理 损失函数 (线性链)CRF通常用于序列标注任务,对于输入序列\(x\)和标签序列\(y\),定义匹配分数: \[ s(x,y) = \sum_{i=0}^l T(y_i, y_{i+1}) ...

  5. Java中的IO流之输出流|乐字节

    大家好,乐字节小乐又来了.上一篇给大家带来的是:Java中的IO流之输入流|乐字节,本文将继续讲述IO流之输出流.   一.输出流 1.抽象类:OutputStream 和 Writer Output ...

  6. transform-transition-animation(2)

    transform transform : none | <transform-function> [ <transform-function> ]* 也就是: transfo ...

  7. linux 给运行程序指定动态库路径

    1. 连接和运行时库文件搜索路径到设置 库文件在连接(静态库和共享 库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/li ...

  8. 虚拟机性能监控与故障处理工具(深入理解java虚拟机三)

    JDK自带的工具可以方便的帮助我们处理一些问题,包括查看JVM参数,分析内存变化,查看内存区域,查看线程等信息. 我们熟悉的有java.exe,javac.exe,javap.exe(偶尔用),jps ...

  9. JAVA线程中的发牌题

    发牌题主要考虑的就是线程的问题,一个buffer缓冲区的问题, 首先,发牌的优先级当然是最高的了,但是取牌不能有优先级,否则会一直有牌先取,因此需要一个信号量order,当order=线程的数字时,取 ...

  10. WUSTOJ 1336: Lucky Boy(Java)博弈

    题目链接:1336: Lucky Boy 参考博客:LUCKY BOY 博弈--HandsomeHow Description Recently, Lur have a good luck. He i ...