Android开发之广播机制

首先是主程序:

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对象。

 

posted @ 2013-01-28 16:52  民工木子  阅读(163)  评论(0编辑  收藏  举报