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

来源:互联网 发布:centos 6.9 编辑:程序博客网 时间:2024/05/22 12:22

这个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>
0 0
原创粉丝点击