定时之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秒)的效果图如下:

posted @ 2016-06-14 21:16  ts-android  阅读(442)  评论(0编辑  收藏  举报