Android广播机制之标准广播(Normal broadcas

2021-06-01  本文已影响0人  浅_若清风

Android中的广播主要分为两种类型:标准广播和有序广播。

定义:

标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出后,所有的广播接收器几乎都会同一时刻接收到该条广播信息,所以它们之间是无序的。标准广播的效率高,不易被截断。

工作流程示意图
img_1.png
案例:

在发送广播之前,我们需要定义一个广播接收器(Broadcast Receiver)来接收广播。在这里我们创建一个继承于BroadcastReceiver的类MyBroadcastReceiver。在onReceive()处理你接收到的广播内容,在这里我用logd打印获取到值

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Log.d("MyBroadcastReceiver", "onReceive: "+ intent.getStringExtra("myName"));
    }
}

我们知道,Android广播接收器有两种注册方式。我们可以用以下任意一种来进行注册。

静态注册

在AndroidManifest.xml文件了,在<receiver>标签里添加<intent-filter></intent-filter>代码

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ...>
    <application ...>
        <receiver...>
            <intent-filter>
                <action android:name="broadcast"/>
            </intent-filter>
        </receiver>
        <activity android:name=".MainActivity">
            ...
        </activity>
    </application>
</manifest>

其中,broadcast为自定义的广播名称。

动态注册

在需要接收界面进行注册,代码如下

public class MainActivity extends AppCompatActivity {
    MyBroadcastReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        receiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter("broadcast");
        registerReceiver(receiver,intentFilter);
       //Send
        Button button = findViewById(R.id.send_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("broadcast");
                intent.putExtra("myName","浅_若清风");
                sendBroadcast(intent);
            }
        });
    }
   @Override
    protected void onDestroy(){
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}

首先我们需要分别创建MyBroadcastReceiver的实例和IntentFilter的实例,并给IntentFilter的实例添加一个action:broadcast(接收的广播的名称),然后调用registerReceiver()方法进行注册,并将MyBroadcastReceiver的实例和IntentFilter的实例都传进去。

广播发送

在上面的代码中,我们看到声明了Button方法,所以我们需要在对应的activity_main.xml文件里新增按钮代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <Button
        android:id="@+id/send_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send Button"
        />
</LinearLayout>
注销

当然,我们最后一定不要忘了取消注册。我们可以通过调用unregisterReceiver()方法来实现。
Intent是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由 Intent来协助完成 Android各个组件之间的通讯。我们可以用putExtra属性传入多个参数。至此,Android的标准广播发送就完成了。编译运行工程,点击Send Button按钮,我们可以在Logcat里打印出我们期待的值了。

上一篇 下一篇

猜你喜欢

热点阅读