我的闹钟响铃的逻辑是这样设计的:
1.设置好闹钟后,立即发送一个带有唯一id的延迟意图PendingIntent广播;
2.当时间到的时候,广播接受者接收到发送过来的数据,并开启一个服务,将数据传递进去;
3.服务创建成功后,根据传递过来的数据进行响铃和振动操作,同时启动一个响铃的activity界面,将时间,标签等信息传递过去显示;
4.响铃的activity创建成功后,立即与服务进行绑定,界面上有两个按钮,暂停再响 和 关闭闹钟,分别对应服务里面的相应的方法。
5.当点击 暂停5分钟再响,会在服务里发送一个5分钟的延迟广播,同时 解绑服务-->停止服务;
当点击关闭闹钟的时候,如果该闹钟的重复周期为只响一次,则取消该闹钟的广播,更新数据库,同时 解绑服务-->停止服务;如果该闹钟的重读周期为其它,则计算与下一次闹铃最短的时间间隔,发送一个延迟广播,同时 解绑服务-->停止服务。
整体的思路概括一下:有几个闹钟,系统里就有几个广播;当一个闹钟的广播处理完成之后,根据重复周期判断是否发送下一次广播。
广播接受者的代码如下:
public class AlarmClockReceiver extends BroadcastReceiver {
private static final String TAG = "AlarmClockReceiver";
public static final String Alarm_CLOCK_RING_ONLY_ONCE = "只响一次";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("cn.edu.usts.cardhelper.alarmclock")){
Log.i(TAG, "--------------------闹钟的广播接受者-----------------------");
Bundle bundle = intent.getExtras();
int alarmClockId = bundle.getInt("alarmClockId");
int hour = bundle.getInt("hour");
int minute = bundle.getInt("minute");
String repeatCycle = bundle.getString("repeatCycle");
String ringInfo = bundle.getString("ringInfo");
int isShake = bundle.getInt("isShake");
String tag = bundle.getString("tag");
Log.i(TAG, "---接收到的闹钟id为:"+alarmClockId+"---重复周期为:"+repeatCycle+"---铃声信息:"+ringInfo+"---振动:"+isShake+"---hour:"+hour+"---minute:"+minute+"---tag:"+tag);
//开启一个服务
Intent ringIntent = new Intent(context, AlarmClockService.class);
ringIntent.putExtras(bundle);
ringIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(ringIntent);
}
}
}
服务的代码如下:
public class AlarmClockService extends Service {
public static final String TAG = "AlarmClockService";
public static final String Alarm_CLOCK_RING_ONLY_ONCE = "只响一次";
private AlarmManager alarmManager;
private MediaPlayer mediaPlayer;
private Vibrator vibrator;
private Bundle bundle;
private Intent toReceiverIntent;
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "--------------onBind----------");
return new AlarmClockRingServiceProvider();
}
@Override
public void onCreate() {
Log.i(TAG, "--------------onCreate----------");
super.onCreate();
alarmManager = (AlarmManager) this.getSystemServ