Android中闹铃的设置

在安卓中真正涉及到闹铃设备的类为AlarmManager类,而所谓的设备闹铃其实就是在用户设置一个指定的时间点到来的时候通过一种手段给系统发送一个自动跳转的广播,跳转之后在一个Activity活动中实现一个音乐的自动开启。了解到了这个道理我们就可以通许其特性去寻找解决的方法。

1,怎么发送一个广播

首先发送广播需要涉及到的类有AlarmManager类、PandingIntent类、Intent类。实例化AlarmManager用来启动一个闹钟,再得到它的对象,然后声明实例化Intent类用来从本Activity中跳转到一个BroadcastReceiver类的对象,然后在PandingIntent中设置一个延迟跳转,将之前写的Inetent作为参数加到里面,最后利用AlarmManager从自定义的时间,延迟一个自定义时间重复启动一个闹钟。

Ps:发送广播的自定义时间可以通过在布局文件中拿到一个TimePicker控件,通过Calendar来设定日期传给AlarmManger

代码详情如下:

AlarmManager  manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);//获得警报信息服务,用来启动闹钟
Intent intent1 = new Intent(DigitalClockActivity.this, AlarmReceiver.class);
//实例化一个延迟跳转类,获得Broadcast(广播)(上下文对象,请求吗,跳转类,无视)
PendingIntent pending
//设置一个重复播放的闹钟(AlarmManager.RTC_WAKEUP(唤醒闹钟),开启时间,割多长时间循环启动,延迟跳转的意图);
AlarmManager manager.setRepeating(AlarmManager.RTC_WAKEUP, m, 10000, pending);//用来匹配闹钟设置时间

Ps:Intent的跳转分为显式跳转和隐式跳转,显式跳转就如上面代码中的那种,而隐式跳转用到的是Intent intent = new Intent("msg");这个方法,而里面的字符串的来源就是在清单文件中的BroadcastReceiver类中添加的action的name内容,相关代码如下:

<receiver android:name="com.digitalclockset.AlarmReceiver">
<intent-filter >
<action android:name="Sendthealarmclockradio">
(msg内容就是Sendthealarmclockradio)
</action>
</intent-filter>
</receiver>

2,接收一个从AlarmManager中发送的广播

接收广播需要新建一个继承了BroadcastRceiver的类。在该类中需要的只有Intent来实现一个Acticity的跳转,但在启动之前需要给Intent添加一个意图。

代码详情如下:

public class AlarmReceiver extends
@Override
public void
// TODO Auto-generated method stub
Intent intent2 = new Intent(context, AlarmActicity.class);//接收广播后跳转到AlarmActicity类
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
}
}

另外一个PendingIntent也可以同时跳转多个BroadcastReceiver,同理,一个AlarmManager也可以同时执行多个PendingIntent,在发送之前可以多自定义的BroadcastReceiver在清单文件中进行一个优先级的设定,而且要使用BroadcastReceiver又必须对其进行注册才能使用,比如

<receiver android:name=".Receive1"   (注册BroadcastReceiver)
<intent-filter android:priority="15">-1000—1000)
<action android:name="www.android1.com"/>
</intent-filter>
</receiver>

在这之下还有另一种注册方法,即在Java文件中进行注册,在Java中注册需要覆写它的四个方法,而使用到的只有其中两个,代码如下

@Override
protected void
// TODO Auto-generated method stub
super.onStart();
}
@Override
protected void
super.onResume();
registerReceiver(BroadcastReceiver, IntentFilter);//注册
}
@Override
protected void
super.onPause();
unregisterReceiver(BroadcastReceiver);//注销
}

在另外两个覆写方法onStart()和onStop()也可以注册,但是记住这中注册方法都是一一对应的,即在onResume()中注册要在onPause() 中注销,在onStart()中注册就要在onStop()中取消。

3:闹钟实现

在跳转后的Acticity中首先需要创建一个Timer定时器,用该对象来设定一个闹钟开启的时间和在规定的时间内循环开启。

代码详情如下:

public class AlarmActicity extends
int recLen
Timer timer = new Timer(true);// 创建定时器
MediaPlayer mMediaPlayer;
TimerTask task = new
@Override
public void
// TODO Auto-generated method stub
Message message = new
message.what
handler.sendMessage(message);// 发送消息
}
};
@Override
protected void
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.clock_dialog);
timer.schedule(task, 1000, 10000);//让音乐在Dialog显示之后的1秒之后再每10秒循环播放
mMediaPlayer = new
try
mMediaPlayer.setDataSource(getApplicationContext(), RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_RINGTONE));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
mMediaPlayer.setLooping(true);
mMediaPlayer.prepare();
}  catch
// TODO Auto-generated catch block
e.printStackTrace();
}
mMediaPlayer.start();
}
Handler handler = new
public void
switch (msg.what) {
case
recLen++;
break;
}
};
};

4:取消一个闹钟

取消闹钟只要让AlaremManager类来清楚一个PendingIntent跳转就好

代码详情如下:

清空一个延迟跳转信息