这个demo演示了闹钟定时器的用法。功能与TimerTask功能类似,但Alarm 即使在当前应用退出后也可以做到Schedule一个任务在指定的时刻执行。
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/info" />
<Button
android:id="@+id/bt_one_shot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_gravity="center_horizontal"
android:text="One shot alarm"/>
<Button
android:id="@+id/bt_repeating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_gravity="center_horizontal"
android:text="Start repeating alarm"/>
<Button
android:id="@+id/bt_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_gravity="center_horizontal"
android:text="Stop repeating alarm"/>
</LinearLayout>
OneShotReceiver.java
public class OneShotReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String text="接收到了一个定时器发送的广播";
Toast.makeText(context,text, 1).show();
}
}
RepeatingAlarmReceiver.java
public class RepeatingAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String text="接收到了定时器重复发送的广播";
Toast.makeText(context,text, 1).show();
}
}
ManiActivity
public class MainActivity extends Activity implements OnClickListener {
private Toast toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_one_shot = (Button) findViewById(R.id.bt_one_shot);
Button bt_repeating = (Button) findViewById(R.id.bt_repeating);
Button bt_stop = (Button) findViewById(R.id.bt_stop);
bt_one_shot.setOnClickListener(this);
bt_repeating.setOnClickListener(this);
bt_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_one_shot:
oneShotAlarm();
break;
case R.id.bt_repeating:
repeatingAlarm();
break;
case R.id.bt_stop:
stopAlarm();
break;
default:
break;
}
}
private void stopAlarm() {
Intent intent = new Intent(this, RepeatingAlarmReceiver.class);
// 创建一个延迟意图,用于定时发送广播
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
// 获取闹钟定时器
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// 取消发送任务
am.cancel(sender);
if (toast != null) {
toast.cancel();
} else {
toast=Toast.makeText(this, "已取消发送广播", 1);
toast.show();
}
}
private void repeatingAlarm() {
Intent intent = new Intent(this, RepeatingAlarmReceiver.class);
// 创建一个延迟意图,用于定时发送广播
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
// 获取一个相对时间:从开机到当前的毫秒数
long firstTime=SystemClock.elapsedRealtime();
firstTime+=5*1000;
// 获取闹钟定时器
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// 设置一重复性定时器.
//闹钟类型表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用相对时间
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);
if (toast != null) {
toast.cancel();
} else {
toast=Toast.makeText(this, "开始计时,5秒后将重复发送广播...", 1);
toast.show();
}
}
private void oneShotAlarm() {
Intent intent = new Intent(this, OneShotReceiver.class);
// 创建一个延迟意图,用于定时发送广播
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
// 创建一个定时器,时间间隔为5秒
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
// 添加一个时间间隔
calendar.add(Calendar.SECOND, 5);
// 获取闹钟定时器
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// 设置一次性定时器,第一个参数表示闹钟类型,第二个参数表示触发闹钟需等待的时间,第三个参数
// 表示闹钟响应的动作
// RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
if (toast != null) {
toast.cancel();
} else {
toast=Toast.makeText(this, "开始计时,5秒后将发送广播...", 1);
toast.show();
}
}
}
配置文件
<!-- android:process=":remote"表示当需要接收广播时自动创建进程 -->
<receiver android:name="com.fishtosky.alarmcontroller.OneShotReceiver"
android:process=":remote"></receiver>
<receiver android:name="com.fishtosky.alarmcontroller.RepeatingAlarmReceiver"
android:process=":remote"></receiver>