package alarm.clock;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.Dialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TimePicker;
public class mainActivity extends Activity implements OnClickListener {
Button btnset;
Calendar calendar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnset = (Button) findViewById(R.id.btnset);
btnset.setOnClickListener(this);
// 获得Calendar的实例Calendar不能new 创建
calendar = Calendar.getInstance();
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btnset:
showDialog(0);
break;
}
}
@Override
protected Dialog onCreateDialog(int id) {
Dialog d = null;
switch(id) {
case 0:
d = new TimePickerDialog(mainActivity.this,
new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view,
int hourOfDay, int minute) {
Intent intent = new Intent(mainActivity.this,
alarm.class);
PendingIntent pendingIntent = PendingIntent
.getBroadcast(mainActivity.this, 0,
intent, 0);
calendar.setTimeInMillis(System
.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// 获得实例
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// public static final int ELAPSED_REALTIME
//
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。
//
// public static final int
// ELAPSED_REALTIME_WAKEUP
// 能唤醒系统,用法同ELAPSED_REALTIME
//
// public static final int RTC
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用
// System.currentTimeMillis()获得。
//
// public static final int RTC_WAKEUP
// 能唤醒系统,用法同RTC类型
// 如果使用ELAPSED_REALTIME_WAKEUP类型
// 应该调用SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间
//
// alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
// SystemClock.elapsedRealtime()+5000, sender);
// 如果使用RTC_WAKEUP类型
// 应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间
//
// alarmManager.set(AlarmManager.RTC_WAKEUP,
// System.currentTimeMillis()+5000, sender);
// 设置闹钟 一次性的
am.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(),
pendingIntent);
// 设置周期闹钟
am.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis()
+ (10 * 1000),
(24 * 60 * 60 * 1000), pendingIntent);
// 取消闹钟
// 取消的Intent必须与启动Intent保持绝对一致才能支持取消AlarmManager
// am.cancel(pendingIntent);
}
}, 0, 0, true);
break;
}
return d;
}
}
package alarm.clock;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* @version 2012-7-18 上午10:22:32
**/
public class alarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "闹钟响了~~~~~", Toast.LENGTH_LONG).show();
}
}
<receiver
android:name=".alarm"
android:process=":remote"></receiver>
<!-- 也就是说android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。 -->