实现效果:点击主活动上的按钮,弹出一个带有时间选择器的对话框(TimePickerDialog),设置时间后Toast"设置成功"。到设置的时间后在AlarmActivity弹出显示时间到的对话框。
实现原理:使用AlarmManager类向系统请求一个定时任务,到时间时系统会发送一个广播,接受这个广播并做相应的操作即可。
1.主活动代码
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import java.util.Calendar;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
public class MainActivity extends Activity implements View.OnClickListener{
private Button btnSetTime;
private AlarmManager manager;
private Calendar calender;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//当前时间
calender = Calendar.getInstance();
manager = (AlarmManager) getSystemService(ALARM_SERVICE);
btnSetTime = (Button) findViewById(R.id.btnSetTime);
btnSetTime.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnSetTime:
showAlertDialog();
break;
}
}
private void showAlertDialog() {
TimePickerDialog dialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis()); //设置Calendar对象
c.set(Calendar.HOUR_OF_DAY, hourOfDay); //设置闹钟小时数
c.set(Calendar.MINUTE, minute); //设置闹钟的分钟数
c.set(Calendar.SECOND, 0); //设置闹钟的秒数
c.set(Calendar.MILLISECOND, 0); //设置闹钟的毫秒数
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); //创建Intent对象
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); //创建PendingIntent
manager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); //设置闹钟
Toast.makeText(MainActivity.this, "闹钟设置成功", Toast.LENGTH_SHORT).show();//提示用户
}
}, calender.get(Calendar.HOUR_OF_DAY), calender.get(Calendar.MINUTE),false);
dialog.show();
}
}
注意:calender是用来设置弹出框默认显示时间的,c才是我们设置的时间。这里c.set(Calendar.HOUR_OF_DAY, hourOfDay);里的参数不要错写成HOUR,HOUR是十二小时制,HOUR_OF_DAY才是24小时制。(我会说我给他加12什么的完全没用吗)。关键代码是manager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);第一个参数是闹钟的类型,第二个是执行时间,从我们设置的c获取,第三个就是要执行的任务。还有,看看Calender导的是哪个包,如果calender的代码红了基本就是导错了。
2.广播接收器:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context,AlarmActivity.class);
//使用context开启Aty时要开启新的task,所以要加一个flag
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}注意别忘了加那个FLAG。
之后在AlarmActivity中弹出对话框就可以了。