Android系统日历日程操作

来源:互联网 发布:网络专供款是假货吗 编辑:程序博客网 时间:2024/05/08 12:29

Android系统日历日程操作

Nicolls于 2014-3-4 14:37发表在 [应用代码] [复制链接][只看楼主][上一主题] [下一主题]
关于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只能监听到数据的改变,而不能得到改变了哪些数据。所以这一点,还未想到好点的方法,如果谁知道更好的方法可以监听到数据变化,希望能@我。
Android,日历

CalendarDemo.zip

639.95 KB, 下载次数: 12, 下载积分: e币 -10 元

日程事件操作

java中Calendar类中getTimeInMillis()方法返回值是什么


返回从格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000到Calendar对象表示的时间之间的毫秒数

0 0
原创粉丝点击