项目短视频(时长00:17)
操作示范如下(时长27:46)

【例4-3】广播和时钟服务示例
时钟服务主要有两种:在指定时长后执行某项操作、周期性地执行某项操作。
布局文件alarmmanager.xml的源代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_marginTop="50dp"
android:layout_marginLeft="20dp"
>
<TextView
android:id="@+id/txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="24sp"/>
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="15秒后发送一个广播"
android:textSize="20sp" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="每10秒发送一个广播"
android:textSize="20sp" />
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消通知"
android:textSize="20sp" />
</LinearLayout>
定义广播接收器AlarmReceiver.java
package com.example.chap04;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到广播", Toast.LENGTH_LONG).show();
}
}
控制文件AlarmManagerActivity.java源代码
package com.example.chap04;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import java.util.Calendar;
public class AlarmManagerActivity extends Activity
{
Button btn1, btn2, btn3;
Intent intent;
PendingIntent sender;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.alarmmanager);
btn1=(Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new mClick());
btn2=(Button)findViewById(R.id.btn2);
btn2.setOnClickListener(new mClick());
btn3=(Button)findViewById(R.id.btn3);
btn3.setOnClickListener(new mClick());
}
class mClick implements OnClickListener
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn1:
timing(); break;
case R.id.btn2:
cycle(); break;
case R.id.btn3:
cancel(); break;
}
}
}
/**
定时:15秒后发送一个广播,广播接收后Toast提示定时操作完成
*/
void timing()
{
intent = new Intent(AlarmManagerActivity.this, AlarmReceiver.class);
sender = PendingIntent.getBroadcast(AlarmManagerActivity.this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 15); //设定一个15秒后的时间
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
sender);
Toast.makeText(AlarmManagerActivity.this, "15秒后alarm开启",
Toast.LENGTH_LONG).show();
}
/**
* 定义循环:每10秒发送一个广播,广播接收后Toast提示定时操作完成
*/
void cycle()
{
Intent intent =new Intent(AlarmManagerActivity.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(AlarmManagerActivity.this,
0, intent, 0);
/* 开始时间 */
long firstime=SystemClock.elapsedRealtime();
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
/* 10秒一个周期,不停的发送广播 */
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP ,
firstime, 10*1000, sender);
}
/**
* 取消周期发送信息
*/
void cancel()
{
Intent intent =new Intent(AlarmManagerActivity.this, AlarmReceiver.class);
PendingIntent sender=PendingIntent
.getBroadcast(AlarmManagerActivity.this, 0, intent, 0);
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.cancel(sender);
}
}
注册广播接收器AlarmReceiver,打开项目配置文件AndroidManifest.xml,注册广播接收器,并修改要启动的Activity类名
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.chap04">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".AlarmManagerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true"/>
</application>
</manifest>

