Android广播
Android广播机制
广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。
Android广播类型分类
1)无序广播:任何一个广播接收者都可以接收到广播,任何一个广播接收者都不能截断广播
2)有序广播:任何一个广播接收者都可以截断广播,一旦广播给截断,那么下一个接收者将无法接收广播。有序广播按照优先级来接收
3)粘黏广播:粘性广播在发送后就一直存在于系统的广播容器里面,等待对应的接收者去处理,如果暂时没有接收者处理这个广播则一直在广播容器里面处于等待状态。
广播的生命周期
广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它
即为失活状态。
广播接收器属于主线程,广播接收器内部不能执行耗时任务。广播接收器如同主
UI线程一样,不能执行耗时任务,一般情况下广播接收器的执行时间为15秒。
Android广播机制三要素
广播(Broadcast) - 用于发送广播
广播接收器(BroadcastReceiver) - 用于接收广播
意图内容(Intent)-用于保存广播相关信息的媒介
下面的例子演示有序广播:
Mainactivity:
package com.py.main;
import com.py.broadcast.R;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
有序广播实例:有序广播可以是静态注册也可以是动态注册,本activity使用动态注册;
权限的设置可以是自定义的权限,亦可使用null。自定义权限在Androidmanifest.xml中设置
* @author py
*
*/
public class MainActivity extends Activity {
Button btnorder; //有序广播按钮
DataBoardCast1 dataBoardCast1 = new DataBoardCast1(); //有序广播1
DataBoardCast2 dataBoardCast2 = new DataBoardCast2(); //有序广播2
//广播1
class DataBoardCast1 extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
Log.i("TAG", "DataBoardCast1");
Log.i("TAG", "DataBoardCast1"+intent.getStringExtra("key"));
}
}
//广播2
class DataBoardCast2 extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
Log.i("TAG", "DataBoardCast2");
Log.i("TAG", "DataBoardCast2"+intent.getStringExtra("key"));
//阻截后面的广播接收者接收
this.abortBroadcast();
}
}
OnClickListener btnClickListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
orderBy(); //传递有序广播的方法
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnorder = (Button)this.findViewById(R.id.button2);
btnorder.setOnClickListener(btnClickListener);
//接收广播的 intent action
IntentFilter iFilter1 = new IntentFilter("com.py.broadcast.acton_broadcast");
iFilter1.setPriority(100); //设置广播的优先级
this.registerReceiver(dataBoardCast1, iFilter1); //动态注册广播1
IntentFilter iFilter2 = new IntentFilter("com.py.broadcast.acton_broadcast");
iFilter2.setPriority(10000);
this.registerReceiver(dataBoardCast2, iFilter2); //动态注册广播2
}
protected void orderBy() {
// TODO Auto-generated method stub
Intent intent = new Intent(); //创建意图
intent.setAction("com.py.broadcast.acton_broadcast"); //设置自定义action
intent.putExtra("key", "py"); //传递数据
//使用上下文对象和自定义权限发送有序广播
this.sendOrderedBroadcast(intent, "com.py.broadcast.permission.py");
//this.sendOrderedBroadcast(intent, null); 权限可以设置为空
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
this.unregisterReceiver(dataBoardCast1); //使用上下文注销广播1、2
this.unregisterReceiver(dataBoardCast2);
super.onDestroy();
}
}
如果定义了自定义权限,则要在Androidmanifest.xml中注册权限:
<!-- 自定义权限对象 ,最好带上包名,避免冲突;自定义权限也可以不设置-->
<permission android:name="com.py.broadcast.permission.py"
android:protectionLevel="normal">
</permission>
<!-- 添加权限 -->
<uses-permission android:name="com.py.broadcast.permission.py"/>
下面的例子来演示无序广播:
广播发送者MainActivity2:
package com.py.main;
import com.py.broadcast.R;
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;
/**
无序广播实例:有序广播可以是静态注册也可以是动态注册,本activity使用静态注册;
权限的设置可以是自定义的权限,亦可使用null。自定义权限在Androidmanifest.xml中设置
* @author py
*
*/
public class MainActivity2 extends Activity {
Button btnorder; //无序广播按钮
OnClickListener btnClickListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
orderBy(); //传递无序广播的方法
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnorder = (Button)this.findViewById(R.id.button1);
btnorder.setOnClickListener(btnClickListener);
}
/*protected void orderBy() {
// TODO Auto-generated method stub
Intent intent = new Intent(); //创建意图
intent.setAction("com.py.broadcast.acton_broadcast2"); //设置自定义action
intent.putExtra("key", "py"); //传递数据
this.sendBroadcast(intent); //使用上下文无序广播
}
*/
//发送无序广播,具备权限【广播发送者】
protected void orderBy() {
Intent intent = new Intent();
intent.setAction("com.py.broadcast.acton_broadcast2"); //设置自定义action
intent.putExtra("key", "py");
// 使用<permission>声明权限对象
this.sendBroadcast(intent,"com.py.broadcast.permission.py");
}
}
广播接收者DataBroadcastReceive:
package com.py.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
//如果使用AndroidManifest.xml静态注册,最好使用外部类,而不使用内部类
//使用内部类的,内部类必须是public static的,AndroidManifest.xml中才可以实例化
public class DataBroadcastReceive extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
Log.i("TAG", intent.getStringExtra("key"));
}
}
广播静态注册,在Androidmanifest.xml中设置:
<receiver android:name="com.py.broadcast.DataBroadcastReceive" >
<intent-filter >
<action android:name="com.py.broadcast.acton_broadcast2" >
</action>
</intent-filter>
</receiver>
总结:
无序广播跟有序广播都可以静态注册或者动态注册。采取静态注册,当用户一打开程序,便会广播。即使用户立刻退出,仍然还会广播内容。比如一个提示信息。这影响了用户的使用。所以采取动态注册,程序员就可以控制广播的注销。
无序广播跟有序广播都可以采取不用权限的方式或者使用自定义权限的方式进行广播。