定时弹出 demo ,代码如下:

1.MainActivity.java

public class MainActivity extends Activity implements OnClickListener {
private static Context sContext = null;
private EditText date;
private EditText time;
private Button btn;
private Date_TimeUtil dtUtil;
private String mTime;
private String mDate;
private LinearLayout llDate;
private LinearLayout llTime; public static Context getContext() {
return sContext;
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sContext = this;
dtUtil = new Date_TimeUtil(this);
initView();
init();
} private void initView() {
date = (EditText) findViewById(R.id.date);
time = (EditText) findViewById(R.id.time);
btn = (Button) findViewById(R.id.btn); llDate = (LinearLayout) findViewById(R.id.ll_date);
llTime = (LinearLayout) findViewById(R.id.ll_time);
} private void init() {
//date.setOnClickListener(this);
//time.setOnClickListener(this);
btn.setOnClickListener(this);
llDate.setOnClickListener(this);
llTime.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_date:
dtUtil.setDate(date); break;
case R.id.ll_time:
dtUtil.setTime(time); break;
case R.id.btn:
mDate = date.getText().toString();
mTime = time.getText().toString();
Log.e("xx","日期= "+mDate+" 时间= "+mTime);
if(TextUtils.isEmpty(mDate)){
Toast.makeText(getApplicationContext(), "请选择提醒日期", 0).show();
break;
}else if(TextUtils.isEmpty(mTime)){
Toast.makeText(getApplicationContext(), "请选择提醒时间", 0).show();
break;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date;
long value = 0;
String str_date = mDate+" "+mTime;
try {
date = sdf.parse(str_date);
value = date.getTime();
System.out.println("当前设置时间:"+value);
} catch (ParseException e) {
e.printStackTrace();
}
Log.e("str_date=",str_date);
Log.e("value=",value+"");
long value2 = System.currentTimeMillis();
if(value<=value2){
Toast.makeText(getApplicationContext(), "选择时间不能小于当前系统时间", 0).show();
return;
}
int delaytime = (int)(value - value2);
AlarmService.addNotification(delaytime,"tick","title","text");
break;
}
} }

2. 服务类

