broadcast有序与无序

本文详细介绍了Android中的广播机制,包括基本使用方法、权限声明及使用、有序与无序广播的区别和应用实例等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Broadcastreceive

一、基础使用方法

a) 发送广播

        Intent intent=new Intent();

intent.setAction("cn.edu.liuwei");

sendBroadcast(intent);

        当然,这是基础的使用方式,我们只send一个intent对象

b) 接收广播方

1、写入一个类,确认它继承自broadcastreceive,并且实现他的抽象方法。

public void onReceive(Context context, Intent intent) {

System.out.println("receive02"+"接收到消息");

}

2、在配置文件中申明我们的receive

<receiver android:name="cn.edu.liuwei.receive2.receive02">

             <intent-filter>

                 <action android:name="cn.edu.liuwei"/>

                 <category     android:name="android.intent.category.LAUNCHER"/>

             </intent-filter>

        </receiver>

    在使用的时候,确信在intent中设置了action,那么你才能匹配到,如果不理解的话,可以去看一下intent的隐式用法。这儿我就不详述了。当然除了intent你需要申明外,在配置文件中你还需要申明category

3、在这里需要特殊指明,你的发送广播端应该在一个工程中,你的接收广播方需在另一个工程中,不然实践这个的意义就不是很大,在你写receive类所在的工程的时候,可以不写activity,也就是说那个工程中,你可以只在配置文件中申明receive对象和创建receive对象,那么在eclipse中判断你这个代码运行的标志就是logcat控制台打印出done。同样的,当你按照这种方式写入的broadcast可以在管理手机应用程序中看到,你也可以在那里杀死这个receive

二、申明权限的使用用法

a) 在xml中申明新的权限(自己定义)

 <permission 

        android:name="cn.edu.liuwei.come"

        android:protectionLevel="normal"

        ></permission>

    当然,你也可以自己再添加一些你它带的属性,这边只列出经常使用的那几个,需要注意的是,这只是权限的申明。在使用中你的申明这个。

当然,如果你需要测试的话,记得要在activity中指明,因为发送方是没有receive的,因此它必须在activity中指明需要这个权限。

b) 发送者申明权限

<activity

            android:name="cn.edu.liuwei.broadcast02.MainActivity"

            android:label="@string/app_name" 

            >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

     可能你已经发现,这跟我们普通的消息发送者没有什么两样,是的,它们没有两样,它跟普通的发送者的区别在于启动方式的不同,普通广播发送者是通过sendBroadcast(intent),而发送者使用权限的是通过sendBroadcast(intent,"cn.edu.liu");也就是在原来的基础上,带了一个代表权限的字符串。这就是带权限的发送者和不带权限的发送者的区别

c) 接受者申明权限

  <receiver android:name="cn.edu.liuwei.receive2.receive01"

            android:permission="cn.edu.liuwei.come"

            >

             <intent-filter>

                 <action android:name="cn.edu.liuwei"/>

                 <category android:name="android.intent.category.LAUNCHER"/>

             </intent-filter>

        </receiver>

receive中写入 android:permission="cn.edu.liuwei.come"就表示我们的接收方申明了权限,表示它只接收具有该权限的发送放发送的消息。如果发送方不具有该权限,那么它就不会接收,当然,这绝不会影响后续接收方的接收。

切记:带权限的启动方式,不要忘记sendbroadcast中的第二个参数,一定要写进去,否则,你的接收方要么是没带权限的接收,要么就是没有接收。

知道怎么定义自己的权限之后,我还的小小的提醒你,如果你要在你的receive中或者activity中使用这个权限,你需要使用use-permisson指明我们拥有这个权限,而不是在activity或者receive中使用permission来指定这个权限,因为你多想想就会明白,那个permission意味着什么?就看看下面的图。

d) 这里我画了一张图,虽然画的比较难看,但是能帮助大家理清楚他们的共同点与区别

       在图中,我们可以看出,当发送方定义了权限之后,接收方如果没有权限,那么它就收不到。这是很容易理解的事情

    好的,看完这幅图,你就应该明白在activity或者receive中使用的权限是用来要求给我或者需要我数据的东西必须具有的权限,也就是说那是用来要求别人的,而不是我们自己拥有的。   

    而且通过这幅图,我们可以看出,我们的发送放并没有定义权限,那么我们的接收方应该都能接受到,但是因为我们接受者2定义了权限,因此它并不能收到,也就是说,如果我们的接收方定义了权限,那么它只接收带有该权限的发送者的信号。

    好的,明白了上述两幅图,我们来再去看下上面的代码,我们就可以发现一个共同点,当我们的发送者和接受者都拥有相同权限的时候,他们是肯定可以实现消息接收。

