在app未开启时,实现对用户进行通知提醒功能总结(添加事件到手机系统日历并设置闹钟提醒)
2017-02-13 12:47
1536 查看
最近在做项目遇到一个需求,在app未开启时,能够对用户进行通知提醒明天有培训课需要参加。最开始想到可以用第三方实现推送,如极光推送、融云推送等,但是这些推送的原理都是采用的长连接,仅仅当你的app在开启状态并且没有被结束进程时才能接收到推送通知,所以并不能实现想要的效果。偶然在玩蘑菇街app的时候发现了它里面有一个抢购提醒功能,原理就是把抢购事件添加到手机系统日历事件中并设置闹钟提醒,这样就保证在你的app被后台杀死后也能在指定的时间做到提醒功能。受到这个的启示,就把想要进行通知的事件添加到手机系统日历中。下面是部分代码。
private static String CALANDER_URL = "content://com.android.calendar/calendars"; private static String CALANDER_EVENT_URL = "content://com.android.calendar/events"; private static String CALANDER_REMIDER_URL = "content://com.android.calendar/reminders"; private static String CALENDARS_NAME = "Mytest"; private static String CALENDARS_ACCOUNT_NAME = "mytest"; private static String CALENDARS_ACCOUNT_TYPE = "calender.test"; private static String CALENDARS_DISPLAY_NAME = "Mytest"; //检查是否有现在存在的账户。存在则返回账户id,否则返回-1 private static int checkCalendarAccount(Context context) { Cursor userCursor = context.getContentResolver().query(Uri.parse(CALANDER_URL), null, null, null, null); try { if (userCursor == null) { return -1; } else { int count = userCursor.getCount(); if (count > 0) { //存在现有账户,取第一个账户的id返回 userCursor.moveToFirst(); return userCursor.getInt(userCursor.getColumnIndex(CalendarContract.Calendars._ID)); } else { return -1; } } } finally { if (userCursor != null) { userCursor.close(); } } } //添加日历账户 private static long addCalendarAccount(Context context) { TimeZone timeZone = TimeZone.getDefault(); ContentValues values = new ContentValues(); values.put(CalendarContract.Calendars.NAME, CALENDARS_NAME); values.put(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_DISPLAY_NAME); values.put(CalendarContract.Calendars.VISIBLE, 1); values.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.BLUE); values.put(CalendarContract.Calendars.SYNC_EVENTS, 1); values.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, timeZone.getID()); values.put(CalendarContract.Calendars.OWNER_ACCOUNT, CALENDARS_ACCOUNT_NAME); values.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 0); Uri calendarUri = Uri.parse(CALANDER_URL); calendarUri = calendarUri.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true").appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME).appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE).build(); Uri result = context.getContentResolver().insert(calendarUri, values); long id = result == null ? -1 : ContentUris.parseId(result); return id; } //检查是否已经添加了日历账户,如果没有添加先添加一个日历账户再查询 private static int checkAndAddCalendarAccount(Context context) { int oldId = checkCalendarAccount(context); if (oldId >= 0) { return oldId; } else { long addId = addCalendarAccount(context); if (addId >= 0) { return checkCalendarAccount(context); } else { return -1; } } } //添加日历事件 public static void addCalenderEvent(Context context, String title, String description, long beginTime) { //获取日历账户的id int calId = checkAndAddCalendarAccount(context); if (calId < 0) { //获取日历账户id失败,直接返回,添加日历事件失败 Log.d("tag","添加失败!"); return; } ContentValues values = new ContentValues(); values.put("title", title); values.put("description", description); values.put("calendar_id", calId); Calendar mCalendar = Calendar.getInstance(); mCalendar.setTimeInMillis(beginTime); //设置开始时间 long start = mCalendar.getTime().getTime(); mCalendar.setTimeInMillis(start + ONE_HOUR);//设置终止时间 long end = mCalendar.getTime().getTime(); values.put(CalendarContract.Events.DTSTART, start); values.put(CalendarContract.Events.DTEND, end); values.put(CalendarContract.Events.HAS_ALARM, true);//设置有闹钟提醒 values.put(CalendarContract.Events.EVENT_TIMEZONE, "Asia/Shanghai"); //这个是时区,必须有 values.put(CalendarContract.Events.STATUS,1); Uri newEvent = context.getContentResolver().insert(Uri.parse(CALANDER_EVENT_URL), values); if (newEvent == null) { //添加日历事件失败直接返回 Log.d("tag","添加失败!"); return; } ContentValues values1new = new ContentValues(); values1new.put(CalendarContract.Reminders.EVENT_ID, ContentUris.parseId(newEvent)); values1new.put(CalendarContract.Reminders.MINUTES, 1440); //提前一天有提醒 1440 values1new .put(CalendarContract.Reminders.METHOD,1); Uri uri = context.getContentResolver().insert(Uri.parse(CALANDER_REMIDER_URL), values1new); if (uri == null) { //添加闹钟提醒失败直接返回 Log.d("tag","添加失败!"); return; }else { Log.d("tag","添加成功!"+uri); } } //Button按钮点击事件 public void ClickThred(View view) { long timeMillis = System.currentTimeMillis(); addCalenderEvent(getApplicationContext(),"课程提醒:您明天有课程要参加,请不要忘记呦","有课程即将开始,请及时查看",timeMillis); }
相关文章推荐
- 在app未开启时,实现对用户进行通知提醒功能总结(添加事件到手机系统日历并设置闹钟提醒)
- iOS开发将App发布的事件直接添加到系统日历提醒事项的封装
- iOS提醒用户进入设置界面进行重新授权通知定位等功能
- iOS提醒用户进入设置界面进行重新授权通知定位等功能
- Android向系统日历中添加日程事件(一种闹钟实现)
- App内嵌入群聊功能: 1. 需要在IOS、Android、WEB IM、PC进行即时消息IM通讯,消息能实时收发,群管理 /群内消息。IM系统需要在不侵入原APP的用户和业务体系的情况下
- IOS中使用本地通知为你的APP添加提示用户功能
- 仿系统闹钟,实现更新安装之后还可以响铃,开机启动功能需要手机自带开机自启动
- 自动添加job.HIT招聘会信息到带有日历和提醒功能的手机上!
- android 读写系统日历、插入事件、添加多个提醒的问题
- 黄聪:WordPress 多站点建站教程(一):怎样开启WordPress多站点功能,实现手机移动端主题开发,与主站用户数据共享
- Java web项目01 停车管理系统实现添加用户信息功能(四)
- 往系统日历中增加与删除事件提醒,Calendar Provider 实现
- Android 获取手机系统的声音设置管理通知提醒的声音
- android系统设置里的触摸提示音功能怎样实现开启和关闭?
- android系统设置里的触摸提示音功能怎样实现开启和关闭?
- .Net语言 APP开发平台——Smobiler学习日志:快速在手机上实现日历功能
- IOS中使用本地通知为你的APP添加提示用户功能
- Android 获取手机系统的声音设置管理通知提醒的声音