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

来源:互联网 发布:google seo 编辑:程序博客网 时间:2024/05/22 14:02

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

/**

 * 按广播类型分:

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

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

 */

 

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

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

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

 

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

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

public voidsend(View view){
    sendBroadcast(newIntent("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 classMainActivity extendsAppCompatActivity {
    privateMyReceiver2 receiver;

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

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

    public voidsend2(View view) {//发送有序广播
//        Intent intent = new Intent("android.android");
//        intent.putExtra("age", 18);
//        sendOrderedBroadcast(intent, null);
        Bundle bundle =new Bundle();
        bundle.putString("nickname","张三");
        sendOrderedBroadcast(newIntent("weihuan.weigongcheng"), null, newMyReceiver3(), 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:里斯