三、有序与无序的broadcast使用

a) 有序广播和无序广播的区别:我们上面的例子都是无序广播,很明显,因为我们发送完广播之后,我们不知道谁先接收谁后接收,更不要说当这个接收了之后不要再发给另外的了。而有序广播就可以做到这一点,它通过设置优先级可以决定广播接受者的顺序。具体流程如下图。

当我们的广播发送者发送数据之后,我们的接受者肯定的先对action等判断,看自己是否满足条件,然后将满足的按照优先级进行排序,然后由优先级最大的先接收,接收完之后再传给第2优先级的。也就是我们的广播发送者实际上只发送了一次数据,因此相当省事。而且当信号传递到某个接受者的时候,它可以中断或者改变里面的内容再传递给下一个。

1、设置receive的优先级

 <receiver android:name="cn.edu.liuwei.receive2.receive02"

             android:permission="cn.edu.liu"

             >

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

                 <action android:name="cn.edu.liuwei"/>

                 <category android:name="android.intent.category.LAUNCHER"/>

             </intent-filter>

        </receiver>

这是在一个receive中设置,如果有多个,每个都需要设置(用红色字体标出),当你两个设置优先级一样大小的时候,你就不可能知道谁先谁后,因为那样就的看系统的了。当然优先级的理论最大是100,但是你使用大于它的整数也不会报错,但你最好按照100为最大的标准来设置。

我们在代码中已经设置receiver01的优先级要高,因此我们在01的代码中改变我们的数据,我们通过intent传递一个name=zhangsan”的字符串

2、到这儿大家注意一个问题,如果我们使用的是sendOrderedBroadcast(intent, "cn.edu.liu")来发送广播,而且我们的数据是保存在intent中的,那么我们在receiver中,如果采用的也是通过intent来获取内容的话,那么我们得到的值就是广播发送者发送的那一份,也就是说,无论第一个接受者对intent修改了什么,第二个接收的仍接受到属于broadcast发送的那一份,而不是被第一个接受者修改的那一份,因此,如果你想修改后传递的想另外的办法。

3、办法有两个。

一、使用sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)来发送广播。

二、不要从intent中获取数据,每次都通过receiver自带的setResultExtras(b);和getresultextras()来获取和传递数据。

实际上,对于这两种安排都是可取的,最好还是使用第一种,比较简单,也比较容易实现。

1个接收者

public void onReceive(Context context, Intent intent) {

//String name=intent.getStringExtra("name");

Bundle b=intent.getExtras();

System.out.println("01获取数据"+b.getString("name"));

b.clear();

b.putString("name""lisi");

b.putString("key""uu");

setResultExtras(b);

System.out.println("receive01"+"接收到广播");

}

第2个接收者

public void onReceive(Context context, Intent intent) {

Bundle b=getResultExtras(true);

System.out.println("02接收"+b.getString("name"));

System.out.println("the key is"+b.getString("key"));

System.out.println("receive02"+"接收到消息");

}

接收者配置文件

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

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        

        

        <receiver android:name="cn.edu.liuwei.receive2.receive01"

            android:permission="cn.edu.liu"

            >

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

                 <action android:name="cn.edu.liuwei"/>

                 <category android:name="android.intent.category.LAUNCHER"/>

             </intent-filter>

        </receiver>

        

         <receiver android:name="cn.edu.liuwei.receive2.receive02"

             android:permission="cn.edu.liu"

             >

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

                 <action android:name="cn.edu.liuwei"/>

                 <category android:name="android.intent.category.LAUNCHER"/>

             </intent-filter>

        </receiver>

        

    </application>

发送者配置文件

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

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        

        <activity

            android:name="cn.edu.liuwei.broadcast02.MainActivity"

            android:label="@string/app_name" 

            >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

    

    <permission 

        android:name="cn.edu.liu"

        android:protectionLevel="normal"

        ></permission>

主函数代码

public void click(View view){

Intent intent=new Intent();

Bundle b=new Bundle();

b.putString("name""age");

intent.putExtras(b);

intent.setAction("cn.edu.liuwei");

//sendBroadcast(intent,"cn.edu.liu");

sendOrderedBroadcast(intent, "cn.edu.liu");

//使用下述方法发送消息就可以从intent中获取到数据

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

}

上述就是我的代码,因为第一种方式比较简单,希望读者自己尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值