android 定时提醒 - Notification
定时弹出 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的更多相关文章
- Android 每天定时提醒功能实现
android要实现定时的功能那肯定就要用到闹铃相关的技术, 那么android闹铃实现是基于 AlarmManager 这个类的,首先我们来看一下它的几个主要的方法. 打开AlarmManager的 ...
- Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)
示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我 ...
- 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)
汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...
- Android -- 再来一发Notification
之前写过一个Notificaiton的文章,用上面的方式去操作也是OK的,但是到后面的SDK之后,有些方法被弃用,甚至我到SDK23的时候,我发现有些方法直接没了,所以在这里重新写一下最新的用法. h ...
- 小米开源便签Notes-源码研究(2)-定时提醒的便签
本篇讲述小米便签中的定时提醒功能. 便签,可以理解为一件事情,一项任务,有个定时提醒的功能,还是蛮不错的~ 小米便签定时功能,是当编辑便签的时候,有个菜单项,选了之后,就弹出一个"日 ...
- Android中使用Notification实现进度通知栏(Notification示例三)
我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...
- Android中使用Notification实现宽视图通知栏(Notification示例二)
Notification是在你的应用常规界面之外展示的消息.当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏.要查看消息的详情需要进入通知抽屉(notificationdrawer) ...
- 巧用Windows 7计划任务设置定时提醒
Windows 7系统有个“计划任务”功能,一般人都很少使用.其实,“计划任务”是系统自带的一个很实用的功能,比如说,这个功能可以设置定时提醒,这样在使用电脑时就不会因为太过投入而导致错过重要的事务. ...
- [Deepin 15] 安装 Java 8、Git、Firefox、SafeEyes(定时提醒休息工具)
一.安装 JDK 8 1.到官网,用 迅雷下载 安装包 (jdk-8u131-linux-x64.tar.gz) 2.解压放到目录 /opt/software/jdk 3.配置环境变量 sudo vi ...
随机推荐
- mui的app页面使用layui填充数据
在mui的开发中有个坑,mui.plusReady在web上使用时是不会起作用的,只能在app上才行,所以推荐自己测试时使用mui.ready去写加载时的方法. 前端请求的返回格式为json,所以在后 ...
- Java 安全之:csrf攻击总结
最近在维护一些老项目,调试时发现请求屡屡被拒绝,仔细看了一下项目的源码,发现有csrf token校验,借这个机会把csrf攻击学习了一下,总结成文.本文主要总结什么是csrf攻击以及有哪些方法来防范 ...
- MVC+EF Core 完整教程20--tag helper详解
之前我们有一篇:“动态生成多级菜单”,对使用Html Helper做了详细讲述,并且自定义了一个菜单的 Html Helper: https://www.cnblogs.com/miro/p/5541 ...
- jquery验证大全
jQuery验证及限制 绑定键盘监听事件 $(document).on("keypress", ".txt-valid-len", function (e) { ...
- 【干货】基于镜像部署的Gitlab-CI/CD实践和坑位指南
引言 看过前文的博友可能注意到我是把 部署dll文件拷贝到生产机器,之后在生产机器上使用docker-compose即时创建镜像, 并没有完成CI/CD, 只是在原来传统部署方式下 将部署文件容器化. ...
- 逆向破解之160个CrackMe —— 014
CrackMe —— 014 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 性能测试学习第三天-----loadrunner接口测试&中文乱码处理
loadrunner 接口测试: get.post(3种参数格式).cookie及token处理.加密接口.webservice.socket.文件上传接口.文件下载接口 & 中 ...
- Liunx软件安装之Tomcat
一.Tomcat 安装 1.1 yum 安装 1) 安装 tomcat 基础服务 sudo yum -y install tomcat 2) 安装管理界面 sudo yum -y install to ...
- 读书分享全网学习资源大合集,推荐Python3标准库等五本书「02」
0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code使 ...
- Python Web Flask源码解读(四)——全局变量
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...