一、Android Broadcast 知识点普及
1.Normal Broadcast(普通广播):完全异步,同一时刻所有接收者都能收到,缺点是不能将处理结果传递给下一个接收者,无法终止Broadcast Intent的传播。用sendBroadcast()方法发生普通广播
2.Ordered Broadcast(有序广播):接收者按预先声明的优先级依次接收Broadcast,优先级高的先接收,可以用Android:priority或setPriority()指定,数值越大优先级越高。有序广播可以被终止,优先级高的能终止优先级低的,用abortBroadcast()方法。并且优先收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将结果本接收者的处理结果存入Broadcast中,下一个接收者收到的时候可以用Bundle bundle=getResultExtras(true)来获取上一个接收者的处理结果。用senOrderedBroadcast()发送有序广播。
下面是一个例子:
MainActivity.Java:
package com.example.wanglunhui.sortedbroadcast; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button send; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取程序中的send按钮 send = (Button) findViewById(R.id.send); send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 创建Intent对象 Intent intent = new Intent(); intent.setAction("org.crazyit.action.CRAZY_BROADCAST"); intent.putExtra("msg", "简单的消息"); // 发送有序广播 sendOrderedBroadcast(intent, null); } }); } }MyReceiver.java里面存入了处理结果并向下一个发送:
package com.example.wanglunhui.sortedbroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, " 接收到的Intent的Action为:" + intent.getAction() + "\n消息内容是:" + intent.getStringExtra("msg") , Toast.LENGTH_LONG).show(); // 创建一个Bundle对象,并存入数据 Bundle bundle = new Bundle(); bundle.putString("first", "第一个BroadcastReceiver存入的消息"); // 将bundle放入结果中 setResultExtras(bundle); // 不取消Broadcast的继续传播 //abortBroadcast(); // ①若取消时,则下一个接收者不能收到此广播 } }
下一个Receiver:MyReceiver2.java:
package com.example.wanglunhui.sortedbroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = getResultExtras(true); // 解析前一个BroadcastReceiver所存入的key为first的消息 String first = bundle.getString("first"); Toast.makeText(context, "峰喜Broadcast存入的消息为:" + first, Toast.LENGTH_LONG).show(); } }
AndroidManifest.java用设置优先级:
<receiver android:name=".MyReceiver">
<intent-filter android:priority="20"> <action android:name="org.crazyit.action.CRAZY_BROADCAST" /> </intent-filter> </receiver> <receiver android:name=".MyReceiver2"> <intent-filter android:priority="0"> <action android:name="org.crazyit.action.CRAZY_BROADCAST" /> </intent-filter> </receiver>