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>
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在机器人技术中,轨迹规划是实现机器人从一个位置平稳高效移动到另一个位置的核心环节。本资源提供了一套基于 MATLAB 的机器人轨迹规划程序,涵盖了关节空间和笛卡尔空间两种规划方式。MATLAB 是一种强大的数值计算与可视化工具,凭借其灵活易用的特点,常被用于机器人控制算法的开发与仿真。 关节空间轨迹规划主要关注机器人各关节角度的变化,生成从初始配置到目标配置的连续路径。其关键知识点包括: 关节变量:指机器人各关节的旋转角度或伸缩长度。 运动学逆解:通过数学方法从末端执行器的目标位置反推关节变量。 路径平滑:确保关节变量轨迹连续且无抖动,常用方法有 S 型曲线拟合、多项式插值等。 速度和加速度限制:考虑关节的实际物理限制,确保轨迹在允许的动态范围内。 碰撞避免:在规划过程中避免关节与其他物体发生碰撞。 笛卡尔空间轨迹规划直接处理机器人末端执行器在工作空间中的位置和姿态变化,涉及以下内容: 工作空间:机器人可到达的所有三维空间点的集合。 路径规划:在工作空间中找到一条从起点到终点的无碰撞路径。 障碍物表示:采用二维或三维网格、Voronoi 图、Octree 等数据结构表示工作空间中的障碍物。 轨迹生成:通过样条曲线、直线插值等方法生成平滑路径。 实时更新:在规划过程中实时检测并避开新出现的障碍物。 在 MATLAB 中实现上述规划方法,可以借助其内置函数和工具箱: 优化工具箱:用于解决运动学逆解和路径规划中的优化问题。 Simulink:可视化建模环境,适合构建和仿真复杂的控制系统。 ODE 求解器:如 ode45,用于求解机器人动力学方程和轨迹执行过程中的运动学问题。 在实际应用中,通常会结合关节空间和笛卡尔空间的规划方法。先在关节空间生成平滑轨迹,再通过运动学正解将关节轨迹转换为笛卡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值