【例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;
//【例4-3】AlarmManager时钟服务示例
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s=intent.getAction();
Toast.makeText(context, "收到广播"+s, Toast.LENGTH_SHORT).show();
}
}
控制文件AlarmManagerActivity.java源代码
package com.myapp.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;
//【例4-3】AlarmManager时钟服务示例。
public class AlarmManagerActivity extends Activity
{
Button btn1, btn2, btn3;
Intent intent;
@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;
}
}
}
void timing()//定时发送一个广播
{
intent = new Intent(this, AlarmReceiver.class);
intent.setAction("once"); //练习时,可以加一个action属性, 也就是一个字符串标记
PendingIntent sender = PendingIntent.getBroadcast(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(this, "15秒后alarm开启",
Toast.LENGTH_LONG).show();
}
void cycle()//循环发送广播
{
Intent intent =new Intent(this, AlarmReceiver.class);
intent.setAction("repeating"); //练习时,可以加一个action属性, 也就是一个字符串标记
PendingIntent sender = PendingIntent.getBroadcast(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(this, AlarmReceiver.class);
intent.setAction("cancel");
PendingIntent sender=PendingIntent
.getBroadcast(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>

