发送广播的方法和启动Activity的方法是非常类似的。首先新建一个Intent对象,然后使用sendBroadcast()
、sendOrderedBroadcast()
或者sendStickyBroadcast()
发送广播:
sendBroadcast()
:发送一条普通广播。这种广播接收不分先后,而且不能截断,不能被修改。sendOrderedBroadcast()
:发送一条有序广播。这种广播按照一定的顺序被接收,接收顺序可以通过在
标签下设定android:priority
来改变。可以使用abortBroadcast()
方法终止广播的传播。sendStickyBroadcast()
:发送一条粘滞广播。这种广播在没有被接收的时候会一直存在。所以即使在广播发送后注册的接收器也能接受到这种广播。这种广播使用的使用要添加相应的权限。由于这种广播带来了很多安全性的问题,所以在API 21 以后已经被废弃了。BroadcastReceiver
,并重写其中的onReceive()
方法;
标签下添加
标签。在
标签下可以添加多个
来指定接收广播的类型;registerReceiver()
和unRegisterReceiver()
方法动态注册。程序是这样子的:通过点击三个不同的按钮,可以发送三种不同的广播:
布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.broadcastreceiverdemo.MainActivity" >
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送普通广播" />
<Button
android:id="@+id/button_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送有序广播" />
<Button
android:id="@+id/button_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送粘滞广播" />
LinearLayout>
在主程序中发送广播:
public class MainActivity extends Activity implements OnClickListener{
Button button1;
Button button2;
Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button_1);
button2 = (Button) findViewById(R.id.button_2);
button3 = (Button) findViewById(R.id.button_3);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button_1:
Intent intent1 = new Intent();
intent1.setAction("BC_One");
intent1.putExtra(Intent.EXTRA_TEXT, "这是一条普通广播");
//如果明确知道广播的唯一接收者,也可以使用显式的intent
//intent.setClass(MainActivity.this, MyReceiver1.class);
sendBroadcast(intent1);
break;
case R.id.button_2:
Intent intent2 = new Intent();
intent2.setAction("BC_Two");
intent2.putExtra(Intent.EXTRA_TEXT, "这是一条有序广播");
sendOrderedBroadcast(intent2, null);
break;
case R.id.button_3:
Intent intent3 = new Intent();
intent3.setAction("BC_Three");
intent3.putExtra(Intent.EXTRA_TEXT, "这是一条粘滞广播");
sendStickyBroadcast(intent3);
//动态注册第三个广播接收器,注意这个接收器注册在广播发送之后
IntentFilter filter = new IntentFilter();
filter.addAction("BC_One");
filter.addAction("BC_Two");
filter.addAction("BC_Three");
MyReceiver3 receiver = new MyReceiver3();
registerReceiver(receiver, filter);
break;
default:
break;
}
}
}
三个广播接收器:
public class MyReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(Intent.EXTRA_TEXT);
Log.d("MyReceiver1", "收到一条广播:" + s);
Bundle bundle = getResultExtras(true);
String extraString = bundle.getString(Intent.EXTRA_TEXT);
if(extraString != null){
Log.d("MyReceiver1", "收到一条广播:" + extraString);
}
}
}
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(Intent.EXTRA_TEXT);
Log.d("MyReceiver2", "收到一条广播:" + s);
Bundle bundle = new Bundle();
bundle.putString(Intent.EXTRA_TEXT, "这是第2条广播");
setResultExtras(bundle);
}
}
public class MyReceiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(Intent.EXTRA_TEXT);
Log.d("MyReceiver3", "收到一条广播:" + s);
Bundle bundle = getResultExtras(true);
String extraString = bundle.getString(Intent.EXTRA_TEXT);
if(extraString != null){
Log.d("MyReceiver3", "收到一条广播:" + extraString);
}
}
}
setResultExtras()
可以用来更改广播中的内容;getResultExtras()
可以用来得到广播中的内容。这两个方法都只对有序广播有用。
前两个广播在Manifest文件中注册,第三个广播使用动态注册的方法,在广播发送以后被注册。
<receiver android:name="com.example.broadcastreceiverdemo.MyReceiver1" >
<intent-filter>
<action android:name="BC_One" />
intent-filter>
<intent-filter android:priority="-100" >
<action android:name="BC_Two" />
intent-filter>
<intent-filter>
<action android:name="BC_Three" />
intent-filter>
receiver>
<receiver android:name="com.example.broadcastreceiverdemo.MyReceiver2" >
<intent-filter>
<action android:name="BC_One" />
intent-filter>
<intent-filter android:priority="100" >
<action android:name="BC_Two" />
intent-filter>
<intent-filter>
<action android:name="BC_Three" />
intent-filter>
receiver>
android:priority
属性可以指定广播接收的顺序,但只对有序广播有用。
最后要在Manifest文件中添加需要的权限:
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
运行结果如下: