Android 之 BroadcaseReceiver
1.在AndroidManifest.xml中注册
<receiver android:name=".MyReceiver"> <intent-filter > <action android:name="myaction"/> </intent-filter> </receiver>
2.在Activity中注册
MyReceiver receiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("myaction"); registerReceiver(receiver, filter);
两种注册BroadcastReceiver方法的比较:
现在我们了解了两种注册BroadcastReceiver的方法之后,需要考虑一下这两种方法适用的场合:
i. 第一种注册的方法可以保证在应用程序安装之后,BroadcastReceiver始终处于活动状态,通常用于监听系统状态的改变,比如说手机的电量,wifi网卡的状态(当然,监视这些东西也是取决于软件的需求)。对于这样的BroadcastReceiver,通常是在产生某个特定的系统事件之后,进行相应的操作,比如说wifi网卡打开时,给用户一个提示;
ii. 第二种注册方法相对第一种要灵活的多,这样注册的BroadcastReceiver通常用于更新UI的状态。一般来说,都是在一个Activity启动的时候使用这样的方法注册BroadcastReceiver,一旦接收到广播的事件,就可以在onReceive方法当中更新当前的这个Activity当中的控件。但是需要注意的是如果这个Activity不可见了,就应该调用unregisterReceiver方法来解除注册;
函数:
i. registerReceiver(receiver,filter);
这个函数的作用就是将一个BroadcastReceiver注册到应用程序当中,这个函数接收两个参数,第一个参数是需要注册的BroadcastReceiver对象,第二个是一个IntentFilter。第一个参数是非常容易理解的,第二个参数的作用是定义了哪些Intent才能触发这个注册的BroadcastReceiver对象。类似于前面所讲解的
<intent-filter>标签的作用;
ii. unregisterReceiver(receiver);
这个方法就非常的简单了,用于解除BroadcastReceiver的绑定状态。一旦解除完成,响应的BroadcastReceiver就不会再接收系统所广播的Intent了。
下面是源代码Demo:
Acitivity:
package com.example.broadcast; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button mybt; Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mybt = (Button)findViewById(R.id.mybt); mybt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub /*注册BroadcastReceiver有两种方式: 一种方式是,静态的在AndroidManifest.xml中用<receiver>标签生命注册,并在标签内用<intent- filter>标签设置过滤器。 另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter 对象,然后在需要注册的地方调Context.registerReceiver()方法, 如果取消时就调用 Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时, BroadcastReceiver也就自动取消注册了。(特别注意,有些可能需要后台监听的,如短信消息)*/ // MyReceiver receiver = new MyReceiver(); // IntentFilter filter = new IntentFilter(); // filter.addAction("myaction"); // registerReceiver(receiver, filter); //创建Intent对象 intent = new Intent(); //设置Intent的Action属性 intent.setAction("myaction"); //加入信息 intent.putExtra("msg", "普通广播"); //传送信息 sendBroadcast(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
BroadcastReceiver:
package com.example.broadcast; 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 Toast.makeText(context,"Action is:"+intent.getAction() +"\n msg is:"+intent.getStringExtra("msg") , Toast.LENGTH_LONG) .show(); } }
Service发送广播:
Intent intent = new Intent(); intent.setAction("com.he.chat.receiveNewMessage");//创建过滤条件 intent.putExtra("key", "newMessage");//传递参数 intent.putExtra("sender", msg.getSender());//传递参数 sendBroadcast(intent);
Manifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcast" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".MyReceiver"> <intent-filter > <action android:name="myaction"/> </intent-filter> </receiver> <activity android:name="com.example.broadcast.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>