.receiver.SubScriptService;显示当天任务数的小脚标服务;一天结束,清零,CallbackTimer对象借助AlarmManager/TimeOutBroadCastReceiver实现定时;
.alerts.SnoozeAlarmsService继承IntentService:实现稍后提醒功能;
.alerts.DismissAlarmsService继承IntentService:mNotificationManager.cancel(notificaitonId);
.alerts.AlertService:用到HandlerThread来处理消息(清除旧提醒/更新提醒/时钟改变提醒); mAlarmManager.set(alarmType, alarmTime, mPendingIntent);每提醒一次后,制定下次提醒计划;
Receiver有: .receiver.SubScriptBootReceiver; 同步日历帐号,设置数据库中的颜色;删除日历帐号,设置本地的日历帐号;
.widget.CalendarAppWidgetService$CalendarFactory;
.alerts.AlertReceiver:动作有EVENT_REMINDER(启动DismissAlarmsService服务);(其他 启动AlertService服务)BOOT_COMPLETED;TIME_SET;LOCALE_CHANGED;PROVIDER_CHANGED;
Provider有: .provider.BridgeProvider; 对外提供(icon/done/not done)增删改查日历数据库;内部调用原始的的Provider;
消息中心:
calendar中的CalendarController相当于leassistant中的MessageHandlerList
CalendarController中,key-value对为viewId对应EventHandler。
消息封装成EventInfo类型,通过handler集合来处理 或者 eventInfo.eventType来做不同的处理。
接收者需要定义接收消息的类型。
registerEventHandler的id为viewId。
CalendarController类中 private volatile int mDispatchInProgressCounter = 0;
volatile int mDispatchInProgressCounter,用来判定程序是否正在访问ventHandlers,即线程安全。
遍历所有eventHandler;多个监听者处理同一消息;消息id为2的n次方,按位与;
WeakHashMap<Object, Long> filters; //对某发送者/某类型事件进行过滤。
CalendarControl的事件注册与反注册:synchronized(this){ if(mDispatchInProgressCounter>0){****} }; mToBeRemovedEventHandlers变量。
查询平台:
AgendaWindowAdapter queryUri:content://com.android.calendar/instances/searchbyday/2441776/2471178/%E5%88%98 刘
CalendarController类中使用到了volatile变量: private volatile int mDispatchInProgressCounter = 0。
查询使用了AsynQueryHandler类,通过URI平台实现。
AsyncQueryService是后台执行ContentResolver调用的服务,减少因activity关闭而导致的调用的失败。AsyncQueryHandler在子线程中调用ContentResolver,支持增删改查,同样支持延时/取消执行。
加载事件:CursorLoader,MonthByWeekFragment用到,getLoaderManager().initLoader(*,*,listener)来初始化laoder。数据变化,自动重新加载,不需要重复查询。
获取TimeZone:AgendaWindowAdapter利用Runnable调Utils.getTimeZone();CalendarUtils异步处理用到synchronized(mTZCallbacks){}和mTZQueryInProgress变量,来控制同步访问。
SearchRecentSuggestions:查询条件的下拉提示;CalendarRecentSuggestionsProvider继承SearchRecentSuggestionsProvider;AndroidManifest中需要配置provider;searchable控件配置android:searchSuggestAuthority="***Provider"
search的布局中,使用FrameLayout,没有使用fragment控件标签。
SimpleAgendaAdapter继承CursorAdapter;CursorAdapter.changeCursor(**),改变数据集合;周/月视图的任务列表使用。
SearchActivity --> AgendaFragment --> 布局中使用StickyHeaderListView包裹AgendaListView --> StickyHeaderListView对应AgendaWindowAdapter --> AgendaWindowAdapter有内部静态类DayAdapterInfo,里面包含AgendaByDayAdapter变量 --> AgendaByDayAdapter里面包含AgendaAdapter变量(负责生成任务item)。
AgendaWindowAdapter的实现接口方法:getHeaderPositionFromItemPosition返回-1表示不显示挂上bar;getHeaderItemsNumber返回-1表示bar一直挂着。(需要进一步深入??????)
AgendaWindowAdapter,查询队列,按照时间,一段一段的查询;滑到顶部/底部才查(针对getView方式进行处理);使用ConcurrentLinkedQueue<QuerySpec> mQueue队列,空则直接查询,不空,则完成一次查询后再查。
SearchActivity使用了ContentObserver;ContentResolver.registerContentObserver();实时观察某一URI的数据变化。
OnSharedPreferenceChangeListener接口,监听SharedPreference变化;AllInOneActivity中用到监听周的开始天。
布局:
月/周/日的视图布局的载体为ViewSwitcher,方便做动画效果。
all_in_one.xml中的FrameLayout上为Fragment;MonthByWeekFragment布局为full_month_by_week.xml;月/周的显示为ViewSwitcher;
月/周的显示为ViewSwitcher;ViewSwitcher为month_by_week_list;,四层结构(选中今天/未选中今天/选中了其他天的ImageView,月份日期的LinearLayout)。
月份日期的LinearLayout上面,以周为单位进行绘制,即由若干个MonthWeekEventsView组成。
日视图的ViewSwitcher上为DayView,
Calendar整体大量使用了ondraw方法,而不是控件的方式。
任务列表的布局为listView。
新建界面结构: EditEventActivity使用EditEventFragment --> edit_event.xml --> edit_event_2.xml
HolidayWrapperAdapter继承BaseAdapter实现WrapperListAdapter。
设置界面CalendarSettingsActivity-->日历账户管理界面SelectCalendarsSyncMutilAccountsActivity-->帐号信息CalendarManageBuilder。
EdgeEffect(onAborb,onPull方法)与OverScroller配合实现滚动到顶动画;
ContinueScroll类,实现Runnable,通过mHandler.post(mContinueScroll)实现继续滚动效果(DayView);也可以直接用handler处理消息来实现(滚轮);
DayView类中onTouchEvent方法-->GestureDetector的onTouchEvent方法,识别手势动作-->识别后调用相应DayView中对应的处理方法;
OverScroller/Scroller的onfling方法实现继续滚动/回弹效果;根据速度和位置判断是继续滚动还是回弹;基于fling的手势滑动,滑动的距离取决于初始化的速度。
OverScroller的computeScrollOffset()想知道新位置时,调用该方法。
ViewConfiguration类,UI中使用的timeouts/sizes/distances的标准常量。
GestureDetector类,构造时传入SimpleOnGestureListener;使用手势识别,主要是写监听方法;DayView中用到。
月显示布局,月下面的事件:full_month_by_week
方格背景是带边框的。周/月视图显示通过设置xml的view的margin值实现的(也可通过draw函数实现)。
view视图恢复:oncreate读取bundle.getInt("view", -1); onSaveInstanceState写入outState.putInt("view",mCurrentView);
默认提醒时间设置:DefaultReminderActivity。
角标设置界面:SubScriptActivity。
节假日实现:画点,静态判断;显示事件,HolidayWrapperAdapter做为BaseAgendaListView的Adpter。
Drawable,处理可视资源,没有接收事件功能;周/月视图下拉时无边界bug的处理,BaseAgendaListView继承listView,重写ondraw函数,判断是否为下拉。
View实现了Drawable.Callback,KeyEvent.Callback, AccessibilityEventSource接口。View.onFinishInflate()在View和它所有子节点inflated之后调用。
周/月视图任务动画:采用overScroll实现。
周/月视图的下拉框补齐;对比ListView的下拉刷新功能(onTouchEvent方法,根据不同状态进行不同的变化);滑动刷新(对onScroll方法进行处理;OnScrollListener的onScroll方法也行);
DayView中,通过DayFragment对象GO_TO切换的有:onKeyDown();doSingleTapUp();GotoBroadcaster对象的onAnimationEnd方法;
其余总结:
Canvas.draw(bitmap); vs Drawable.draw(canvas); 的区别????
EPOCH_JULIAN_DAY:The Julian day of the epoch, that is, January 1, 1970 on the Gregorian calendar.
MONDAY_BEFORE_JULIAN_EPOCH:The Julian day of the Monday in the week of the epoch, December 29, 1969 on the Gregorian calendar.
CanlendarColorActivity。
Loader,3.0引入的,异步加载数据。Introduced in Android 3.0, loaders make it easy to asynchronously load data in an activity or fragment.
系统SearchView,语音搜索/搜索建议/搜索相近提示/系统全局搜索。
TextUtils.equals(*,*); //都为null时,也为true。
CalendarContract.Instances发生事件表:一次事件,1对1;重复事件,1对多;
第三方app增改查日历事件,需要权限;直接跳过URI跳转到日历界面不需要权限;SyncAdapters能够察看的数据比app多;
日历内容提供者数据表:Calendars(名称/颜色/同步信息);Evensts(事件信息);Attednees(邀请人);Reminders(提醒);Instances(与事件是1对1/1对多);
Time类,isDst变量,daylight saving time。加减days/monthDay时,用toMillis(true);加减hours/minutes时,用toMillis(false);调用set(long)/set(Time)/解析时间后,读取原来时间用toMillis(false);
下拉添加top boarder,是对ondraw进行处理的. getScrollY()<0;
mAdapterView.setEmptyView(mView);//Sets the view to show if the adapter is empty.
挂上效果实现,PinnedListView extends ListView{ *** },重写dispatchDraw函数,调用mViewGroup.drawChild()把pinnedView画上去;
StickyHeaderListView extends FrameLayout{ *** },通过mViewGroup.addView(mStickyHeaderView); Drawable:draw方法最终是调用没Canvas的draw方法。Unlike a View, a Drawable does not have any facility to receive events or otherwise interact with the user.
android.graphics.drawable:Provides classes to manage a variety of visual elements that are intended for display only, such as bitmaps and gradients.
Canvas:The Canvas class holds the "draw" calls.
calendar的消息控制中心是单态模式的对象;发送单位到VIew进行视图更新;
乐助理的MessageHandlerList是静态方法与静态map;
日历中有五个重要的表格,
CalendarContract.Calendars: This table holds the calendar-specific information. Each row in this table contains the details for a single calendar, such as the name, color, sync information, and so on.
CalendarContract.Events: This table holds the event-specific information. Each row in this table has the information for a single event—for example, event title, location, start time, end time, and so on. The event can occur one-time or can recur multiple times. Attendees, reminders, and extended properties are stored in separate tables. They each have an EVENT_ID that references the _ID in the Events table.
CalendarContract.Instances:This table holds the start and end time for each occurrence of an event. Each row in this table represents a single event occurrence. For one-time events there is a 1:1 mapping of instances to events. For recurring events, multiple rows are automatically generated that correspond to multiple occurrences of that event.
CalendarContract.Attendees:This table holds the event attendee (guest) information. Each row represents a single guest of an event. It specifies the type of guest and the guest's attendance response for the event.
CalendarContract.Reminders:This table holds the alert/notification data. Each row represents a single alert for an event. An event can have multiple reminders. The maximum number of reminders per event is specified in MAX_REMINDERS, which is set by the sync adapter that owns the given calendar. Reminders are specified in minutes before the event and have a method that determines how the user will be alerted.
CalendarProvider.apk:这个apk是用来让手机与google日历进行同步时使用的,如果删了,就没办法同步日历了。当然,如果你从来不用 google 日历来管理你的日程 ,或者不知道什么是 google日历,那就可以删了它。
CalendarProvider.apk中 android:sharedUserId="android.uid.calendar"
Calendar.apk中 android:taskAffinity="android.task.calendar"
日历拆成两个apk,便于管理/解偶。同时日历系统数据量较大,也可以控制内存,分成两个独立的进程。
新领导负责整体模块沟通/以任务为单位进行周反馈。
组内开站会,较大组开周会;bug修改的追踪;二选一或者三选一模式;
金脚踏实地。
李性格开朗。
宏发散思维强,但浮躁。
朴是沟通好,云是口才好。
软件快速响应。
先专家,后赢家==做技术不能沦为别人的工具。