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只能监听到数据的改变,而不能得到改变了哪些数据。所以这一点,还未想到好点的方法,如果谁知道更好的方法可以监听到数据变化,希望能@我。
-----------------
一些心得,与大家分享一下,如果有哪里错误,请指正。先上代码
一:创建用户本地日程
/**创建日程*/
@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
- Android系统日历日程操作
- Android调用系统日历插入日程
- Android调用系统日历插入日程
- Android 日历日程监听
- 同步Android手机系统日历事件(日程)
- Android向系统日历中添加日程事件
- calendar添加日程到系统日历
- Android 插入日程到系统日历要注意的3点
- Android向系统日历中添加日程事件(一种闹钟实现)
- 向系统日历添加日程提醒的规则
- 获取与修改android自带日历日程
- Android日历操作
- android 调用系统日历
- android系统日历
- React Native日历日程组件
- Android 日历管理 Calendars的(日程、提醒)增删改查
- ANDROID calender日历读写操作.
- Android中的日历读写操作!!!
- AFNetworking实现程序重新启动时的断点续传
- IOException while loading persisted sessions: java.io.EOFException
- 关于Wince的重启问题
- 中文分词算法—— 基于词典的方法
- 关于Spring3报org.aopalliance.intercept.MethodInterceptor错的问题解决方法
- Android系统日历日程操作
- 技术网站收集
- UCOS环境下的中断程序
- 自适应网页设计(Responsive Web Design)
- li横向排列
- 分区表的global index 和 local index 跨分区查询时的性能比较
- C++STL之string
- 自制处理器OpenMIPS移植ucos-II过程之4——ucos-II文件目录建立
- SendMessage、PostMessage原理