Broadcast被分为如下两种:
通过sendBroadcast()来发送广播:
1.新建BroadcastReceiver文件MyReceiver:
MainActivity的代码:
public class MainActivity extends ActionBarActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btgb).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btgb: Intent intent = new Intent(); intent.setAction("songsong.com.broadcastreceivertext.intent.action.MyReceiver"); sendBroadcast(intent); break; } } }
MyReceiver.java文件内容:
public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { System.out.println("MyReceiver"); } }当符合该MyReceiver的广播出现时,onReceive方法将会被触发,从而在该方法中显示消息。
在AndroidManifest中application定义
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true" > <intent-filter> <action android:name:"songsong.com.broadcastreceivertext.intent.action.MyReceiver"/> </intent-filter> </receiver>
上面发送广播的程序中指定发送广播时所用的Intent的Action为songsong.com.broadcastreceivertext.intent.action.MyReceiver
-----------------------------------------------------
通过sendOrderedBroadcast()来发送广播:
接下来是一个发送有序广播的示例,Activity界面上只有一个按钮,用于发送一条有序广播:
MyReceiver.java文件内容:
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btnsend).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent();//创建Intent对象 intent.setAction("songsong.com.broadcast_orderd.intent.action.MyReceiver"); intent.putExtra("msg", "简单的第1条信息"); sendOrderedBroadcast(intent, null); //发送有序广播,null为权限 } }); }程序中指定了Intent的Action属性,再调用sendOrderedBroadcast()方法来发送有序广播,它会按优先级依次触发每个BroadcastReceiver的OnReceive()方法。
接下来定义第一个BroadcastReceiver。
public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, intent.getAction() + intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show(); Bundle bundle = new Bundle();//创建一个Bundle对象并存入信息 bundle.putString("data1", "这是第一个MyReceiver发出的信息"); setResultExtras(bundle); //将Bundle放入结果中 //abortBroadcast();//取消Broadcast继续传播 } }上面BroadcastReceiver不仅处理了所接收到的消息,而且还处理结果中存入的key为“data1”的消息,这个消息将可以被第二个BroadcastReceiver解析出来。
如果abortBroadcast();代码执行,Broadcast将会终止传播,那么优先级别比MyReceiver 低的BroadcastReceiver将不会被触发
在AndroidManifest.xml文件中部署该BroadcastReceiver,并指定优先级为20,如下:
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true" > <intent-filter android:priority="20" > <action android:name="songsong.com.broadcast_orderd.intent.action.MyReceiver" /> </intent-filter> </receiver>接下来为程序提供第二个 BroadcastReceiver,这个将会解析前一个 BroadcastReceiver所存入的key为data1的消息。如下:
public class MyReceiver2 extends BroadcastReceiver { public MyReceiver2() { } @Override public void onReceive(Context context, Intent intent) { Bundle bundle = getResultExtras(true); String data = bundle.getString("data1");//解析前一个<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">BroadcastReceiver</span></span></span>所存入的key为data1的消息 Toast.makeText(context, data, Toast.LENGTH_SHORT).show(); } }在AndroidManifast.xml文件中配置该 BroadcastReceiver,并指定优先级别为19,如下:
<receiver android:name=".MyReceiver2" android:enabled="true" android:exported="true" > <intent-filter android:priority="19" > <action android:name="songsong.com.broadcast_orderd.intent.action.MyReceiver" /> </intent-filter> </receiver>MyReceiver的优先级更高点,MyReceiver2略低, abortBroadcast();被注释的情况下,那么程序会先运行MyReceiver再到MyReceiver2。如果abortBroadcast();没有被注释的话,程序只运行MyReceiver。
——————————————————————————
为BroadcastReceiver指定Intent,有两种方式:
1、使用代码进行指定,调用BroadcastReceiver的context的registerReceiver(BroadcastReceiver receiver,filter)方法指定,代码如下:
ActivityReceiver activityReceiver = new ActivityReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("songsong.com.broadcast_orderd.intent.action.MyReceiver"); registerReceiver(activityReceiver, filter); //注册广播
2、在AndroidManifest.xml文件中配置。如下:
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="songsong.com.broadcast_orderd.intent.action.MyReceiver" /> </intent-filter> </receiver>
在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理。