定时弹出 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. [原创实践]redhat linux 5.3搭建Nexus

    1:下载安装JDK,配置好环境变量(JAVA_HOME等) 下载linux下64位的jdk-7u45-linux-x64.tar.gz(百度网盘下载,官网的jdk-7u51-linux-x64.tar ...

  2. [android视频教程] 传智播客android开发视频教程

    本套视频共有67集,是传智播客3G-Android就业班前8天的的课程量.本套视频教程是黎活明老师在2011年底对传智播客原来的Android核心基础课程精心重新录制的,比早期的Android课程内容 ...

  3. if else 深度优化

    一. if else表达式过于复杂 if ((condition1 && condition2 ) || ((condition2 || condition3) && ...

  4. Appium+python自动化(三十二)- 代码写死一时爽,框架重构火葬场 - PageObject+unittest(超详解)

    简介 江湖有言:”代码写死一时爽,框架重构火葬场“,更有人戏言:”代码动态一时爽,一直动态一直爽

  5. html5 placeholder属性兼容ie11

    placeholder 属性是html5的属性,用于提供描述输入字段预期值的提示信息(hint). 简单例子: <!DOCTYPE HTML> <html> <body& ...

  6. vscode 支持 threejs 的智能提示

    VSCode Typings and Intellisense: Dummy Learning VS-Code 1 Jun 20, 2016 Updated on Jun 20 2016 for 1. ...

  7. Element-UI 2.4.11 版本 使用注意(发现一点更新一点)

    1.$Vue.$refs.addForm.resetFields() 的resetFields()方法重置到默认值并不是 ,你在form绑定对象上写的默认值 ,而是这个form被渲染出来之后第一次赋到 ...

  8. Python程序包的构建和发布过程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  9. 打印机服务配置篇WindowsServer2008

    本次配置Server2008 打印服务器    目的实现Kingdee远程打印服务,直接在金蝶客户端部署打印机服务器 服务器角色: --打印服务器 --LPD服务 --Internet打印 *打印服务 ...

  10. CNN卷积中多通道卷积的参数问题

    通俗来讲参数[5,5,3,16],就是用16个卷积核的每一个,分别对3通道进行对应位置,对应3通道的乘积,再加和,输出作为一个输出核的对应位置,知道16个核全部完成. 下图是一个3d的RGB效果,每个 ...