在DeskClock模块中主要通过四大界面(AlarmClockFragment、ClockFragment、TimerFragment、StopwatchFragment)与用户交互,而此四个界面中常用的为闹钟设置界面(AlarmClocFragment),因此本文章主要讲解AlarmClocFragment的重要代码和流程。本文主要从三大部分讲解:基本数据、闹钟状态转变过程、代码流程。
为什么从这三方面讲解?因为闹钟模块的特点之一是对数据处理操作很频繁,所以了解基本数据是一个基础,而闹钟状态的转变过程是每一个打开闹钟必须做的重要事情,所以是重点,最后加上代码流程,基本上能明白AlarmClocFragment的整个工作过程。
1. 基本数据
AlarmClocFragment部分打开的闹钟都包含两条基本的数据Alarm和AlarmInstance:Alarm记录的是闹钟的基础数据;AlarmInstance一部分数据来源于Alarm,同时增加一些闹钟状态和AlarmInstance ID值。
此时肯定会有疑问:那为什么有Alarm,还需要AlarmInstance呢?
因为AlarmInstance里面记录着闹钟的状态,并且可以随时删掉,此时Alarm可以起到备份作用。有了Alarm基本数据,用户就可以再次打开闹钟,就能再次创建AlarmInstance;如果代码中只设定Alarm数据,不设定AlarmInstance数据,那删除闹钟后就不能再次打开,只能让用户重新创建了,用户体验就不好,而且影响程序的效率。
再来讨论下Alarm和AlarmInstance中有哪些数据。Alarm和AlarmInstance的表是在ClockDatabaseHelper中创建的,如下所示:
Alarm Table :
private static void createAlarmsTable(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + ALARMS_TABLE_NAME + " (" +
ClockContract.AlarmsColumns._ID + " INTEGER PRIMARY KEY," +
ClockContract.AlarmsColumns.HOUR + " INTEGER NOT NULL, " +
ClockContract.AlarmsColumns.MINUTES + " INTEGER NOT NULL, " +
ClockContract.AlarmsColumns.DAYS_OF_WEEK + " INTEGER NOT NULL, " +
ClockContract.AlarmsColumns.ENABLED+ " INTEGER NOT NULL, " +
ClockContract.AlarmsColumns.VIBRATE + " INTEGER NOT NULL, " +
ClockContract.AlarmsColumns.LABEL + " TEXT NOT NULL, " +
ClockContract.AlarmsColumns.RINGTONE + " TEXT, " +
ClockContract.AlarmsColumns.DELETE_AFTER_USE + " INTEGER NOT NULL DEFAULT 0);");}
AlarmInstance Table:
private static void createInstanceTable(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + INSTANCES_TABLE_NAME + " (" +
ClockContract.InstancesColumns._ID + " INTEGER PRIMARY KEY," +
ClockContract.InstancesColumns.YEAR + " INTEGER NOT NULL, " +
ClockContract.InstancesColumns.MONTH + " INTEGER NOT NULL, " +