Android中的广播接收者是Android四大组件之一,广播机制是一个典型的发布—订阅模式,即观察者模式。
广播机制最大的特点就是发送方并不关心接收方是否接收到数据,也不关心接收方如何处理数据,通过这样的方式来达到接收方完全解耦。
Android广播机制包含三个元素,分别是用于发送广播的Broadcast,接收广播的BroadcastReceiver以及用于传递信息的intent。Android广播可分为:普通广播、有序广播、本地广播和Sticky广播。
1、普通广播
普通广播是完全异步的,通过Context的sendBroadcast(),函数来发送,消息传递的效率比较高,但是所有的receviers执行的顺序不确定。缺点:接收者不能将处理的结果传递给下一个接收者,并且无法阻止广播Intent的传播,一直到没有与之匹配的广播接收器为止。
2、有序广播
有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播
下面我们看一下一个简单的发送广播的Demo:
在清单文件中注册广播:
<!-- 注册广播 -->
<receiver
android:name="com.example.broadcastrecevier.MyBroadcastReceiver">
<intent-filter >
<!-- 需要匹配的action -->
<action android:name="android.intent.action.MY_BROADCAST"/>
</intent-filter>
</receiver>
在activity中发送广播:
package com.example.broadcastrecevier;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//intent里边的android.intent.action.MY_BROADCAST应该与清单文件中的action保持一致,才回有广播相应
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
//用intent来发送我们广播接收到数据
intent.putExtra("msg", "发送广播了");
//发送广播
sendBroadcast(intent);
}
});
}
}
然后创建广播接收者:
package com.example.broadcastrecevier;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Toast.makeText(context, "发送广播了", 0).show();
//接受来自intent传递来的数据
String msg=intent.getStringExtra("msg");
Toast.makeText(context, msg, 0).show();
System.out.println("********"+msg);
}
}