本来提醒的功能可以由服务器推送消息来设置的,但是考虑到有可能会离线状态,所以会让本地也服务器使用相同的数据库,然后定时循环读取数据,再设定闹钟,从而达到提醒的目的,做一个真正的闹钟肯定不能只有一个要可以随心所欲地加--只要你愿意,你可以加到天荒地老。所以一定会用到数据库,这样也不至于离线之后不能使相关的功能了啊,真真的感觉到,做出来不难,但是做到最好,完全不是一时半会的功夫啊,不过这些又算什么,以后还要面对从应用转游戏开发之后的难度呢,岂能止步于此!
下面是转载收集的一些知识,以备参考吧,完成之后会写出相应的代码以供参考:
下面介绍一下我建的数据库:代码如下
public class alarmsql extends SQLiteOpenHelper{
String createtable="create table " + toolutil.tablename + " (" +toolutil.id + " INTEGER PRIMARY KEY " +
", "+ toolutil.hour +" INTEGER ," + toolutil.minute +" INTEGER ," + toolutil.lasttime + " INTEGER ," + toolutil.week + " TEXT , " +toolutil.state
+" INTEGER ," + toolutil.music + " TEXT " + ")";
public alarmsql(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(createtable);
} public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}}
toolutils:toolutils代码如下:
public class toolutil {
public static final String id="_id";
public static final String week="WEEK";
public static final String state="STATE";
public static final String music="MUSIC";
public static final String lasttime="CONTINUE";
public static final String hour="HOUR";
public static final String minute="MINUTE";
public static final String tablename="DATA";}
通过继承SQLiteOpenHelper来创建数据库。怎么用的就不说了。下面说一下建表意图:id字段不用说了(android建表必须的字段名字必须为_id否则会报错),week字段是存储一周重复的星期参数我传入七位的0、1字符串意图不言而喻(0代表没选),state是否关闭闹钟标识位,music是存入的铃声名字,lasttime是闹钟重复的时间,余下两个字段看名字就明白了。累了占用上班时间太多也不好,先到这了。
操作数据库无外乎就是增(新增一条数据在表里就是新增加一行)、删(删除一条数据在表里就是删除某一行数据)、查(根据某一列或者说某一个字段去定位某一行数据)、改(更改某一行数据的某一个或多个字段【即列】)。看代码:
public class sqlAdapter {
public static final String dbName="mysql.db";
private Context context;
private SQLiteDatabase myDataBase;
public SQLiteDatabase getMyDataBase() {
return myDataBase;
}
public sqlAdapter(Context context)
{
this.context=context;~~~~~~~~~~~~~~~~~~~~~~~~~这是获取上下文
}
public void opensql()
{
alarmDB sql=new alarmDB(context,dbName,null,1);
myDataBase=sql.getWritableDatabase();// 此处才真正的创建了数据库
}
public int findId(int hour,int minute,String weeklast)
{
Cursor cur=myDataBase.query(toolutil.tablename, new String[]{toolutil.id}, toolutil.hour + "=" +hour +" and"~~~~~~~~~~~~~~这个query方法的参数介绍:第一个是表名,第二个是选择的列此处只获取id列,第三个参数是条件信息即查找指定条件的数据此处是限定指定的小时、分、星期数,第四个参数是如果第三个参数等号后面有“?”这里就是问号的数据后面参数可以滞空。
+ toolutil.minute +" =" + minute+" and " +toolutil.week +" = " +weeklast, null, null, null, null);//注意空格
if(cur!=null)
{
cur.moveToFirst();
int id=cur.getInt(cur.getColumnIndex(toolutil.id));~~~~~~~~~~~~~~~获取游标的指定列的数据
cur.close();
return id;
}
return -1;
}
public boolean updaptData(int id,int hour,int minute,String weeklast,String music,int lasttime )
{
ContentValues value=new ContentValues();
value.put(toolutil.hour,hour);
value.put(toolutil.minute,minute);
value.put(toolutil.week,weeklast);
value.put(toolutil.music,music);
value.put(toolutil.lasttime,lasttime);
//value.put(toolutil.state,state);
return myDataBase.update(toolutil.tablename, value, toolutil.id +" =" +id, null)>0;~~~~~~~~~~~更新数据
}
public boolean updatastate(int id,int state)
{
ContentValues value=new ContentValues();
value.put(toolutil.state, state);
return myDataBase.update(toolutil.tablename, value, toolutil.id+ " ="+id, null)>0;~~~~~~~~~~~~~~只更新指定id的state列的数据
}
public void insertData(int hour,int minute,String weeklast,String music,int lasttime ,int state)
{
ContentValues value=new ContentValues();~~~~~~~~~~~~~~~~~~~~~~~好比MAP一样先向其中预存指定的列名和参数然后对数据库赋值
value.put(toolutil.hour,hour);
value.put(toolutil.minute,minute);
value.put(toolutil.week,weeklast);
value.put(toolutil.music,music);
value.put(toolutil.lasttime,lasttime);
value.put(toolutil.state,state);
myDataBase.insert(toolutil.tablename, toolutil.id,value);//此处的红色标记是不用手动插入的字段而是系统自动分配的部分。如果你的id是自己定的这里可以设为空
}
public void deletedata(int id)
{
myDataBase.delete(toolutil.tablename,toolutil.id+"="+id , null);
}
public Cursor findcur(int id)
{
Cursor cur=myDataBase.query(toolutil.tablename, null, toolutil.id+ " ="+id, null, null, null, null);
return cur;
}
}
至此对该闹钟使用的数据库的操作也就设置完毕了,或许后续还会遇到别的操作可以在这个类里写新的方法就行了。好了数据库部分告一段落了。
关于AlarmManager就是google android提供的定时管理器。通过get相应的服务来获得一个实例来操作我们的动作。看下面一段代码:
Calendar calende=Calendar.getInstance();
calende.set(Calendar.DAY_OF_WEEK, week);
calende.set(Calendar.HOUR, hour);
calende.set(Calendar.MINUTE, minute);
calende.set(Calendar.SECOND, 0);
calende.set(Calendar.MILLISECOND, 0);。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(有代码省略)
manager=(AlarmManager) this.getSystemService(ALARM_SERVICE);
manager.setRepeating(AlarmManager.RTC_WAKEUP, calende.getTimeInMillis(), 120*1000, pi);
首先获得一个日历的实例,通过set来自定义自己的日历实例。这里我设定了指定的星期、时间。然后我们设置了定时器即在calende.getTimeInMillis()这个时间到来时会做我的pi里的事情,120*1000是设定的循环周期吧单位是毫秒即每隔两分钟会循环执行pi动作一次。
有个问题来了:我只设置了星期几没有设置月份以及年份啊?manager会知道在哪个星期的星期几响起吗?
是的虽然这里我只设置了星期几但是在你calendar一个实例的时候系统自动取得了系统的当前时间即默认取当前的年份和月份。举个例子:比如我设置week=4(代表星期三 因为星期日是1以此类推)当前时间就是星期三的话如果设定的时间到了定时就会被击发。如果当前时间小于星期三比如星期二则系统会默认你设置的星期三和当前时间所在的那个星期是一样的它们的时间差只有一天。
还有一个问题:就是设置的时间如果小于当前系统时间就会立刻击发动作这显然不是我们想要的比如我设定7点闹钟而现在是8点我一设置闹钟响了显然不行,只需在第二个参数后加上要推迟的时间即可比如你想推迟一天即明天7点响只需这样:
manager.setRepeating(AlarmManager.RTC_WAKEUP, calende.getTimeInMillis()+1000*60*60*24, 120*1000, pi);
同理设置循环星期也是如此。
今天添加闹钟的音乐提醒部分。要播放音乐只需用MediaPlayer类就可以实现如下:
MediaPlayer player;~~~~~~~~~~~~~~~~~~~此处声明一个MediaPlayer 类得操作以便后继的操作。
player=new MediaPlayer(); ~~~~~~~~~~~~~~~~~~~~前面只是声明并没有实例化对象,是不能直接用的(刚学语言的新手最容易犯的错误哈哈)
对player对象重置一下就是重新调用的意思,重构嘛。
player.setDataSource(path);~~~~~~~~~~~~~~~~~~~~~~获取音乐的资源位置。这个参数path就是音乐文件的路径比如我的是:sdcard/年轻时代.mp3
player.setLooping(true);~~~~~~~~~~~~~~~~~~~~~~~~~设置是否对播放的东东进行循环播放。因为你想播放1分钟可资源就10秒的话此处就有用了。
player.prepare();~~~~~~~~~~~~~~~~~~~~~~~~~~~准备播放,在开始之前必须有这步。要播放先得准备好嘛。(个人感觉这步多余可是没办法谁叫sdk是人家定的)
player.setVolume(setvoloum, setvoloum);~~~~~~~~~~~~~此处就是设置音量了!两个参数分别是左声道和右声道的音量类型是float类型0~1当然可以更大但没有用
player.start();~~~~~~~~~~~你懂得!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
虽然不困还是要该睡了,一句话,所遇见的难题,肯定有人经历过,所以要做的只是做好边查边学喽。
每日一阅到500的那时候,便是真正的IT大师形出的日子!前路漫漫,我辈不息!