BroadcastReceive知识模块

BroadcastReceive注册

静态注册

在清单文件通过标签注册是常驻型,也就是说即便当前的应用程序关闭后,如果信息广播来,程序也会被系统自动调用。

代码展示

<receiver android:name=".DataChangeReceive">
    <intent-filter>
        <action android:name="android.intent.action.DATE_CHANGED"/>
    </intent-filter>
</receiver>

监听日期变更的广播。

动态注册

动态注册,又称为代码注册。它不是常驻型广播,也就是说广播会随着程序的生成而生成。一旦代码所在的进程被杀死,广播接收者就会失效。
注意:在代码中进行注册后,一定要在活动结束时取消注册。

代码展示

接收一条ACTION_DATE_CHANGED广播。

//广播接收器
  receive = new DataChangeReceive();
  IntentFilter filter = new IntentFilter();
  filter.addAction(Intent.ACTION_DATE_CHANGED);
  //注册广播
  registerReceiver(receive, filter);

}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receive);
}

无序广播

特点

无序广播不可以被拦截
所有接收无序广播的接收机都可以同时接收该广播(即便是在不同的应用APP中)
无序广播不可以传递数据
无序广播是使用sendBroadcast方法来进行发送
无序广播可以通过设置发送权限接收权限来进行一定的筛选

发送权限的使用

场景:当发送者 不希望所有人都接收到此广播时,可以通过设置发送权限来控制
1.在清单文件中声明权限标签声明自定义权限
2.在发送广播时 调用sendBroadcast 两个参数的方法 将权限设置为第二个参数
3.为需要接收广播的应用添加对应的权限

<uses-permission android:name="...."/>

代码示例

发送端
在Java文件中

private String action = "com.example.openWithMusic.broad";
private String permission ="com.example.openWithMusic.MyPermission";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent();
    intent.setAction(action);
    sendBroadcast(intent, permission);
    

在清单文件中

//声明自定义权限
<permission android:name="com.example.openWithMusic.MyPermission"/>

接收广播的应用
在清单文件中进行声明

<uses-permission android:name="com.example.openWithMusic.MyPermission"/>

接收权限

当 接收者 不需要接收所有同名的广播时 可以通过添加接收者权限来进行控制
1.在清单文件中声明权限标签声明自定义权限
2.在标签上 添加相应的权限
3.为需要发送广播的应用 添加对应的权限

代码示例

接收端

<permission android:name="com.example.openWithMusic.ReceiverPermission"/>
<receiver android:name=".UserPersenterReceiver"
  	android:permission="com.example.openWithMusic.ReceiverPermission">

发送端

<uses-permission android:name="com.example.openWithMusic.ReceiverPermission"/>

有序广播

特点

1.接收者将按预先声明的优先级依次接收Broadcast。如:A的级别高于 B,B的级别高于C。那么,Broadcast先传给A,再传给B,最后传给C。
2.优先级声明在<intent-filter android:priority=“100”./>元素的android:priority属性中,数越大优先级别越高,取值范围为-1000~1000,优先级也可以调用IntentFilter对象的setPriority()进行设置
3.有序广播可以被拦截。接收者可以终止Broadcast Intent的传播,Broadcast Intent的传播一旦终止,后面的接收者就无法接收到Broadcast。使用abortBroadcast()方法。
4.有序广播可以接收数据接收者可以将数据传递给下一个接收者,
getResultExtra(true)来获取bundler对象,并对其所包含的数据进行修改操作
如:A得到Broadcast后,可以往它的结果对象中存入数据,当Broadcast传给B时,
如:A得到Broadcast后,可以往它的结果对象中存入数据,当Broadcast传给B时,B可以从A的结果对象中得到A存入的数据。
5.使用sendOederdBroadcast方法来发送,不同优先级的接收器会依次接收到广播,并调用各自的onReceive().
注意 再onReceive()中获地广播所携带地数据,并进行修改后,系统会自动地将修改后地广播向下传递。
接收端地onReceive()

public void onReceive(Context context, Intent intent) {
     Bundle result = getResultExtras(true);
    result.putString(DATA_KEY, "dfdsjl");
}

发送端的代码

  //第一个参数 Intent 意图对象
        Intent intent = new Intent("com.barry.tryBroadcast");
        //第2个参数 接收者需要的权限 String类型
        //第3个参数 BroadcastReceiver 最终接收者.这个接收机一定会接收到广播
//                    如果之前被拦截了,则只接受一次,否则会有两次接收
        //第4个参数 Handler 用于执行接收者的回调,  如果为null 则说明是在主线程中执行
        //第5个参数 int类型 结果码 resultCode
        //第6个参数 String类型 结果字符集 resultData 再onReceive()中可通过getResultData() 来获取。
        //          setResultData(Sting s) 来更新
        //第七个参数 Bundle 用于传输其他类型的数据
//                    在接收机的onReceive方法中,调用getResultExtras(true),来获取发送的bundle对象。源码:
//public final Bundle getResultExtras(boolean makeMap) {
        Bundle bundle= new Bundle();
        bundle.putString("data", "hdjlksjf");
        sendOrderedBroadcast(intent,null, null,null,RESULT_OK,
                "广播已被接收",bundle);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值