欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

BroadcastReceive知识模块

程序员文章站 2022-07-04 16:24:31
BroadcastReceive知识模块BroadcastReceive注册静态注册代码展示动态注册代码展示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方法来发送

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

本文地址:https://blog.csdn.net/Barryjacket/article/details/108628313