近期我正在做一个安卓闹钟的项目,在这个项目中我真可谓是历尽千辛万苦啊,平均每天研究这个程序真的可以研究10个小时左右啊,真的是让我头疼死了。直至现在,我已经可以用好多种方法来实现这个闹钟了,然后如果大家有什么不会的可以给我留言,我会非常有耐心的为大家解答,我现在就用一种我自认为最简单的方法为大家介绍一下。
我们首先是要想,一个闹钟的功能,当然要有设置时间的功能,然后到时间要有提醒的功能,提醒可以分为很多种,可以使用notification、diallog、响铃等很多种方式来提醒大家,当然我们也可以使用集中混合在一起提醒大家。
下面我会一个部分,一个部分的介绍我们的程序。
第一部分:首先我们要想到的就是我们的程序,要有一个数据存储的功能,这里我们可以用到sharedpreferences,因为它是一个轻量级的数据存储我们需要用到的,在我们的程序里面我们需要把我们设置的时间存储起来,因为如果我们不慎把我们的程序关掉之后打开之后要保存上次设置的时间。
SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE);
time1String = settings.getString("TIME1", defalutString);
time2String = settings.getString("TIME2", defalutString);
time3String = settings.getString("TIME3", defalutString);
//在接下来我们还需要SharedPreferences time1Share = getPreferences(0);
SharedPreferences.Editor editor = time1Share.edit();
editor.putString("TIME1", tmpS);
editor.commit();
(在这里面我们首先创建了一个SharerPreferences的对象settings,在这里满我们传入的参数是MODE_PRIVATE,它的含义是覆盖写的意思,然后我们又创建了三个字符串分别都让它们为空,然后在代码中我们为三个字符串都赋了初值defalutString,然后当我们的数据写完了之后呢,我们需要在SharedPreference里面开一个空间用来储存我们的数据,这样我们便可以通过键值对的方式来储存我们的数据了,在最后我们用到了一个提交事务的方法)
第二部分:我们要在设置的按钮中添加点击事件,在点击事件中,我们需要涉及到很多的事情,我们首先需要一个calendar.getInstance()的对象,因为有了这个对象我们在获取系统时间的时候是非常简单的,然后我们通过c.setTimeInMillis(System.currentTimeMillis())的方法来实现我们想获取时间的想法,然后我们通过int mHour=c.get(Calendar.HOUR_OF_DAY)来得到我们的小时,得到分钟的方法和这个方法类似。
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
int mHour = c.get(Calendar.HOUR_OF_DAY);
int mMinute = c.get(Calendar.MINUTE);
(在以上的代码,我们便获取到了系统现在的时间了)
接下来我们要设置一个需要闹钟提醒的时间,这样的话我们就需要new 一个TimePickerDialog用来接收我们设置的时间,然后调用onTimeSet的方法来设置我们想要设置的时间。
new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
c.setTimeInMillis(System.currentTimeMillis());
c.set(Calendar.HOUR_OF_DAY, hourOfDay);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);}
(这样我们便已经设置好了,我们想要设置的时间)
然后到了我们闹钟最重要的一个步骤,就是用pendingIntent实现跳转,pendingInetnt和Intent最大的不同便是可以实现延迟跳转的功能。接下来我们还要用到一个全局计时器AlarmManager的东西,在这里面我们可以通过am.set()的方法来设置我们的闹钟的提醒的方式,这里有很多种提醒方式,我们用到的是RTC_WAKEUP的方法,这种方法可以做到我们的手机在什么状态下都会进行提醒,这里还有很多种方式大家都可以百度到的,am.set()的方法也有很多种构造函数,这里我们会讲到两种,一种是到时间直接就提示我们的,还有一种是到时间之后提醒我们,并且可以为之设置一个周期的方法。
Intent intent = new Intent(MainActivity.this, CallAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
AlarmManager am;
am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), sender);
在整个的实现过程中,我们还需要用到一个小的方法,也就是时间的转换,因为如果我们的小时或者分钟出现了个位数那么我们需要将他们转换成0+那位数字的形式,这样我们的用户体验才可以达到最好,并且我们也只需要写一个小的方法就行。
private String format(int x) {
String s = "" + x;
if (s.length() == 1) s = "0" + s;
return s;
}
有了这样的一个方法呢,我们在有一个个位数传进我们的函数之后,便可以很轻松的变成一个0+上个位数字的形式了,这也很大程度上的提高了我们的用户体验。
String tmpS = format(hourOfDay) + ":" + format(minute);
setTime1.setText(tmpS);
第三部分:我们要在这个部分中加入我们删除闹钟的按钮了,因为我们设定了一个闹钟如果我们不喜欢的话,我们一定是要删除我们这个闹钟的,同理,在这里我们为button添加点击事件,然后利用Intent和PendingIntent发送广播告诉接受广播的下一个界面,我们要把定时的功能取消掉了,只需要加入一个函数即可,这样我们的小闹钟就基本上做完了。
总结一下吧,想实现这样一个闹钟,我们是通过一个全局的计时器来实现的,思路很清晰简单,想要实现铃声,提醒只需要往上加服务或者notifaction就行。