Android 静态注册广播接收者和动态注册广播接收者(Android8.0之前和之后)

简介: Android 静态注册广播接收者和动态注册广播接收者(Android8.0之前和之后)

前言:广播接收者的特点和作用:

相关的API如下

发送广播的两种类型

有序广播与一般广播的理解

一、静态注册广播接收者步骤:

1.布局页面:

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_static"
        android:layout_marginLeft="5dp"
        android:text="静态注册发送广播"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_dynamic"
        android:layout_marginLeft="5dp"
        android:text="动态注册发送广播"
        />

2.创建广播接收者StaticReceiver:

public class StaticReceiver extends BroadcastReceiver {
    private static final String TAG = "StaticReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "静态注册的广播接收者" );
    }
}

3.在清单文件中注册广播接收者

<!--静态注册广播接收者-->
        <receiver android:name=".StaticReceiver">
            <intent-filter>
                <action android:name="com.example.day_static"/>
            </intent-filter>
        </receiver>

4.创建一个接口ActionUtils,定义广播注册与发送广播的唯一标识:

public interface ActionUtils {
    //广播注册时与发送广播时的唯一标识,必须要保持一致(静态注册)
    String ACTION_FLAG="com.example.day_static";
    //广播注册时与发送广播时的唯一标识,必须要保持一致(动态注册)
    String ACTION_UPDATE_IP="com.example.day_dynamic";
}

5.点击按钮发送广播:

//静态发送广播给接收者
                Intent intent = new Intent();
                //ActionUtils.ACTION_FLAG与注册时保持一致
                intent.setAction(ActionUtils.ACTION_FLAG);
                sendBroadcast(intent);

结果会输出日志:

二、动态注册广播接收者步骤:

1.创建广播接收者

public class DynamicReceiver extends BroadcastReceiver {
    private static final String TAG = "DynamicReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "onReceive: 动态注册广播接收者" );
    }
}

2.在onCreate中动态注册广播接收者:

//使用java代码动态注册广播接收者
        DynamicReceiver dynamicReceiver = new DynamicReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ActionUtils.ACTION_UPDATE_IP);
        registerReceiver(dynamicReceiver,filter);

3.点击按钮发送广播:

Intent intent = new Intent();
                intent.setAction(ActionUtils.ACTION_UPDATE_IP);
                sendBroadcast(intent);

输出日志为:

静态注册广播与动态注册广播的区别:

注意:

在Android8.0 Oreo(API级别26)之前,配置清单文件中注册的Receiver可以通过包含intent-filter标签来指定支持监听隐式广播的动作。

但是,这会引起相关的资源使用风险,如果频繁地广播Intent,则可能会导致应用被重复唤醒,从而导致大量的的电池消耗。

为了最小化这种风险,Android8.0不再支持在配置清单中注册任意隐式Intent的Receiver。

但是少数特殊的系统广播仍然允许使用静态注册的方式来接收。

在这些特殊的系统广播中,有一条值为android.intent.action.BOOT_COMPLETED的广播,这是一条开机广播。

还有其他的一些特殊广播如下

https://developer.android.com/guide/components/broadcast-exceptions.html

所以我们只能通过在配置清单中注册显示广播。

比如 配置清单文件注册广播:

<receiver android:name=".receiver.TestReceiver"/>

在java文件中通过Intent在组件之间广播消息

Intent intent = new Intent(BroadCastTest1Activity.this, TestReceiver.class);
sendBroadcast(intent);

具体的实例

一、应用A,广播接收者的注册与实现

1、在应用A中进行动态广播的注册,具体代码如下

public class MainActivity extends AppCompatActivity {
    private MyReceiver2 myReceiver2;
    private TimeChangeReceiver timeChangeReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //注册广播接收器
    public void register(View view) {
        if (myReceiver2 == null) {
            //创建receiver对象
            myReceiver2 = new MyReceiver2();
            //创建过滤对象
            IntentFilter filter = new IntentFilter("com.example.broadreceiver.MyReceiver1.action");
            //注册receiver
            registerReceiver(myReceiver2, filter);
            Toast.makeText(this, "注册广播接收器", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "已经注册广播接收器", Toast.LENGTH_SHORT).show();
        }
    }
    //解注册广播接收器
    public void sendRegister(View view) {
        if (myReceiver2 != null) {
            unregisterReceiver(myReceiver2);
            Toast.makeText(this, "解注册广播接收器", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "还未注册广播接收器", Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在Activity销毁之前,要解注册广播
        if (myReceiver2 != null) {
            unregisterReceiver(myReceiver2);
            myReceiver2 = null;
        }
    }
    //动态注册广播,能够监听时间变化,一分钟系统会发一次广播
    //之后TimeChangeReceiver()类中的onReceiver()方法,就会得到执行
    public void timeReceiver(View view) {
        if (timeChangeReceiver == null) {
            timeChangeReceiver = new TimeChangeReceiver();
            IntentFilter filter = new IntentFilter("android.intent.action.TIME_TICK");
            registerReceiver(timeChangeReceiver, filter);
        }
    }
}

2、对应的广播接收者类如下

MyReceiver2 类

/**
 * 动态注册的receiver
 */
public class MyReceiver2 extends BroadcastReceiver {
    public MyReceiver2() {
        Log.i("TAG", "MyReceiver2() ");
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        //接收发送广播方,传来的信息
        String action = bundle.getString("action");
        Log.i("TAG", "onReceive2() " + action);
    }
}

TimeChangeReceiver 类

public class TimeChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("TAG", "onReceive() " + "时间改变");
    }
}

二、应用B,广播的发送

应用B中的发送广播,广播发出后,应用A的广播接收者MyReceiver2,就可以监听到该广播信息,回调onReceiver()方法。

public class BroadCastActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broad_cast);
    }
    //发送一般广播
    public void sendNormalBC(View view) {
        Intent intent = new Intent("com.example.broadreceiver.MyReceiver1.action");
        intent.putExtra("action", "gaogao");
        sendBroadcast(intent);
        Toast.makeText(this, "发送一般广播!", Toast.LENGTH_SHORT).show();
    }
}

广播发出后,应用A打出日志


目录
相关文章
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
1243 1
安卓项目:app注册/登录界面设计
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
714 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
608 2
|
存储 Android开发 Kotlin
Kotlin开发安卓app,在使用 MediaPlayer 播放 res/raw 中的音乐时遇到突然中断的问题,而 onErrorListener 没有接收到任何报错
在使用 Android MediaPlayer 播放 res/raw 中的音乐时遇到中断问题,可能的原因包括资源问题、媒体文件编码格式、生命周期管理和设备资源配置。要排查问题,检查音频文件是否正确包含,格式编码是否支持,MediaPlayer 是否正确管理及释放,以及设备是否有足够存储和配置。通过设置 onErrorListener 日志和确保在 onDestroy 中释放资源来调试。如果文件过大,考虑使用 AssetManager。遵循这些步骤可帮助诊断并解决播放中断的问题。
|
设计模式 Android开发
44. 【Android教程】广播接收器:Broadcast Receiver
44. 【Android教程】广播接收器:Broadcast Receiver
729 2
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
1526 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
731 0
|
8月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1432 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
8月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1018 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章