最后写总结,先写个动态注册广播的例子:
1.准备一个自定义广播类
public class CustomerBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.w(this.getClass().toString(), intent.getStringExtra("info"));
}
}
2.将注册过程写到一个Button的事件中,当然你也可以写到初始化过程里,根据你业务需要
private IntentFilter broadcastFilter=null;
private BroadcastReceiver customerBroadcast = null;
registBroadCastBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
broadcastFilter = new IntentFilter("customer_broadcast");
customerBroadcast = new CustomerBroadcast();
registerReceiver(customerBroadcast, broadcastFilter);
}
});
3.注册成功后,下面可以在需要的地方发送广播,我这里是又写了个Button来触发
sendBroadCastBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("android.net.conn.CONNECTIVITY_CHANGE");
intent.putExtra("info","动态注册发送的广播");
sendBroadcast(intent);
}
});
4.最后记得在Activity的 onDestroy()中注销掉广播,
try{
if(null!=customerBroadcast){
unregisterReceiver(customerBroadcast);
}
}catch(Exception e){
e.printStackTrace();
}
由此可见动态注册的广播 生命周期跟随Activity,那么广播里如何更新Activity的UI呢,这里有两种方式提供给大家
1.自定义广播类放在Activity里
2.(1)创建一个更新UI的接口
(2)在自定义广播里关联这个接口,并提供一个注册接口的方法
(3)在注册广播的Activity里,调用注册接口方法,实现接口的内部方法。
这种方法其实就是点击事件的回调一样。
发送广播可以添加权限,具体方法是
sendBroadcast(intent,permissionString);
同时Receiver端注册方法也需要改变
registerReceiver(customerBroadcast, broadcastFilter,permissionString,Handler);
方法说明:Register to receive intent broadcasts, to run in the context of scheduler. See registerReceiver(BroadcastReceiver, IntentFilter) for more information. This allows you to enforce permissions on who can broadcast intents to your receiver, or have the receiver run in a different thread than the main application thread.
参数:
receiver - The BroadcastReceiver to handle the broadcast.
filter - Selects the Intent broadcasts to be received.
broadcastPermission - String naming a permissions that a broadcaster must hold in order to send an Intent to you. If null, no permission is required.
scheduler - Handler identifying the thread that will receive the Intent. If null, the main thread of the process will be used.
发送带权限的广播应用:
1.防止发送的广播被其它程序监听
2.接收到错误的广播
3.指定发送的广播,实现不同app间的数据交互。
这里具体说一下不同app之间的交互:
在发送的app里 添加<uses-permission android:name="com.xy.XY_BROADCAST" />权限
发送广播代码和之前一样,简单方便
Intent intent = new Intent();
intent.setAction("customer_broadcast");
intent.putExtra("info","动态注册发送的广播");
sendBroadcast(intent,broadcastPermission);
在接收端注册相应的权限
<uses-permission android:name="com.xy.XY_BROADCAST" />
<permission
android:name="com.xy.XY_BROADCAST"
android:protectionLevel="signature" >
</permission>
说明:
permission就是自定义权限的声明,可以用来限制app中特殊组件,特性与app内部或者和其他app之间访问。
自定义权限如下:
<permission android:label=”自定义权限”
android:description=”@string/hello”
android:name=”com.example.project.PERMITTED_ACTION”
android:protectionLevel=”normal”
android:icon=”@drawable/ic_launcher”>
</permission>
android:label:权限名字,显示给用户的,值可是一个string数据,例如这里的“自定义权限”。
android:description:比label更长的对权限的描述。值是通过resource文件中获取的,不能直接写string值,例如这里的”@string/hello”。
android:name:权限名字,如果其他app引用该权限需要填写这个名字。
android:protectionLevel:权限级别,分为4个级别:
normal:低风险权限,在安装的时候,系统会自动授予权限给application。
dangerous:高风险权限,系统不会自动授予权限给app,在用到的时候,会给用户提示。
signature:签名权限,在其他app引用声明的权限的时候,需要保证两个app的签名一致。这样系统就会自动授予权限给第三方app,而不提示给用户。
signatureOrSystem:这个权限是引用该权限的app需要有和系统同样的签名才能授予的权限,一般不推荐使用。
这样接收端app只要注册上广播等待被连接就行。
广播的类型分为很多种:
1.系统广播;
例子:<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 网络切换时
2.自定义广播;自定义又分为有序和无序两种
看个例子:
<receiver android:name="com.broadcast.receiver.SortBroadcastReceiverA">
<intent-filter android:priority="999">
<action android:name="com.broadcast.set.broadcast"/>
</intent-filter>
</receiver>
<receiver android:name="com.broadcast.receiver.SortBroadcastReceiverB">
<intent-filter android:priority="1000">
<action android:name="com.broadcast.set.broadcast"/>
</intent-filter>
</receiver>
这测了两个广播接收器,当发送name为com.broadcast.set.broadcast的无序广播时,先执行SortBroadcastReceiverB再执行SortBroadcastReceiverA,
那么如果要在执行B之后终止广播,该怎么办?
只能通过修改发送端广播的类型,sendOrderBroadcast(broadcast,null); 然后在B的onReceive()中 添加 abortBroadcast();终止广播的传递。这是一个同步动作,无序广播时异步的。
3.本地广播;
网上说这种方式只能通过动态注册实现,暂时没试过。
1.准备一个自定义广播类
public class CustomerBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.w(this.getClass().toString(), intent.getStringExtra("info"));
}
}
2.将注册过程写到一个Button的事件中,当然你也可以写到初始化过程里,根据你业务需要
private IntentFilter broadcastFilter=null;
private BroadcastReceiver customerBroadcast = null;
registBroadCastBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
broadcastFilter = new IntentFilter("customer_broadcast");
customerBroadcast = new CustomerBroadcast();
registerReceiver(customerBroadcast, broadcastFilter);
}
});
3.注册成功后,下面可以在需要的地方发送广播,我这里是又写了个Button来触发
sendBroadCastBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("android.net.conn.CONNECTIVITY_CHANGE");
intent.putExtra("info","动态注册发送的广播");
sendBroadcast(intent);
}
});
4.最后记得在Activity的 onDestroy()中注销掉广播,
try{
if(null!=customerBroadcast){
unregisterReceiver(customerBroadcast);
}
}catch(Exception e){
e.printStackTrace();
}
由此可见动态注册的广播 生命周期跟随Activity,那么广播里如何更新Activity的UI呢,这里有两种方式提供给大家
1.自定义广播类放在Activity里
2.(1)创建一个更新UI的接口
(2)在自定义广播里关联这个接口,并提供一个注册接口的方法
(3)在注册广播的Activity里,调用注册接口方法,实现接口的内部方法。
这种方法其实就是点击事件的回调一样。
发送广播可以添加权限,具体方法是
sendBroadcast(intent,permissionString);
同时Receiver端注册方法也需要改变
registerReceiver(customerBroadcast, broadcastFilter,permissionString,Handler);
方法说明:Register to receive intent broadcasts, to run in the context of scheduler. See registerReceiver(BroadcastReceiver, IntentFilter) for more information. This allows you to enforce permissions on who can broadcast intents to your receiver, or have the receiver run in a different thread than the main application thread.
参数:
receiver - The BroadcastReceiver to handle the broadcast.
filter - Selects the Intent broadcasts to be received.
broadcastPermission - String naming a permissions that a broadcaster must hold in order to send an Intent to you. If null, no permission is required.
scheduler - Handler identifying the thread that will receive the Intent. If null, the main thread of the process will be used.
发送带权限的广播应用:
1.防止发送的广播被其它程序监听
2.接收到错误的广播
3.指定发送的广播,实现不同app间的数据交互。
这里具体说一下不同app之间的交互:
在发送的app里 添加<uses-permission android:name="com.xy.XY_BROADCAST" />权限
发送广播代码和之前一样,简单方便
Intent intent = new Intent();
intent.setAction("customer_broadcast");
intent.putExtra("info","动态注册发送的广播");
sendBroadcast(intent,broadcastPermission);
在接收端注册相应的权限
<uses-permission android:name="com.xy.XY_BROADCAST" />
<permission
android:name="com.xy.XY_BROADCAST"
android:protectionLevel="signature" >
</permission>
说明:
permission就是自定义权限的声明,可以用来限制app中特殊组件,特性与app内部或者和其他app之间访问。
自定义权限如下:
<permission android:label=”自定义权限”
android:description=”@string/hello”
android:name=”com.example.project.PERMITTED_ACTION”
android:protectionLevel=”normal”
android:icon=”@drawable/ic_launcher”>
</permission>
android:label:权限名字,显示给用户的,值可是一个string数据,例如这里的“自定义权限”。
android:description:比label更长的对权限的描述。值是通过resource文件中获取的,不能直接写string值,例如这里的”@string/hello”。
android:name:权限名字,如果其他app引用该权限需要填写这个名字。
android:protectionLevel:权限级别,分为4个级别:
normal:低风险权限,在安装的时候,系统会自动授予权限给application。
dangerous:高风险权限,系统不会自动授予权限给app,在用到的时候,会给用户提示。
signature:签名权限,在其他app引用声明的权限的时候,需要保证两个app的签名一致。这样系统就会自动授予权限给第三方app,而不提示给用户。
signatureOrSystem:这个权限是引用该权限的app需要有和系统同样的签名才能授予的权限,一般不推荐使用。
这样接收端app只要注册上广播等待被连接就行。
广播的类型分为很多种:
1.系统广播;
例子:<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 网络切换时
2.自定义广播;自定义又分为有序和无序两种
看个例子:
<receiver android:name="com.broadcast.receiver.SortBroadcastReceiverA">
<intent-filter android:priority="999">
<action android:name="com.broadcast.set.broadcast"/>
</intent-filter>
</receiver>
<receiver android:name="com.broadcast.receiver.SortBroadcastReceiverB">
<intent-filter android:priority="1000">
<action android:name="com.broadcast.set.broadcast"/>
</intent-filter>
</receiver>
这测了两个广播接收器,当发送name为com.broadcast.set.broadcast的无序广播时,先执行SortBroadcastReceiverB再执行SortBroadcastReceiverA,
那么如果要在执行B之后终止广播,该怎么办?
只能通过修改发送端广播的类型,sendOrderBroadcast(broadcast,null); 然后在B的onReceive()中 添加 abortBroadcast();终止广播的传递。这是一个同步动作,无序广播时异步的。
3.本地广播;
网上说这种方式只能通过动态注册实现,暂时没试过。