Broadcast
Receiver顾名思义是指广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别的(例如,某个按钮单击事件),而广播事件处理机制是系统级别的。我们可是使用Intent来启动一个程序组件,还可以实用sendBroadcast()犯非法来发起一个系统级别的时间广播来传递消息。我们可以在应用程序中实现Broadcast
Receiver 来监听和响应这些广播的Intent.
事件的广播比较简单同样还是构建Intent对象。然后调用sendBroadcast()方法将广播发出。时间的接收是通过定义一个继承BroadcastReceiver的类来实现的。继承后覆盖其onReceive()方法,在该方法中相依时间。
Android系统中定义了很多标准的Broadcast Action
来响应系统广播事件。例如,ACTION_TIME_CHANGED(时间改变触发器),ACTION_BOOT_COMPLETED(系统启动完成后触发),ACTION_PACKAGE_ADDED(添加包时触发),ACTION_BATTERY_CHANGED(电量低时触发)。当然,我们也可以自己定义Broadcast
Receiver接收广播事件。
下面以一个Notification的实例来演示一下 Broadcast
Receiver组件并没有提供可视化的界面来显示广播信息,这里我们使用Notification和NotificationManager来实现可视化的信息显示,通过使用它们我们可以显示广播信息的内容,图标以及振动等信息。
package com.braodcastR;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class BroadcastReceiverTActivity extends Activity {
private Button but;
private final static String
MY_ACTION="com.broadcastR.action.MY_ACTION";
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//实例化Button
but=(Button)findViewById(R.id.button1);
//添加监听器
but.setOnClickListener(new OnClickListener(){
@Override
public void
onClick(View v) {
//
TODO Auto-generated method stub
//实例化intent
Intent
intent=new Intent();
//设置action属性
intent.setAction(MY_ACTION);
//发起广播
sendBroadcast(intent);
}});
}
}
该类负责发起广播
package com.braodcastR;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent
intent) {
// TODO Auto-generated method
stub
//实例化Intent
Intent i=new Intent();
//在新任务中启动Activity
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//设置intent启动组件
i.setClass(context, NotificatinActivity.class);
//启动Activity显示通知
context.startActivity(i);
}
}
该类负责接收广播后启动另一个Activity来显示通知
package com.braodcastR;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class NotificatinActivity extends Activity {
//声明按钮
private Button but;
//声明Notification
private Notification n;
//声明NotificationManager
private NotificationManager mm;
//Notification标示ID
private static final int ID=1;
@Override
protected void onCreate(Bundle
savedInstanceState) {
// TODO Auto-generated method
stub
super.onCreate(savedInstanceState);
setContentView(R.layout.nt);
//实例化按钮
but=(Button)findViewById(R.id.button1);
//获得NotificationManager实例
String
service=Context.NOTIFICATION_SERVICE;
mm=(NotificationManager)getSystemService(service);
//实例化Notification
n=new Notification();
//设置显示图标,该图标会在状态栏里显示
int
icon=n.icon=R.drawable.icon;
//设置提示信息 该信息也会在状态栏里显示
String tickerText="Text
NOTIFICATION";
//显示时间
Long
when=System.currentTimeMillis();
Notification nn=new
Notification(icon,tickerText,when);
//实例化Intent
Intent intent=new
Intent(this,BroadcastReceiverTActivity.class);
//获得pendingIntent
PendingIntent
pi=PendingIntent.getActivity(this, 0, intent, 0);
//设置时间信息
nn.setLatestEventInfo(this,"My
Title", "My Content", pi);
//发出通知
mm.notify(ID, nn);
//为按钮添加监听器
but.setOnClickListener(canListener);
}
private OnClickListener canListener=new
OnClickListener(){
@Override
public void onClick(View v)
{
// TODO
Auto-generated method stub
//取消通知
mm.cancel(ID);
}};
}
该类负责显示通知
最后是在AndroidManifest.xml配置文件中声明广播接收组件
encoding="utf-8"?>
package="com.braodcastR"
android:versionCode="1"
android:versionName="1.0">
/>
android:label="@string/app_name">
android:name=".BroadcastReceiverTActivity"
android:label="@string/app_name">
/>
android:name="android.intent.category.LAUNCHER"
/>
android:name="MyReceiver">
android:name="com.broadcastR.action.MY_ACTION">
android:label="@string/app_name">
下面再以一个简单的AlarmManager例子来演示一下用Android来实现一个闹钟,可以实用AlarmManager来实现,它提供了一种系统级的提示服务,允许你安排在将来某个时间执行一个服务,AlarmManager对象一般不直接实例化而是通过Context.getSystemService(Context.ALARM_SERVICE)方法获得。
package com.amarmT;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class AlarmManagerTActivity extends Activity {
//声明Button
private Button setbut,canbut;
//定义广播Action
private static final String
BC_ACTION="com.amarmT.action.BC_ACTION";
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//实例化Button
setbut=(Button)findViewById(R.id.setbut);
canbut=(Button)findViewById(R.id.canbut);
//获得AlarmManager实例
final AlarmManager
am=(AlarmManager)getSystemService(ALARM_SERVICE);
//实例化Intent
Intent intent=new
Intent(AlarmManagerTActivity.this,MyReceiver.class);
//设置Intent属性
intent.setAction(BC_ACTION);
intent.putExtra("msg","go to bed");
//实例化pendingIntent
final PendingIntent
pi=PendingIntent.getBroadcast(AlarmManagerTActivity.this, 0,
intent,0);
//获得系统时间
final long time=System.currentTimeMillis();
//设置按钮单击事件
setbut.setOnClickListener(new OnClickListener(){
@Override
public void
onClick(View v) {
//
TODO Auto-generated method stub
//重复显示从当前时间开始
间隔2秒
am.setRepeating(AlarmManager.RTC_WAKEUP,
time, 2*1000, pi);
}});
canbut.setOnClickListener(new OnClickListener(){
@Override
public void
onClick(View v) {
//
TODO Auto-generated method stub
//移除
am.cancel(pi);
}});
}
该类为两个按钮添加单击监听事件,一个用于设置闹钟,一个用于取消闹钟。
package com.amarmT;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent
intent) {
// TODO Auto-generated method
stub
//获得提示信息
String
msg=intent.getStringExtra("msg");
//显示提示信息
Toast.makeText(context, msg,
Toast.LENGTH_LONG).show();
//日志中显示
Log.i("msg", msg);
}
}
该类用于接收广播显示信息
最后是配置文件中注册
encoding="utf-8"?>
package="com.amarmT"
android:versionCode="1"
android:versionName="1.0">
/>
android:label="@string/app_name">
android:name=".AlarmManagerTActivity"
android:label="@string/app_name">
/>
android:name="android.intent.category.LAUNCHER"
/>
android:name="MyReceiver">
android:name="com.amarmT.action.BC_ACTION">