首先是主程序:
public class BroadcastReceiverTest extends Activity {
private Button myButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myButton = (Button)findViewById(R.id.myButton);
myButton.setOnClickListener(newButton.OnClickListener(){
@Override
public void onClick(View v) {
Intent myIntent = new Intent();
myIntent.setAction(myIntent.ACTION_EDIT);
BroadcastReceiverTest.this.sendBroadcast(myIntent);//发送广播
}
});
}
}
然后是BroadcastReceiver类:
public class ReceiverTest extends BroadcastReceiver { public ReceiverTest(){ System.out.println("ReceiverTest"); } @Override public void onReceive(Context arg0, Intent arg1) { System.out.println("onReceive"); } }
最后是manifest里面的配置:
<receiver android:label="@string/app_name" android:name=".ReceiverTest" > <intent-filter > <action android:name="android.intent.action.EDIT" /> </intent-filter> </receiver>
在上面的例子中,Intent的Action类型为ACTION_EDIT,而在AndroidManifest.xml中注册的receiver类型也是edit,<action android:name="android.intent.action.EDIT"/>
,这就表明这两个Action进行了匹配。即执行了sendBroadcast方法之后,类型为edit的receiver就可以进行接收了。类型匹配成功的话,才会生成receiver的对象,从而调用onReceiver方法。上文中已经谈到,每次接收广播都会生成一个新的receiver对象。在处理完毕之后,这个对象就不会再被使用了。
注册Broadcast Receiver的方法
BroadcastReceiver能够监听被广播出来的对象,一般是会用Intent来进行广播。那么,达到能够监听的目的,则BroadcastReceiver必须进行注册。注册方法有两种:
在AndroidManifest.xml文件中进行注册:
这里面需要注意一点的是,如果我在AndroidManifest.xml文件中进行注册BroadcastReceiver的话,无论这个BroadcastReceiver所在的应用程序是运行状态还是关闭状态,这个BroadcastReceiver都是活动的,都可以接收到广播的事件。例如,短信息的接收,电池耗电量的显示等应用程序。我们在待机状态时需要监听这些状态,但是我们不可能一直打开应用程序。
在应用程序的代码中进行注册:
当我们需要更新Activity里面的控件的状态的时候,则需要在应用程序的代码中进行注册,这个时候我们如果在AndroidManifest.xml中注册的话就不太合适了。因为只有我们在Activity能看到的时候才进行更新,而Activity看不见的时候,这个BroadcastReceiver就应该关闭。否则会浪费各种资源。因此,这个时候就需要在应用程序的代码中进行注册。在Activity启动以后注册BroadcastReceiver,在Activity不可见后取消注册。
注册的代码很简单就是registerReceiver(receiver,filter);
相应的,取消注册的代码为unregisterReciver(receiver);
参数receiver表示一个BroadcastReceiver对象( TheBroadcastReceiver to handle the broadcast.);filter表示一个Intent-filter对象( Selectsthe Intent broadcasts to be received.),与我们在AndroidManifest.xml 文件中所使用的Intent-filter标签的作用是一样的。后面会讨论到如何创建一个Intent-filter对象。