@SuppressLint("NewApi")
public class AlarmService extends Service { static Timer timer = null; // 清除通知
public static void cleanAllNotification() {
NotificationManager mn = (NotificationManager) MainActivity
.getContext().getSystemService(NOTIFICATION_SERVICE);
mn.cancelAll();
if (timer != null) {
timer.cancel();
timer = null;
}
} // 添加通知
public static void addNotification(int delayTime, String tickerText,
String contentTitle, String contentText) {
Intent intent = new Intent(MainActivity.getContext(),
AlarmService.class);
intent.putExtra("delayTime", delayTime);
intent.putExtra("tickerText", tickerText);
intent.putExtra("contentTitle", contentTitle);
intent.putExtra("contentText", contentText);
MainActivity.getContext().startService(intent);
} public void onCreate() {
Log.e("addNotification", "===========create=======");
} @Override
public IBinder onBind(Intent intent) {
return null;
} public int onStartCommand(final Intent intent, int flags, int startId) { long period = 24 * 60 * 60 * 1000; // 24小时一个周期
int delay = intent.getIntExtra("delayTime", 0);
if (null == timer) {
timer = new Timer();
}
timer.schedule(new TimerTask() { @Override
public void run() {
NotificationManager mn = (NotificationManager) AlarmService.this
.getSystemService(NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(
AlarmService.this); Intent notificationIntent = new Intent(AlarmService.this,
MainActivity.class);// 点击跳转位置
PendingIntent contentIntent = PendingIntent.getActivity(
AlarmService.this, 0, notificationIntent, 0);
builder.setContentIntent(contentIntent);
builder.setSmallIcon(R.drawable.ic_launcher);// 设置通知图标
builder.setTicker(intent.getStringExtra("tickerText")); // 测试通知栏标题
builder.setContentText(intent.getStringExtra("contentText")); // 下拉通知啦内容
builder.setContentTitle(intent.getStringExtra("contentTitle"));// 下拉通知栏标题
builder.setAutoCancel(true);// 点击弹出的通知后,让通知将自动取消
builder.setVibrate(new long[] { 0, 2000, 1000, 4000 }); // 震动需要真机测试-延迟0秒震动2秒延迟1秒震动4秒
// builder.setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,
// "5"));//获取Android多媒体库内的铃声
// builder.setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
// ;//自定义铃声
builder.setDefaults(Notification.DEFAULT_ALL);// 设置使用系统默认声音
// builder.addAction("图标", title, intent); //此处可设置点击后 打开某个页面
Notification notification = builder.build();
notification.flags = notification.FLAG_INSISTENT;// 声音无限循环
mn.notify((int) System.currentTimeMillis(), notification);
}
}, delay, period); return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
Log.e("addNotification", "===========destroy=======");
super.onDestroy();
}
}

3.配置文件

<!-- 震动权限 -->
<uses-permission android:name="android.permission.VIBRATE" /> <service
android:name=".AlarmService"
android:enabled="true"
android:process="system" >
</service>

4.日期工具类 和布局

public class Date_TimeUtil {
private Calendar calendar = Calendar.getInstance();;
private int mYear, mMonth, mDay;
private int mHour;
private Integer mMinute;
private Context context; public Date_TimeUtil(Context context) {
this.context = context;
}
public void setTime(final EditText time) {
// 点击"时间"按钮布局 设置时间
time.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 自定义控件
AlertDialog.Builder builder = new AlertDialog.Builder(context);
View view = (LinearLayout) View.inflate(context,
R.layout.time_dialog, null);
final TimePicker timePicker = (TimePicker) view
.findViewById(R.id.time_picker);
// 初始化时间
calendar.setTimeInMillis(System.currentTimeMillis());
timePicker.setIs24HourView(true);
timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(Calendar.MINUTE);
// 设置time布局
builder.setView(view);
builder.setTitle("设置时间信息");
builder.setPositiveButton("确 定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
mHour = timePicker.getCurrentHour();
mMinute = timePicker.getCurrentMinute();
// 时间小于10的数字 前面补0 如01:12:00
time.setText(new StringBuilder()
.append(mHour < 10 ? "0" + mHour
: mHour)
.append(":")
.append(mMinute < 10 ? "0" + mMinute
: mMinute).append(":00"));
dialog.cancel();
}
});
builder.setNegativeButton("取 消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
});
builder.create().show();
}
});
} public void setDate(final EditText date) {
// 点击"日期"按钮布局 设置日期
date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 通过自定义控件AlertDialog实现
AlertDialog.Builder builder = new AlertDialog.Builder(context);
View view = (LinearLayout) View.inflate(context,
R.layout.date_dialog, null);
final DatePicker datePicker = (DatePicker) view
.findViewById(R.id.date_picker);
// 设置日期简略显示 否则详细显示 包括:星期\周
datePicker.setCalendarViewShown(false);
// 初始化当前日期
calendar.setTimeInMillis(System.currentTimeMillis());
datePicker.init(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), null);
// 设置date布局
builder.setView(view);
builder.setTitle("设置日期信息");
builder.setPositiveButton("确 定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// 日期格式
StringBuffer sb = new StringBuffer();
sb.append(String.format("%d-%02d-%02d",
datePicker.getYear(),
datePicker.getMonth() + 1,
datePicker.getDayOfMonth()));
date.setText(sb);
// 赋值后面闹钟使用
mYear = datePicker.getYear();
mMonth = datePicker.getMonth();
mDay = datePicker.getDayOfMonth();
dialog.cancel();
}
});
builder.setNegativeButton("取 消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
});
builder.create().show();
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dip" > <DatePicker
android:datePickerMode="spinner"
android:calendarViewShown="false"
android:id="@+id/date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center" >
</DatePicker> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dip" > <TimePicker
android:timePickerMode="spinner"
android:id="@+id/time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center" >
</TimePicker> </LinearLayout>

最后上个图吧

