Android通过AlarmManager类实现最简单的闹钟

Android通过AlarmManager类实现闹钟

简介

  闹钟是生活中最常用的功能了,很多App都可以加入该功能,提醒用户某个时刻要做的事情。在Android系统中可以通过AlarmManager类实现闹钟,AlarmManager类是专门用来设定在某个指定的时间去完成指定的事件。AlarmManager提供了访问系统警报的服务,只要在程序中设置了警报服务,AlarmManager就会通过onReceive()方法去还行这些事件,就算系统处于待机状态,同样不会影响运行。可以通过Context.getSystemService方法来获取该服务。接下来我们将使用AlarmManager来制作一个最简单的闹钟。

让我们来看一下AlarmManager都为我们提供了哪些方法,如下:

方法作用
cancel取消AlarmManager服务
set设置AlarmManager服务
setInexactRepeating设置不精确周期
setRepeating设置精确周期
setTimeZone设置时区

  要实现闹钟,首先需要创建一个继承自BroadcastReceiver的类,实现onReceive方法来接收这个Alarm服务,然后通过建立Intent和PendingIntent连接来调用Alarm组件,并通过TimePickerDialog来设置时间,当时间到我们指定的时间后onReceive方法接收到Alarm服务后即可进行提示。
  
让我们实现主界面布局,效果如下:
这里写图片描述

接下来让我们实现接收Alarm服务的AlarmReceiver类,该类比较简单,在收到消息后用一个Toast来提示用户,具体实现代码如下:

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "您设置的时间到了!",
            Toast.LENGTH_SHORT).show();
    }
}

由于使用了BroadcastReceiver,因此我们需要在AndroidManifest.xml文件中对其进行声明,如下:

<receiver android:name=".AlarmReceiver" android:process=":remote" />

接下来,在MainActivity中我们实现“设置闹钟”和“取消闹钟”的事件监听,让我们来看一下具体实现代码:

public class MainActivity extends Activity {
    private Button btnSet, btnCancel;
    private TextView info;
    private Calendar calendar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnSet = (Button) findViewById(R.id.setalarm);
        btnCancel = (Button) findViewById(R.id.cancelalarm);
        info = (TextView) findViewById(R.id.info);

        calendar = Calendar.getInstance();

        btnSet.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                calendar.setTimeInMillis(System.currentTimeMillis());
                int mHour = calendar.get(Calendar.HOUR_OF_DAY);
                int mMinute = calendar.get(Calendar.MINUTE);
                new TimePickerDialog(MainActivity.this,
                        new TimePickerDialog.OnTimeSetListener() {
                            @Override
                            public void onTimeSet(TimePicker view,
                                    int hourOfDay, int minute) {
                                // TODO Auto-generated method stub
                                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);
                                // 建立Intent和PendingIntent来调用目标组件
                                Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
                                PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
                                // 获取闹钟管理的实例
                                AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                                // 设置闹钟
                                am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                                // 设置周期闹钟
                                am.setRepeating(AlarmManager.RTC_WAKEUP,
                                        System.currentTimeMillis() + (10 * 1000),
                                        (24 * 60 * 60 * 1000), pendingIntent);
                                String tmpS = "设置闹钟时间为" + format(hourOfDay)
                                        + ":" + format(minute);
                                info.setText(tmpS);
                            }
                        }, mHour, mMinute, true).show();
            }
        });

        btnCancel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(MainActivity.this,
                        AlarmReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(
                        MainActivity.this, 0, intent, 0);
                // 获取闹钟管理实例
                AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                // 取消
                am.cancel(pendingIntent);
                info.setText("闹钟已经取消");
            }
        });
    }

    // 格式化字符串7:3-->07:03
    private String format(int x) {
        String s = "" + x;
        if (s.length() == 1) {
            s = "0" + s;
        }
        return s;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

  在上述代码中我们使用了PendingIntent,PendingIntent这个类用于处理即将发生的事情,PendingIntent可以看作是对Intent的包装,通常通过getActivity、getBroadcast、getService来得到PendingIntent的实例,当前Activity并不能马上启动它所包含的Intent,而是在外部执行PendingIntent时,调用Intent。正是由于PendingIntent中保存有当前App的context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行PendingIntent里的Intent,就算在执行时当前App已经不存在了,也能通过保存在PendingIntent里的Context照样执行Intent,另外还可以处理Intent执行后的操作。常和AlarmManager和NotificationManager一起使用。
  至此,一个简单的功能就实现了。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值