今天实现一个具有闹钟功能的消息栏通知,即定时向消息栏推送通知,用户下拉通知栏列表,点击通知后,跳转到指定界面,效果图如下:
收到通知界面:
实现过程如下:
(1)闹钟主界面:
package com.example.alarmmanagerdemo; import java.util.Calendar; import java.util.TimeZone; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.os.SystemClock; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TimePicker; import android.widget.Toast; /** * * @ClassName: MainActivity * @Description: 主界面 * @author HuHood * @date 2013-11-25 下午4:01:19 * */ public class MainActivity extends Activity { private static final String TAG = MainActivity.class.getSimpleName(); private TimePicker mTimePicker; private Button mButton1; private Button mButton2; private Button mButtonCancel; private int mHour = -1; private int mMinute = -1; public static final long DAY = 1000L * 60 * 60 * 24; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取当前时间 Calendar calendar = Calendar.getInstance(); calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); if(mHour == -1 && mMinute == -1) { mHour = calendar.get(Calendar.HOUR_OF_DAY); mMinute = calendar.get(Calendar.MINUTE); } /** * 时间日期控件 */ mTimePicker = (TimePicker)findViewById(R.id.timePicker); mTimePicker.setCurrentHour(mHour); mTimePicker.setCurrentMinute(mMinute); mTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { mHour = hourOfDay; mMinute = minute; } }); /** * 设置简单闹铃(当前时间的10S后就闹) */ mButton1 = (Button)findViewById(R.id.normal_button); mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); intent.setAction(Constants.ALARM_ACTION);//指定一下广播类型 PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // 过10s 执行这个闹铃 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); calendar.add(Calendar.SECOND, 10);//当前时间加10s // 进行闹铃注册 AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE); manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); Toast.makeText(MainActivity.this, "设置简单闹铃成功,10秒后闹铃!", Toast.LENGTH_LONG).show(); } }); /** * 设置重复闹铃(指定时间重复闹) */ mButton2 = (Button)findViewById(R.id.repeating_button); mButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); intent.setAction(Constants.ALARM_ACTION);//指定一下广播类型 PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); long firstTime = SystemClock.elapsedRealtime(); // 开机之后到现在的运行时间(包括睡眠时间) long systemTime = System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 这里时区需要设置一下,不然会有8个小时的时间差 calendar.set(Calendar.MINUTE, mMinute); calendar.set(Calendar.HOUR_OF_DAY, mHour); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); // 选择的每天定时时间 long selectTime = calendar.getTimeInMillis(); // 如果当前时间大于设置的时间,那么就从第二天的设定时间开始 if(systemTime > selectTime) { Toast.makeText(MainActivity.this, "设置的时间小于当前时间", Toast.LENGTH_SHORT).show(); calendar.add(Calendar.DAY_OF_MONTH, 1); selectTime = calendar.getTimeInMillis(); } // 计算现在时间到设定时间的时间差 long time = selectTime - systemTime; firstTime += time; // 进行闹铃注册 AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE); manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000, sender); Log.i(TAG, "time ==== " + time + ", selectTime ===== " + selectTime + ", systemTime ==== " + systemTime + ", firstTime === " + firstTime); Toast.makeText(MainActivity.this, "设置重复闹铃成功,每天定时闹铃! ", Toast.LENGTH_LONG).show(); } }); /** * 取消闹铃 */ mButtonCancel = (Button)findViewById(R.id.cancel_button); mButtonCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // 取消闹铃 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); am.cancel(sender); } }); } }
(2)广播接收器:
package com.example.alarmmanagerdemo; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; /** * * @ClassName: AlarmReceiver * @Description: 闹铃时间到了会进入这个广播,这个时候可以做一些该做的业务。 * @author HuHood * @date 2013-11-25 下午4:44:30 * */ public class AlarmReceiver extends BroadcastReceiver { private String TAG = getClass().getName(); /** * 是具体的状态栏通知对象,可以设置icon、文字、提示声音、振动等等参数。 */ private Notification notification; /** * 状态栏通知的管理类,负责发通知、清楚通知等,是一个系统Service,必须通过 getSystemService()方法来获取。 */ private NotificationManager nmManager; private static final int ID=1; @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "闹铃响了, 可以做点事情了~~", Toast.LENGTH_LONG).show(); String action = intent.getAction(); Log.d(TAG , "闹铃,action====>" + action); if(Constants.ALARM_ACTION.equals(action)){//过滤一下广播类型 /** * 这里接收到闹钤事件后,进行如下操作: * 获取到通知管理器然后新建一个通知,然后发送这个通知! * * (可以在百度上搜索“状态栏通知Notification、NotificationManager详解”解读更多内容) * * 用户也可以根据需要自行定义操作的事件 */ nmManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE); /** * Notification notification = new Notificatio(drawable,tickerText,System.currentTimeMillis()); * * 其中第一个参数代表图标 * 第二个参数代表提示的内容 * 第三个参数是指要显示的时间,一般是当即显示,故填入系统当前时间。 */ String tickerText ="Test Notification"; notification = new Notification(R.drawable.chicken,tickerText,System.currentTimeMillis()); /** * 设定声音 ,使用系统的消息通知声音 */ notification.defaults |= Notification.DEFAULT_SOUND; Intent temp = new Intent(context,SecondActivity.class); PendingIntent pi = PendingIntent.getActivity(context, 0, temp, 0); notification.setLatestEventInfo(context, "通知栏title", "通知栏content", pi); nmManager.notify(ID,notification); } } }
(3)点击通知后跳转的测试界面:
package com.example.alarmmanagerdemo; import android.app.Activity; import android.os.Bundle; public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } }
(4)常量类:
package com.example.alarmmanagerdemo; /** * 常量 * * @author chenwenbiao * @date 2014-6-12 下午1:19:23 * @version V1.0 */ public class Constants { public static final String ALARM_ACTION = "com.example.alarmmanagerdemo.alarmAction"; }
(5) 布局文件activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TimePicker android:id="@+id/timePicker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/normal_button" android:layout_marginTop="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/timePicker" android:text="设置简单闹铃" /> <Button android:id="@+id/repeating_button" android:layout_marginTop="20dp" android:layout_marginLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/timePicker" android:layout_toRightOf="@id/normal_button" android:text="设置重复闹铃" /> <Button android:id="@+id/cancel_button" android:layout_marginTop="20dp" android:layout_marginLeft="-50dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/repeating_button" android:layout_toRightOf="@id/normal_button" android:text="取消闹铃" /> </RelativeLayout>
(6) 测试界面布局activity_second.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击通知栏跳转过来的界面" /> </RelativeLayout>
(7) AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.alarmmanagerdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.alarmmanagerdemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 广播接收器 --> <receiver android:name="com.example.alarmmanagerdemo.AlarmReceiver" android:process=":remote"/> <activity android:name="com.example.alarmmanagerdemo.SecondActivity" android:screenOrientation="portrait" /> </application> </manifest>
参考如下文章进行修改的:
相关推荐
这包括时间选择器(DatePicker和TimePicker)、开关按钮(Switch)以及添加、删除和编辑闹钟的功能按钮。使用RecyclerView或ListView可以展示已设置的闹钟列表。 6. **数据存储**: 为了保存用户的闹钟设置,通常...
在Android系统中,消息推送通知栏是用户与应用进行交互的重要途径之一,它允许应用程序在后台向用户显示重要信息,即使用户并未直接运行该应用。本文将深入探讨Android消息推送通知栏的工作原理、实现方式以及相关...
这个"最全的Notifications通知栏"项目提供了一个全面的示例集合,可以帮助开发者理解和掌握如何有效地使用Android的通知功能。 通知(Notification)在Android中扮演着与用户沟通的关键角色,即使应用在后台运行...
此外,为了确保用户不遗漏任何提醒,可能会有通知栏提示、震动、铃声等多种提醒方式。 至于更换图片背景,这是提高用户体验的一个常见设计。开发者可以提供一个内置的图片库,或者允许用户从设备相册中选择图片。这...
- **第三方应用**:除了系统自带的时钟和闹钟,Windows Store中还有许多第三方应用,提供了更丰富的功能和个性化选项,例如高级的计时器、倒计时、睡眠模式等,满足不同用户的需求。 总结来说,Windows 10 LTSC的...
综上所述,`AlarmManager`结合BroadcastReceiver和Notification可以实现多个闹钟的添加、取消以及通知栏提醒功能。在实际开发中,需要考虑到不同Android版本的兼容性问题,并优化闹钟的设置策略以避免对用户电池的...
【安卓记事本闹铃提醒】是一个基于Android SDK版本18的项目,旨在提供一个集记事和闹钟提醒功能于一体的安卓应用。在Eclipse集成开发环境中,开发者可以轻松导入此项目并进行编译运行,以体验或进一步定制这个功能。...
在Android开发中,创建闹钟和通知栏提醒是常见的功能需求。`AlarmManager`和`NotificationManager`是Android SDK提供的重要组件,用于实现这些功能。下面将详细讲解如何使用这两个组件。 **1. AlarmManager** `...
4. **通知栏通知**: - 当闹钟触发时,通常会使用NotificationCompat.Builder创建一个通知,展示在通知栏上,提醒用户有闹钟响起。 - 可以设置通知的图标、标题、内容,以及点击通知后的操作(如暂停、关闭闹钟)...
- Xcode是iOS开发的主要工具,包含了创建和调试本地通知所需的所有功能。此外,`UserNotifications`框架提供了必要的API来处理本地通知。 总之,本地通知是iOS应用与用户进行交互的重要手段,无论是在设定的特定...
通过深入研究这个源码,开发者可以学习到如何在Android应用中实现完整的闹钟功能,包括界面交互、用户输入处理、系统服务交互以及权限管理等多个方面,这对于理解Android系统的运行机制和提升编程技能非常有帮助。...
3. **Notification**:闹钟响起时,通常会通过通知栏提醒用户。开发者需要使用NotificationCompat.Builder来构建通知,并设置相应的通知行为,如取消闹钟、 snooze等。 4. **Service**:如果闹钟需要在后台持续运行...
- **通知机制**:闹钟触发后,可以通过弹出对话框、播放声音或闪烁任务栏图标等方式通知用户。 5. **用户界面** - **控件使用**:在MFC中,我们可以使用CButton、CEdit、CDateTimePicker等控件来创建用户界面,...
TinyNoty是一款针对Android平台设计的轻量级通知栏备忘工具,它的主要功能是帮助用户在手机的通知栏快速创建和管理便捷的备忘录。这个应用非常适合那些需要频繁记录临时事项或者提醒自己的用户,无需打开复杂的笔记...
6. **Notifications**:安卓系统的通知系统允许应用在状态栏显示消息,并在用户解锁设备后提供详细信息。在闹钟提醒中,通知是与用户交互的关键部分。 7. **UI设计**:用户界面(UI)设计包括布局、颜色、字体等...
3. **任务栏图标集成**:闹钟程序能在任务栏上显示图标并响应右键菜单,这需要理解Windows消息循环和图标通知区域的API,如Shell_NotifyIcon()函数来管理托盘图标。 4. **定时提醒功能**:闹钟的核心功能是定时触发...
当闹钟响起时,应用需要通过NotificationManager向用户发送通知,这通常伴随着声音、震动和状态栏提示。通知的配置包括设置图标、标题、内容、优先级等属性,以确保用户能够及时注意到。 此外,应用可能还需要提供...
这个demo提供了完整的闹钟功能实现,包括闹钟的创建、音乐设置、通知展示以及魅族手机的适配。对于初学者和有经验的开发者来说,都是一个很好的学习资源,可以加深对Android系统服务、广播接收器和多媒体播放的理解...
对于通知,Android的通知系统需要被正确地集成,确保闹钟触发时能够在状态栏显示通知,并提供操作选项。开发者还需要处理权限问题,比如访问用户的媒体库、接收广播以及保持后台运行的能力。 最后,测试是确保应用...