android 定时提醒 - Notification的更多相关文章

  1. Android 每天定时提醒功能实现

    android要实现定时的功能那肯定就要用到闹铃相关的技术, 那么android闹铃实现是基于 AlarmManager 这个类的,首先我们来看一下它的几个主要的方法. 打开AlarmManager的 ...

  2. Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)

    示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我 ...

  3. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...

  4. Android -- 再来一发Notification

    之前写过一个Notificaiton的文章,用上面的方式去操作也是OK的,但是到后面的SDK之后,有些方法被弃用,甚至我到SDK23的时候,我发现有些方法直接没了,所以在这里重新写一下最新的用法. h ...

  5. 小米开源便签Notes-源码研究(2)-定时提醒的便签

    本篇讲述小米便签中的定时提醒功能.  便签,可以理解为一件事情,一项任务,有个定时提醒的功能,还是蛮不错的~    小米便签定时功能,是当编辑便签的时候,有个菜单项,选了之后,就弹出一个"日 ...

  6. Android中使用Notification实现进度通知栏(Notification示例三)

    我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...

  7. Android中使用Notification实现宽视图通知栏(Notification示例二)

    Notification是在你的应用常规界面之外展示的消息.当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏.要查看消息的详情需要进入通知抽屉(notificationdrawer) ...

  8. 巧用Windows 7计划任务设置定时提醒

    Windows 7系统有个“计划任务”功能,一般人都很少使用.其实,“计划任务”是系统自带的一个很实用的功能,比如说,这个功能可以设置定时提醒,这样在使用电脑时就不会因为太过投入而导致错过重要的事务. ...

  9. [Deepin 15] 安装 Java 8、Git、Firefox、SafeEyes(定时提醒休息工具)

    一.安装 JDK 8 1.到官网,用 迅雷下载 安装包 (jdk-8u131-linux-x64.tar.gz) 2.解压放到目录 /opt/software/jdk 3.配置环境变量 sudo vi ...

随机推荐

  1. mysql中防止sql注入

    什么是sql注入 图片来源:百度百科 python 操作mysql产生sql注入问题 不用ORM框架,框架中已经集成了防范sql注入的功能,使用pymysql实践一下: # 导入pymysql模块 i ...

  2. pyinstaller打包django项目成exe以及遇到的一些问题

    1. 环境 环境为:win7 + Python3.6 + Django (2.1.10) + PyInstaller (3.5) 注意: 这里的PyInstaller,笔者是直接使用pip安装,中间会 ...

  3. Python 字符串的所有方法详解

    name = "my name is {name} and my age is {age}" # 首字母大写 name.capitalize() # 统计某个字符的个数 name. ...

  4. react native https

    1. ios解决方案 1.1 Xcode打开工程,Libraries -> RCTNetworking -> RCTHTTPRequestHandler.mm -> #pragma ...

  5. 小白系统篇-windows 系统安装

    现阶段装系统的方法基本有几种1.硬盘安装2.光驱安装3.PE(u盘即可)安装 现在比较主流方便的用pe安装,所以我们这边就说一下PE安装系统的方法 首先我们了解下系统镜像,也就是你装系统所需得到文件( ...

  6. 集群、限流、缓存 BAT 大厂无非也就是这么做

    前言 前阵子有网友询问,如何优化网站?这个问题真的很大,跟他简单的聊了一下,随便说了几点,觉得有必要整理一篇文章出来,正好前阵子在做爬虫博客,于是把大体思路分享出来,与大家互通有无,共同进步. 优化 ...

  7. 马蜂窝视频编辑框架设计及在 iOS 端的业务实践

    (马蜂窝技术公众号原创内容,ID: mfwtech) 熟悉马蜂窝的朋友一定知道,点击马蜂窝 App 首页的发布按钮,会发现发布的内容已经被简化成「图文」或者「视频」. 长期以来,游记.问答.攻略等图文 ...

  8. Ajax数据解析格式

    Ajax数据解析格式 一.前言 在服务器端 AJAX 是一门与语言无关的技术.在业务逻辑层使用何种服务器端语言都可以. 从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送.服务器端的编 ...

  9. 17_defer(延迟调用)关键字的使用

    1.defer是延迟调用关键字,只能在函数内部使用 2.总是在main函数结束前调用(和init用法相对) 3.如果有多个defer 遵循先进后出的原则 4.和匿名函数同时使用时,如果匿名函数带有参数 ...

  10. C++ 并发编程之互斥锁和条件变量的性能比较

    介绍 本文以最简单生产者消费者模型,通过运行程序,观察该进程的cpu使用率,来对比使用互斥锁 和 互斥锁+条件变量的性能比较. 本例子的生产者消费者模型,1个生产者,5个消费者. 生产者线程往队列里放 ...