* Note: The Alarm Manager is intended for cases where you want to have
* your application code run at a specific time, even if your application is
* not currently running. For normal timing operations (ticks, timeouts,
* your application code run at a specific time, even if your application is
* not currently running. For normal timing operations (ticks, timeouts,
* etc) it is easier and much more efficient to use
这篇文章中,以实现闹铃为例,介绍如何使用AlarmManager实现固定时间与周期性的发送广播
具体的代码以及相应的注解如下:
package me.zdnuist.android.demo3;
import java.util.Calendar;
import me.zdnuist.android.BaseActivity;
import me.zdnuist.android.R;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.NumberPicker;
import android.widget.NumberPicker.OnScrollListener;
import android.widget.TimePicker;
/**
* 通过AlarmManger实现一个闹铃的功能
* 1.设定未来某个时间的闹铃
* 2.设定一个重复响应的闹铃
*
* @author zdnuist
*
*/
public class AlarmManagerActivity extends BaseActivity implements
OnScrollListener {
public static final String TAG = "AlarmManagerActivity";
public static final String INTENT_ACTION_1 = "alarm_action_1";
private AlarmManager alarmManager;
private DatePicker datePicker;
private TimePicker timePicker;
private Button set1, set2;
private PendingIntent mPendingIntent;
private NumberPicker numberPicker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.activity_alarm);
/**************************************************************/
//初始化
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
datePicker = (DatePicker) findViewById(R.id.datePicker1);
timePicker = (TimePicker) findViewById(R.id.timePicker1);
timePicker.setIs24HourView(true); // 使用24小时制
set1 = (Button) findViewById(R.id.btn_set1);
set2 = (Button) findViewById(R.id.btn_set2);
numberPicker = (NumberPicker) findViewById(R.id.numberPicker1);
numberPicker.setMaxValue(60); //设置数字的最大值
numberPicker.setMinValue(1); //设置数字的最小值
numberPicker.setValue(5); //设置数字的默认值
numberPicker.setOnScrollListener(this); //设定此接口,可以实现numberPicker的滚动选择
/**************************************************************/
//注册广播接收器
IntentFilter filter = new IntentFilter();
filter.addAction(INTENT_ACTION_1);
registerReceiver(alarmReciver, filter);
Intent intent = new Intent(INTENT_ACTION_1);
mPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0,
intent, 0);
/**************************************************************/
set1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int h = timePicker.getCurrentHour();
int min = timePicker.getCurrentMinute();
int mon = datePicker.getMonth();
int d = datePicker.getDayOfMonth();
Log.d(TAG, "datetime:" + (mon + 1) + "-" + d + " " + h + ":"
+ min);
Calendar calendar1 = Calendar.getInstance();
calendar1.set(2015, mon, d, h, min);
//设定指定时间的闹钟
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar1.getTimeInMillis(), mPendingIntent);
}
});
set2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int num = numberPicker.getValue(); // 设置分钟时间
Log.d(TAG, "num:" + num);
//设定间隔分钟的闹钟
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), num * 60 * 1000,
mPendingIntent);
}
});
}
/**
* 广播接收器
*/
BroadcastReceiver alarmReciver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && INTENT_ACTION_1.equals(intent.getAction())) {
Log.d(TAG, "receiver");
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if (alarmReciver != null) {
unregisterReceiver(alarmReciver);
alarmReciver = null;
}
if (alarmManager != null) {
alarmManager.cancel(mPendingIntent);
}
}
@Override
public void onScrollStateChange(NumberPicker view, int scrollState) {
};
}
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="日期设定:" />
<DatePicker
android:id="@+id/datePicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:calendarViewShown="false"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间设定:" />
<TimePicker
android:id="@+id/timePicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_set1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="固定时间设置闹钟" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间间隔设定:" />
<NumberPicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/numberPicker1"
/>
<Button
android:id="@+id/btn_set2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="间隔时间设置闹钟" />
</LinearLayout>
</ScrollView>
本文以闹钟应用为实例,详细阐述如何借助AlarmManager在Android系统中设定固定时间及周期性地触发广播。提供具体代码段和注释。
9511

被折叠的 条评论
为什么被折叠?



