有序广播与无序广播

  • 无序广播
  • 有序广播
  • 案例 拦截有序广播
  • 问题

无序广播

  • 完全异步执行的广播
  • 广播接收器几乎会同时接收到这条广播
  • 它们之间无先后次序可言

有序广播

  • 同步执行的广播
  • 同一时刻只会有一个广播接收器接收到消息
  • 有先后顺序 可以被拦截

案例 拦截有序广播


用户交互界面

<?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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/stitch_one" tools:context="bzu.edu.cn.guangbo.MainActivity">

    <Button  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="80dp" android:onClick="send" android:text="发送有序广播" android:paddingLeft="5dp" android:paddingRight="5dp" android:background="#FBFBFF" android:textSize="20sp" />
</RelativeLayout>
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void send(View view)
    {
        Intent intent=new Intent();
        //定义广播的事件类型
        intent.setAction("Intercept_Stitch");
        //发送广播
        sendOrderedBroadcast(intent,null);

    }
}
public class MyBroadcastReceiverOne extends BroadcastReceiver {
    public MyBroadcastReceiverOne() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //throw new UnsupportedOperationException("Not yet implemented");
        Log.i("MyBroadcastReceiverOne","自定义的广播者one,接收到了广播事件");


    }

}
public class MyBroadcastReceiverTwo extends BroadcastReceiver {
    public MyBroadcastReceiverTwo() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //throw new UnsupportedOperationException("Not yet implemented");
        Log.i("MyBroadcastReceiverTwo","自定义的广播者two,接收到了广播事件");


    }
}


public class MyBroadcastReceiverThree extends BroadcastReceiver {
    public MyBroadcastReceiverThree() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //throw new UnsupportedOperationException("Not yet implemented");
        Log.i("MyBroadcastReceiverThree","自定义的广播者three,接收到了广播事件");
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="bzu.edu.cn.guangbo">

    <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=".MyBroadcastReceiverOne" android:enabled="true" android:exported="true" >
            <intent-filter android:priority="1000">
               <action android:name="Intercept_Stitch">
               </action>
            </intent-filter>
            </receiver>
        <receiver  android:name=".MyBroadcastReceiverTwo" android:enabled="true" android:exported="true" >
            <intent-filter android:priority="200">
                <action android:name="Intercept_Stitch">
                </action>
            </intent-filter>
        </receiver>

        <receiver  android:name=".MyBroadcastReceiverThree" android:enabled="true" android:exported="true">
            <intent-filter android:priority="600">
                <action android:name="Intercept_Stitch">
                </action>
            </intent-filter>
        </receiver>
    </application>

</manifest>

问题1:程序启动后,点击“发送有序广播”按钮,发出一条广播事件,此事观察LogCat窗口下的提示信息,输出什么?为什么?

通过设置它的priority的属性来确定它的优先级,它的值越大,优先级越大,接收到的广播也最早。如果两个应用程序监听了同一个广播事件并设置了优先级,则先安装的应用的优先接收到广播。

问题2:若将广播接收者MyBroadcastReceiverTwo优先级同样设置为1000,并将MyBroadcastReceiverTwo注册在MyBroadcastOne前面,再来运行程序,观察结果,你能得出什么结论?

 如果两个广播接收者优先级相同,则先注册的组件优先接收到广播

问题3:修改MyBroadcastReceiverTwo如下,观察结果。

 priority属性值 比MyBroadcastReceiverTwo低的 以及 在它注册后注册的广播 均被拦截

你可能感兴趣的:(android)