当前位置:   article > 正文

Android 中的广播机制_android 广播

android 广播

一、Android广播概念:

在Android中,有一些操作完成以后,会发送广播,Android系统内部产生这些事件后广播这些事件,至于广播接收对象是否关心这些事件,以及它们如何处理这些事件,都由广播接收对象自己决定。

二、发送全局广播:

  • 发送广播有两种类型:
    • 标准广播
    • 有序广播

1.标准广播:

完全异步执行的广播,发出广播后,所有的广播接收器几乎会在同一时刻收到这条广播通知。

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    	//第一步:将需要广播的消息封装到Intent中
        Intent intent = new Intent();
        intent.putExtra("name","张三");
        //第二步:自定义广播频段,表示该条广播会在那个频段下发出
        intent.setAction("my.broadcast.key");
        //第三步:调用Context的sendBroadcast()方法将广播发送出去;
        sendBroadcast(intent);
    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.有序广播:

同步执行的一种广播,同一时刻只有一个广播接收器能收到,这个广播接受者的逻辑执行完后,才会传递到下一广播接受者。
在这里插入图片描述

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //第一步:将需要广播的消息封装到Intent中
        Intent intent = new Intent();
        intent.putExtra("name","张三");
        //第二步:自定义广播频段,表示该条广播会在那个频段下发出
        intent.setAction("my.broadcast.key");
        //第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
        //第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
        sendOrderedBroadcast(intent,null);
    }
});
/*
1.优先接收到广播的Broadcastreceiver广播接收者可以通过setResultExtras(Bundle)方法将一个Bundle对象设置为结果集对象,传给下一个接收者。
2.下一个接收者通过getResultExtras()可以获取上一个接收者存入的数据
3.中断广播,拦截一条广播不往下发送abortBroadcast()
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

三、接收全局广播:

为了监听这些广播事件,Android提供了一个BroadcastReceiver全局监听器组件,该组件可以监听来自系统或应用程序的广播。

1.运行机制:

当系统或其他应用程序发送广播时,所有已经注册的 BroadcastReceiver 的应用程序就会检查注册时的IntentFilter里的Action是否与发送广播时的Intent的Action相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法进行处理,所以主要工作是对BroadcastReceiver里的onReceive()方法的实现。

2.步骤:

第一步:创建一个类继承BroadcastReceiver,实现onReceive()方法

package com.example.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    //检测到广播后会自动回调onReceive方法
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "检测到广播", Toast.LENGTH_LONG).show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

第二步:注册BroadcastReceiver

  • 动态注册:
//1.构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//2.Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//3.将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//4.注册广播接收器
registerReceiver(receiver, filter);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 静态注册:
<!--广播接收器的全限定类名-->
<receiver android:name="com.example.myapplication.MyReceiver"
    android:exported="true">
    <!--过滤机制-->
    <intent-filter>
        <action android:name="my.broadcast.key"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.BroadcastReceiver生命周期:

每次广播事件发生后,系统就会创建对应的BroadcastReceiver实例对象,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例对象就会被销毁。

四、本地广播:

前面接触的广播都是全局广播,这同样意味着我们APP发出的广播,其他APP都会接收到,但是部分广播我们不希望其他APP捕获。
Android中给我们提供了本地广播 LocalBroadcastManager 的机制,使用该机制发出的广播只会在APP内部传播,而且广播接收者也只能收到本应用发出的广播。

1.实现只在本应用内发送广播:

发送广播的具体步骤同(二)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;
  • 1

第二步:调用LocalBroadcastManager对象的sendBroadcast()发送广播

localBroadcastManager.sendBroadcast(intent);
  • 1

2.实现只接收本应用内的广播:

接收广播的具体步骤同(三)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;
  • 1

第二步:通过LocalBroadcastManager对象的registerReceiver()注册广播

localBManager. registerReceiver(localReceiver, intentFilter);
  • 1

五、案例:广播的接收和发送

注:其实这部分内容我也没有太深入的理解,主要是根据这个简单的案例写的文章。

MyReceiver.java:

package com.example.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "检测到广播,广播内存有数据:"+intent.getStringExtra("name"), Toast.LENGTH_LONG).show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

MainActivity.java:

package com.example.myapplication;

import android.content.IntentFilter;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.btn);
        //点击按钮发送广播
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //第一步:将需要广播的消息封装到Intent中
                Intent intent = new Intent();
                intent.putExtra("name","张三");
                //第二步:自定义广播频段,表示该条广播会在那个频段下发出
                intent.setAction("my.broadcast.key");
                //第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
                //第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
                sendBroadcast(intent);
            }
        });
        //构建IntentFilter标签,设置其Action属性
        IntentFilter filter = new IntentFilter();
        //Action属性指定接收来自哪个频段的广播
        filter.addAction("my.broadcast.key");
        //将IntentFilter装入广播接收器中
        MyReceiver receiver = new MyReceiver();
        //注册广播接收器
        registerReceiver(receiver, filter);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

效果:

点击按钮发送全局标准广播,并被本应用捕获。
在这里插入图片描述

六、案例:本地广播

MyLocalBroadcastReceiver.java:

package com.example.t.androidproject.yati;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyLocalBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("clh", "onReceive: 收到了本地广播");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

LocalBroadCastActivity.java:

package com.example.t.androidproject.yati;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

public class LocalBroadCastActivity extends AppCompatActivity {
    private MyLocalBroadcastReceiver mlbr = new MyLocalBroadcastReceiver();
    LocalBroadcastManager lbm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化
        lbm = LocalBroadcastManager.getInstance(this);
        //注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("local_broad_cast");
        lbm.registerReceiver(mlbr, intentFilter);
        Button btn = findViewById(R.id.btn_local);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("local_broad_cast");
                lbm.sendBroadcast(intent);
            }
        });
    }
    //解除注册
    @Override
    protected void onDestroy() {
        super.onDestroy();
        lbm.unregisterReceiver(mlbr);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

效果:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/350242
推荐阅读
相关标签
  

闽ICP备14008679号