定时之AlarmManager闹钟的实现
设置闹钟的第一个参数的属性与对应的方法:见利用Service实现——定时任务
<receiver android:name=".alarm" android:process=":remote"></receiver> <!-- 也就是说android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。 -->
实现闹钟的例子:
//注意:当闹钟的时间小于当前时间时,闹钟就会立马生效 public class MainActivity extends Activity{ private AlarmManager alarmManager=null; private PendingIntent pi=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_content2); //获取闹钟服务对象 alarmManager=(AlarmManager) getSystemService(Context.ALARM_SERVICE); Button btn_cancel = (Button) findViewById(R.id.btn2);//取消闹钟 Button btn=(Button) findViewById(R.id.btn1);//设置闹钟 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final Calendar cal=Calendar.getInstance(); System.out.println(cal.getTime().toString()); Dialog tpd=new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override//该监听器的hourOfDay与minute代表选择的时间 public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //得到选择的时间 Calendar c=Calendar.getInstance();//获取日期对象 c.setTimeInMillis(System.currentTimeMillis());//设置日历的时间,主要是让日历的年月日和当前同步 c.set(Calendar.HOUR_OF_DAY, hourOfDay);//一天中的小时 c.set(Calendar.DATE,cal.get(Calendar.DATE));//一月中的某天 c.set(Calendar.MINUTE, minute); //设置闹钟的分钟数 c.set(Calendar.SECOND, 0); //设置闹钟的秒数 c.set(Calendar.MILLISECOND, 0); //设置闹钟的毫秒数 Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);//创建Intent对象 pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent,0); //创建PendingIntent //选择的定时时间 long selectTime = c.getTimeInMillis(); long systemTime=System.currentTimeMillis();//当前时间的毫秒数,1970年1月1日0点至今所经历时间的毫秒数 System.out.println("定时的:"+selectTime+",现在的"+systemTime); if(selectTime>systemTime){ //选择的时间大于当前时间,闹钟就从当天开始有效 System.out.println("大于当前时间"); }else{ //闹钟从第二天开始有效 System.out.println("小于当前时间,从第二天开始"); c.add(Calendar.DATE, 1);//日期加一天 } System.out.println("定时的时间为:"+c.getTime().toString()); System.out.println("现在的时间为:"+new Date(System.currentTimeMillis()).toString()); //一次性的闹钟 到了c.getTimeInMillis()这个时间就执行pi //alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);//设置闹钟,当前时间就唤醒 Toast.makeText(MainActivity.this, "闹钟设置成功",0).show();//提示用户 //重复的闹钟 这里代表间隔一天执行一次,也就是实现了闹钟 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),24*60*60*1000, pi); //c.getTimeInMillis()这个时间开始执行pi,然后间隔(24*60*60*1000)毫秒执行一次pi } }, cal.get(Calendar.HOUR_OF_DAY),//时间选择器显示的当前时间 cal.get(Calendar.MINUTE), false);//显示的时间选择器不为24小时制 tpd.show(); } }); //取消闹钟 btn_cancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(alarmManager!=null && pi!=null){ alarmManager.cancel(pi);//取消闹钟的设置 Toast.makeText(MainActivity.this, "闹钟已经取消!",0).show(); } } }); } }
布局文件为两个按钮 一个取消闹钟的设置,一个设置闹钟
闹钟的广播接收类:AlarmReceiver.java
//闹钟接收端 public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("闹钟接收端"+new Date().toString()); Intent i=new Intent(context, AlarmActivity.class); //代表这一活动将成为一个新任务的开始在这个历史堆栈 i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//不写这个会报异常 context.startActivity(i); } }
闹钟的提示活动:AlarmActivity.java
public class AlarmActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //显示对话框 new AlertDialog.Builder(this).setTitle("闹钟"). setMessage("闹钟到了"). setPositiveButton("知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { AlarmActivity.this.finish();//关闭当前活动 } }).create().show(); } }
注册文件AndroidManifest.xml
<activity android:name=".AlarmActivity"></activity> <receiver android:name="com.ts.work.AlarmReceiver" android:process=":remote"></receiver>
这里将重复执行的间隔设为5*1000(5秒)的效果图如下: