BroadcastReceiver广播接听器的初步认识,广播优先级,中断,权限,广播暴露(3)

BroadcastReceiver广播接听器的初步认识,广播优先级,中断,权限,广播暴露(3)

/**

 * 按广播类型分:

 * 1.无序广播,广播接收器收到的广播顺序时随机的,没有顺序可循

 * 2.有序广播(你懂的)

 */

 

从一个应用A中发送广播给另一个应用B的代码操作工程。

首先,在清单文件中声明定义一个广播权限,两个应用的清单文件都要有

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

 

应用A中设置的代码逻辑如下:点击Button按钮方法发送一个广播

sendBroadcast12)里面的两个参数,第一个参数是意图名称,第二个人参数就是应用广播访问权限

public void send(View view){
    sendBroadcast(new Intent("weihuan.weigongcheng"),"custom.permission");
}

在该方法执行后,B应用中所有设置为该意图名称的广播接收器都会接收到广播消息。

 

效果如下Log.d的打印结果:

06-02 14:42:12.193 1957-1957/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive2: null

06-0214:42:12.1931957-1957/project.wgc.mybroadcastreceiver02D/weihuan:onReceive5:resultData:null;resultCode:-1;nickname:null

06-0214:42:12.2091957-1957/project.wgc.mybroadcastreceiver02D/weihuan:onReceive4:resultData:null;resultCode:0;nickname:null

06-02 14:42:12.218 1957-1957/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive3: 3

 

 

五个自定义广播器的代码如下:

public class MyReceiver1 extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        Log.d("weihuan", "MyReceiver1: ++++++++++++++++");

    }

}

 

public class MyReceiver2 extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        String username = intent.getStringExtra("username");

        Log.d("weihuan", "onReceive2: "+username);

    }

}

 

public class MyReceiver3 extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        Log.d("weihuan", "onReceive3: 3");

    }

}

 

public class MyReceiver4 extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        String resultData = getResultData();

        int resultCode = getResultCode();

        //参数表示如果广播发送者传递的bundlenull,则系统自动创建新的Bundle

        Bundle resultExtras = getResultExtras(true);

        String nickname = resultExtras.getString("nickname");

        Log.d("weihuan", "onReceive4: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);

        //中断广播

        abortBroadcast();

    }

}

 

public class MyReceiver5 extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        String resultData = getResultData();

        int resultCode = getResultCode();

        //参数表示如果广播发送者传递的bundlenull,则系统自动创建新的Bundle

        Bundle resultExtras = getResultExtras(true);

        String nickname = resultExtras.getString("nickname");

        Log.d("weihuan", "onReceive5: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);

        setResultData("lisi");

        setResultCode(28);

        resultExtras.putString("nickname", "里斯");

        setResultExtras(resultExtras);

    }

}

 

 

在清单文件中静态注册四个广播接收器,二号广播接收器在代码中动态注册

     <!--

android:exported="false"是否将广播接收器暴露给第三方应用,上面应用A发送的广播信息,一号广播接收器就不会收到了

-->

       <receiver android:name=".MyReceiver1"

            android:exported="false">

            <intent-filter>

                <action android:name="weihuan.weigongcheng" />

            </intent-filter>

        </receiver>

        <receiver android:name=".MyReceiver3">

            <intent-filter android:priority="1">

                <action android:name="weihuan.weigongcheng" />

            </intent-filter>

        </receiver>

        <receiver android:name=".MyReceiver4">

            <intent-filter android:priority="2">

                <action android:name="weihuan.weigongcheng" />

            </intent-filter>

        </receiver>

        <!--

        android:priority="3" 表示广播的优先级,优先级越高的广播接收器越先收到广播,最低优先级为-999

        -->

        <receiver android:name=".MyReceiver5">

            <intent-filter android:priority="3">

                <action android:name="weihuan.weigongcheng" />

            </intent-filter>

        </receiver>

 

 

B应用中的主要代码如下:

public class MainActivity extends AppCompatActivity {
    private MyReceiver2 receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        receiver = new MyReceiver2();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("weihuan.weigongcheng");
        //"custom.permission“第三个参数表示要监听的权限
        registerReceiver(receiver,intentFilter,"custom.permission",null);
    }
    public void send1(View view) {//发送无序广播
        Intent intent = new Intent("weihuan.weigongcheng");
        intent.putExtra("username", "zhangsan");
        sendBroadcast(intent);
    }

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

    public void send2(View view) {//发送有序广播
//        Intent intent = new Intent("android.android");
//        intent.putExtra("age", 18);
//        sendOrderedBroadcast(intent, null);
        Bundle bundle = new Bundle();
        bundle.putString("nickname", "张三");
        sendOrderedBroadcast(new Intent("weihuan.weigongcheng"), null, new MyReceiver3(), null, 18, "zhangsan", bundle);
//        sendOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)
//        receiverPermission 这是权限,一个接收器必须持以接收您的广播。如果为 null ,不经许可的要求。
//        resultReceiver 您自己 BroadcastReceiver 来当作最后的广播接收器。
//        调度自定义处理程序,用以安排 resultReceiver 回调 ; 如果为 null 将语境中的主线程举行。
//        initialCode 一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ;
//        initialData 一种结果数据的初始值。通常情况下为空 , 是 String 类型 ;
//        initialExtras 一种结果额外的初始值。通常情况下为空 , 是 Bundle;
    }
}

 

点击方法一send1发送无序广播,效果如下2-5-4-3-1

06-02 15:08:15.024 19631-19631/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive2: zhangsan

06-0215:08:15.02519631-19631/project.wgc.mybroadcastreceiver02D/weihuan:onReceive5:resultData:null;resultCode:-1;nickname:null

06-0215:08:15.04019631-19631/project.wgc.mybroadcastreceiver02D/weihuan:onReceive4:resultData:null;resultCode:0;nickname:null

06-02 15:08:15.043 19631-19631/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive3: 3

06-02 15:08:15.047 19631-19631/project.wgc.mybroadcastreceiver02 D/weihuan: MyReceiver1: ++++++

 

 

点击方法二send2中,

sendOrderedBroadcast(new Intent("weihuan.weigongcheng"), null, null, null, 18, "zhangsan", bundle);

//        sendOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)

//        receiverPermission 这是权限,一个接收器必须持以接收您的广播。如果为 null ,不经许可的要求。

//        resultReceiver 您自己 BroadcastReceiver 来当作最后的广播接收器。

//        调度自定义处理程序,用以安排 resultReceiver 回调 ; 如果为 null 将语境中的主线程举行。

//        initialCode 一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2

//        initialData 一种结果数据的初始值。通常情况下为空 , String 类型 ;

//        initialExtras 一种结果额外的初始值。通常情况下为空 , Bundle;

 

第三个参数如果设置有receiver,则该方法发送的广播信息最后结束的时候一定会在该receiver结束。下面是有与没有的结果对比

1、设置有receiver从优先级高到低:5-4-3-2-1-33是设置的receiver

D/weihuan:onReceive5:resultData:zhangsan;resultCode:18;nickname:张三

D/weihuan: onReceive4: resultData:lisi;resultCode:28;nickname:里斯

D/weihuan: onReceive3: 3

D/weihuan: onReceive2: null

D/weihuan: MyReceiver1: +++

D/weihuan: onReceive3: 3

2、没设置有receiver:从优先级高到低:5-4-3-2-1

D/weihuan: onReceive5: resultData:zhangsan;resultCode:18;nickname:张三

D/weihuan: onReceive4: resultData:lisi;resultCode:28;nickname:里斯

D/weihuan: onReceive3: 3

D/weihuan: onReceive2: null

D/weihuan: MyReceiver1: +++

 

 

在方法send2中时初始发送数据如下:

Bundle bundle = new Bundle();

bundle.putString("nickname", "张三");

sendOrderedBroadcast(new Intent("weihuan.weigongcheng"), null, new MyReceiver3(), null, 18, "zhangsan", bundle);

根据优先级大小,会从依次54321

在监听器5中更改了初始数据,所以监听器4接收到更改后的数据

 

public class MyReceiver5 extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        String resultData = getResultData();

        int resultCode = getResultCode();

        //参数表示如果广播发送者传递的bundlenull,则系统自动创建新的Bundle

        Bundle resultExtras = getResultExtras(true);

        String nickname = resultExtras.getString("nickname");

        Log.d("weihuan", "onReceive5: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);

        setResultData("lisi");//重新设置结果数据为lisi

        setResultCode(28);//重新设置结果代码为28

        resultExtras.putString("nickname", "里斯");//重新设置结果Bundle中的昵称为"里斯"

        setResultExtras(resultExtras);

    }

}

 

public class MyReceiver4 extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        String resultData = getResultData();

        int resultCode = getResultCode();

        //参数表示如果广播发送者传递的bundlenull,则系统自动创建新的Bundle

        Bundle resultExtras = getResultExtras(true);

        String nickname = resultExtras.getString("nickname");

        Log.d("weihuan", "onReceive4: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);

        //中断广播

       // abortBroadcast();

    }

}

 

 

 

监听器4中的abortBroadcast();代表中断广播的意思,即执行后,广播就会停止,不会再往下传播。从54就完了。

 

监听器54log.d的结果显示

D/weihuan:onReceive5:resultData:zhangsan;resultCode:18;nickname:张三

D/weihuan: onReceive4: resultData:lisi;resultCode:28;nickname:里斯

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值