Android Api Demos登顶之路(三十一)Alarm Controller

本文介绍了如何使用Android系统提供的闹钟定时器功能来实现一次性闹钟和重复性闹钟的功能。通过创建BroadcastReceiver类来接收闹钟定时器发送的广播,并在按钮点击事件中调用相应的闹钟定时器方法来实现闹钟的启动和停止。此外,还详细解释了如何使用AlarmManager和PendingIntent来设置闹钟定时器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个demo演示了闹钟定时器的用法。功能与TimerTask功能类似,但Alarm 即使在当前应用退出后也可以做到Schedule一个任务在指定的时刻执行。
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/info" />
    <Button 
        android:id="@+id/bt_one_shot"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_gravity="center_horizontal"
        android:text="One shot alarm"/>
    <Button 
        android:id="@+id/bt_repeating"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_gravity="center_horizontal"
        android:text="Start repeating alarm"/>
    <Button 
        android:id="@+id/bt_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_gravity="center_horizontal"
        android:text="Stop repeating alarm"/>

</LinearLayout>

OneShotReceiver.java

public class OneShotReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String text="接收到了一个定时器发送的广播";
        Toast.makeText(context,text, 1).show();
    }

}

RepeatingAlarmReceiver.java

public class RepeatingAlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String text="接收到了定时器重复发送的广播";
        Toast.makeText(context,text, 1).show();
    }

}

ManiActivity

public class MainActivity extends Activity implements OnClickListener {
    private Toast toast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt_one_shot = (Button) findViewById(R.id.bt_one_shot);
        Button bt_repeating = (Button) findViewById(R.id.bt_repeating);
        Button bt_stop = (Button) findViewById(R.id.bt_stop);
        bt_one_shot.setOnClickListener(this);
        bt_repeating.setOnClickListener(this);
        bt_stop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_one_shot:
            oneShotAlarm();
            break;
        case R.id.bt_repeating:
            repeatingAlarm();
            break;
        case R.id.bt_stop:
            stopAlarm();
            break;
        default:
            break;
        }
    }

    private void stopAlarm() {
        Intent intent = new Intent(this, RepeatingAlarmReceiver.class);
        // 创建一个延迟意图,用于定时发送广播
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

        // 获取闹钟定时器
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        // 取消发送任务
        am.cancel(sender);

        if (toast != null) {
            toast.cancel();
        } else {
            toast=Toast.makeText(this, "已取消发送广播", 1);
            toast.show();
        }

    }

    private void repeatingAlarm() {
        Intent intent = new Intent(this, RepeatingAlarmReceiver.class);
        // 创建一个延迟意图,用于定时发送广播
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
        // 获取一个相对时间:从开机到当前的毫秒数
        long firstTime=SystemClock.elapsedRealtime();
        firstTime+=5*1000;

        // 获取闹钟定时器
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        // 设置一重复性定时器.
        //闹钟类型表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用相对时间
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);

        if (toast != null) {
            toast.cancel();
        } else {
            toast=Toast.makeText(this, "开始计时,5秒后将重复发送广播...", 1);
            toast.show();
        }
    }

    private void oneShotAlarm() {
        Intent intent = new Intent(this, OneShotReceiver.class);
        // 创建一个延迟意图,用于定时发送广播
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
        // 创建一个定时器,时间间隔为5秒
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        // 添加一个时间间隔
        calendar.add(Calendar.SECOND, 5);

        // 获取闹钟定时器
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        // 设置一次性定时器,第一个参数表示闹钟类型,第二个参数表示触发闹钟需等待的时间,第三个参数
        // 表示闹钟响应的动作
        // RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间
        am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

        if (toast != null) {
            toast.cancel();
        } else {
            toast=Toast.makeText(this, "开始计时,5秒后将发送广播...", 1);
            toast.show();
        }
    }

}

配置文件

 <!-- android:process=":remote"表示当需要接收广播时自动创建进程 -->
        <receiver android:name="com.fishtosky.alarmcontroller.OneShotReceiver"
            android:process=":remote"></receiver>
        <receiver android:name="com.fishtosky.alarmcontroller.RepeatingAlarmReceiver"
            android:process=":remote"></receiver>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值