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 ...
随机推荐
- Java虚拟机——Java内存区域
1.运行时区域 Java虚拟机在执行Java程序的时候会把它管理的内厝划分为若干个不同功能的数据区域,如图所示 首先是程序计数器,程序计数器可以理解为当前程序执行的字节码的行号指示器,计数器中的数据即 ...
- 【0725 | Day 1】计算机编程/计算机组成原理/计算机操作系统
什么是编程 编程语言:人与计算机交流的手段 编程:通过编程语言编写文件 学习编程的目的:让计算机代替人力,为我们服务 计算机组成原理 计算机由五大部分组成:控制器.运算器.存储器.输入设备.输出设备. ...
- 「雕爷学编程」Arduino动手做(9)——火焰传感器模块
37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...
- 并发模型与IO模型梳理
并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见.由于go语言的兴起,CSP模型也越来越受关注.基于锁的共享内存模型 ...
- Yii2 登录报错
当用数据库登录系统报如下错误时 PHP Recoverable Error – yii\base\ErrorException Argument 1 passed to yii\web\User::l ...
- java 计算器
初识java:利用swing制作一个简单的计算器,仿造window10内置计算器标准模式下的界面. 涉及学习内容: 设置窗口 设计界面按键 设置文本框:只读 String字符串操作:与double类型 ...
- hive explode 行拆列
创建一张表test_explode,表结构如下 表数据如下: 1.使用explode函数 select explode(friends) as friend from test_explode; 但是 ...
- Hive 窗口分析函数
1.窗口函数 1.LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值 第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值 ...
- Spring Boot 与 Mybatis、Mysql整合使用的例子
第一步: 创建一个SpringBoot的工程,在其中的Maven依赖配置中添加对JDBC.MyBatis.Mysql Driver的依赖具体如下: <!-- JDBC --> <de ...
- win10下配置chromedrive。
0x01:查看自己chrome的版本号 点击chrome右上角菜单栏,帮助,关于Google chrome,在这里,你可以看到自己chrome的版本号. 0x02:下载对应的chrome drive ...