关于Android自带日历日程事件的操作。 ----------------- 一些心得,与大家分享一下,如果有哪里错误,请指正。先上代码 一:创建用户本地日程 /**创建日程*/ @SuppressLint("NewApi") private void createCalendar(String name,int color){ ContentValues values=new ContentValues(); values.put(Calendars.ACCOUNT_NAME,name); values.put(Calendars.ACCOUNT_TYPE,"LOCAL"); values.put(Calendars.NAME,name); values.put(Calendars.CALENDAR_DISPLAY_NAME,name); /**显示事件颜色*/ values.put(Calendars.CALENDAR_COLOR,color); /**权限级别*/ values.put(Calendars.CALENDAR_ACCESS_LEVEL,Calendars.CAL_ACCESS_OWNER); /**事件可见*/ values.put(Calendars.VISIBLE,1); values.put(Calendars.SYNC_EVENTS,1); values.put(Calendars.OWNER_ACCOUNT,name); /**注释的属性都是不可添加的,我们作为类似第三方的使用系统的数据没有拥有此属性的权限*/ // values.put("canModifyTimeZone",1); // values.put("canPartiallyUpdate",0); // values.put("maxReminders",5); // values.put("allowedReminders","0,1"); // values.put("allowedAvailability","0,1"); // values.put("allowedAttendeeTypes","0,1,2"); // values.put("deleted",1); /**新增用户日程*/ Uri uri=getContentResolver().insert(CalendarContract.Calendars.CONTENT_URI, values); /**获取返回的新建日程ID*/ Long calId= Long.parseLong(uri.getLastPathSegment()); if(calId!=0){ Toast.makeText(this, "新建日程成功",Toast.LENGTH_SHORT).show(); saveCalendarID(calId+""); enterNext(calId+""); }else{ Toast.makeText(this, "新建日程失败",Toast.LENGTH_SHORT).show(); } } 二:将创建好的用户日程ID保存,之后的事件操作都是对此ID日程进行操作,就可以把只日程分开来。以下是对事件的crud操作,这里只是做一些比较简单的示范。 /**添加*/ @SuppressLint("NewApi") public void addCalendar(){ long startMillis = 0; long endMillis = 0; //开始时间结束时间,在此定死为当前时间相隔20分钟 Calendar beginTime = Calendar.getInstance(); beginTime.set(Calendar.MINUTE, beginTime.getTime().getMinutes()+10); startMillis = beginTime.getTimeInMillis(); Calendar endTime = Calendar.getInstance(); endTime.set(Calendar.MINUTE, endTime.getTime().getMinutes()+30); endMillis = endTime.getTimeInMillis(); ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put(Events.CALENDAR_ID, calID); values.put(Events.DTSTART, startMillis); values.put(Events.DTEND, endMillis); values.put(Events.HAS_ALARM,1); values.put(Events.TITLE, mEtTitle.getText().toString()); values.put(Events.DESCRIPTION, mEtDescription.getText().toString()); values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID().toString()); values.put(Events.EVENT_END_TIMEZONE, TimeZone.getDefault().getID().toString()); Uri uri = cr.insert(Events.CONTENT_URI, values); Long eventId= Long.parseLong(uri.getLastPathSegment()); ContentValues remider = new ContentValues(); remider.put(Reminders.EVENT_ID, eventId ); //提前10分钟有提醒 remider.put( Reminders.MINUTES, mEtAlarm.getText().toString() ); remider.put(Reminders.METHOD, Reminders.METHOD_ALERT ); getContentResolver().insert(Reminders.CONTENT_URI, remider); Toast.makeText(this, "添加事件成功", Toast.LENGTH_SHORT).show(); SHView(true); } /**更新*/ @SuppressLint("NewApi") public void updateCalendar(){ ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put(Events.TITLE, mEtTitle.getText().toString()); values.put(Events.DESCRIPTION, mEtDescription.getText().toString()); int rows=0; rows=cr.update(Events.CONTENT_URI, values, Events.CALENDAR_ID+"=?"+" and "+Events.TITLE+"=?", new String[]{calID,mEtTitle.getText().toString()}); if(rows>0){ Toast.makeText(this, "更新成功", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "更新失败", Toast.LENGTH_SHORT).show(); } SHView(true); } /**删除用户的所有事件*/ @SuppressLint("NewApi") public void onDeleted(View view){ int rows=getContentResolver().delete(Events.CONTENT_URI, Events.CALENDAR_ID+"=?", new String[]{calID+""}); if(rows>0){ Toast.makeText(this, "删除用户事件成功", Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(this, "删除用户事件失败", Toast.LENGTH_SHORT).show(); } SHView(true); } 三。利用ContentObserver监听数据的改变 监听类 public class CalendarObserver extends ContentObserver { private Context context; private Handler handler; public CalendarObserver(Context context,Handler handler) { super(handler); // TODO Auto-generated constructor stub this.context=context; this.handler=handler; } @Override public void onChange(boolean selfChange) { // TODO Auto-generated method stub super.onChange(selfChange); handler.obtainMessage(3,"events have chage").sendToTarget(); } 在主类中,实例化并实施监听 calObserver=new CalendarObserver(this,new Handler(){ @Override public void handleMessage(Message msg) { /**当监听到改变时,做业务操作*/ Log.i("tag", "now "); String msgStr=(String)msg.obj; System.out.println(msgStr+"----------------日程日程"); Toast.makeText(CalendarActivity.this, "日程事件修改被触发", Toast.LENGTH_SHORT).show(); } }; //注册日程事件监听 getContentResolver().registerContentObserver(Events.CONTENT_URI, true, calObserver); } 补充一些: 日程本地与服务器的同步思路: 1.本地创建一个新的日程系统(可根据需要,将日程的属性设置,例如,只可读,不允许用户外部操作此日程的数据)。 2.监听开机Action在每次开机的时候启动本服务,(日程同步系统一般我们不需要界面,开启一个服务就可以了) 3.对于数据同步,可执行此策略,当服务上的数据改变时,例如添加了某一事件,则向登录的客户端推送事件消息,客户端收到则对数据进行更新,此为数据以服务器数据为准。 当用户通过系统日历界面在本地操作添加一事件时,服务监听到此动作。则遍历数据,则此时以客户端的数据为准同步到服务器上。如果客户端未及时联网,可以先将数据保存下来,当联网时。会优先将服务器推送的事件消息更新,再做客户端数据与服务器同步。 PS:ContentObserver只能监听到数据的改变,而不能得到改变了哪些数据。所以这一点,还未想到好点的方法,如果谁知道更好的方法可以监听到数据变化,希望能@我。 |
-
CalendarDemo.zip
639.95 KB, 下载次数: 12, 下载积分: e币 -10 元
日程事件操作
java中Calendar类中getTimeInMillis()方法返回值是什么
返回从格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000到Calendar对象表示的时间之间的毫秒数
|