Android_07_有序广播及最终广播接收者

来源:互联网 发布:ios 阿里百川的云推送 编辑:程序博客网 时间:2024/05/21 00:48

前言:

广播分为两类:一类是Normal broadcasts,另一类是Ordered broadcasts

Normal broadcasts:其是通过sendBroadcast()进行发送,其完全是异步的,广播接收者以一个不确定的顺序接收广播,

但通常都是在同一个时刻接收到广播


Ordered broadcasts:其是通过sendOrderedBroadcast()进行广播的发送,同一个时刻,广播只会传递广播给一个广播接收者;

由于每个接收者都是按顺序进行执行的,所以它可以将一个结果传播到下一个广播接收者,或它可以完全中止广播,使它不会被传递给

其他广播接收者;广播接收者接收广播的顺序可以intent-filter的android:priority来进行控制;具有相同优先级的广播接收者,在接收广播

时,是以一个任意的顺序进行接收的;


即使是在Normal broadcasts这种广播中,在某些情况下,同一个时刻,系统也许只会发送广播给一个接收者,尤其是对于需要

创建一个进程的这些广播接收者来说,同一个时刻,只有一个广播接收者将会接收到广播,主要是为了避免新的进程的创建超出了系统

的负荷;但是即使是在这种情况下,Normal broadcasts依然不能将结果返回给下一个接收者或者终止广播;


有序广播的代码示例如下:

有序广播发送端:

SenderActivity:

package com.example.administrator.testorderbroadcastsender;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;public class SenderActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_sender);    }    public void sendOrderBroadcast(View view){        Intent intent = new Intent();        intent.setAction("testOrderBroadcast");        /**         * 发送有序广播         * 这个广播接收者只接受该条有序广播,         * 并且是最后一个收到该广播,并且一定可以收到该广播         * ***/        sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每人发100斤大米", null);    }    /***     * 这是一个最终广播接收者,无论中途是否拦截,这个最终广播接受者还是会收到这条广播,     * 这条广播若你修改了,那就是你修改之后的广播     */    private class MyReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            String text = getResultData();            System.out.println("反贪局收到文件:" + text);        }    }}


activity_sender.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.administrator.testorderbroadcastsender.SenderActivity">    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="发送有序广播"        android:onClick="sendOrderBroadcast"        /></RelativeLayout>


有序广播接收端:

MainActivity:

package com.example.administrator.testorderbroadcastreceiver;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;/*** * 在本示例中,这里不起任何作用 * **/public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

ShengZFReceiver:

package com.example.administrator.testorderbroadcastreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ShengZFReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String text = getResultData();        System.out.println("省政府收到文件:" + text);        setResultData("每人发80斤大米");    }}
</pre><pre>


ShiZFReceiver:

package com.example.administrator.testorderbroadcastreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ShiZFReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String text = getResultData();        System.out.println("市政府收到文件:" + text);        /**abortBroadcast()只对有序广播生效,无序广播不会生效***/        abortBroadcast();    }}

XianZFReceiver:

package com.example.administrator.testorderbroadcastreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class XianZFReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String text = getResultData();        System.out.println("县政府收到文件:" + text);    }}


AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.administrator.testorderbroadcastreceiver">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver            android:name=".ShengZFReceiver"            android:enabled="true"            android:exported="true" >            <intent-filter android:priority="1000">                <action android:name="testOrderBroadcast"/>            </intent-filter>        </receiver>        <receiver            android:name=".ShiZFReceiver"            android:enabled="true"            android:exported="true">            <intent-filter android:priority="1000">                <action android:name="testOrderBroadcast"/>            </intent-filter>        </receiver>        <receiver            android:name=".XianZFReceiver"            android:enabled="true"            android:exported="true">            <intent-filter android:priority="1000">                <action android:name="testOrderBroadcast"/>            </intent-filter>        </receiver>    </application></manifest>

运行结果如下:


注:

1> 在接收有序广播时,若指定了接收广播的优先级,那么其接收的顺序就是按优先级来排序;

2> 在接收有序广播,若不指定接收广播的优先级,那么其接收的顺序是任意的;


源码:

1>

有序广播发送端

2>

有序广播接收端

0 0
原创粉丝点击