Android注册广播

一、系统广播随着Android版本的变化

Android 14

Android 14(API level 34)

While apps are in a cached state, broadcast delivery is optimized for system health. For example, less important system broadcasts such as ACTION_SCREEN_ON are deferred while the app is in a cached state. Once the app goes from the cached state into an active process lifecycle, the system delivers any deferred broadcasts.

Important broadcasts that are declared in the manifest temporarily remove apps from the cached state for delivery.

Android 9

从Android 9 (API level 28)开始, 通知 NETWORK_STATE_CHANGED_ACTION 不再接收用户位置或者个人身份数据。

另外,App安装在Android 9 或者更高版本的手机上,WIFI的系统广播不再包含SSID,BSSID等连接信息或扫描结果。获取这些信息,需要调用getConnectionInfo()方法。

Android 8.0

从Android 8.0 (API level 26)开始,系统对在manifest中声明receiver做了额外的限制:

如果targetSdkVersion大于Android 8.0及以上版本(targetSdkVersion>=26),对于大部分"隐性广播"(implicit broadcasts)我们都不能在manifest中声明<receiver>来注册广播接收器。我们仍然可以使用registerReceiver(BroadcastReceiver, IntentFilter)注册广播接收器。

Android 7.0

Android 7.0 (API level 24) 及以上版本,不会发送以下系统广播:

groovy 复制代码
ACTION_NEW_PICTURE
ACTION_NEW_VIDEO

同样,targetSdkVersion指定为Android 7.0及以上版本的(targetSdkVersion>=24),必须使用

registerReceiver(BroadcastReceiver, IntentFilter)注册CONNECTIVITY_ACTION 广播.在manifest中声明<receiver>不会生效。

二、接受广播

有两种接受广播方式

1、在manifest中声明receivers

在manifest中声明广播receiver,当广播发出后,系统会启动我们的App(即便我们的App已经不再运行)

注意:如果我们的App设置targetSdkVersion>=26,对于隐性广播(implicit broadcasts)我们不能在manifest中声明receiver。
作者编写:既然Google已经意识到了在manifest中注册广播接收器,会启动我们的App存在安全风险,从API Level 26开始,就基本弃用manifest中注册的方式。

groovy 复制代码
<!-- If this receiver listens for broadcasts sent from the system or from
     other apps, even other apps that you own, set android:exported to "true". -->
<receiver android:name=".MyBroadcastReceiver" android:exported="false">
    <intent-filter>
        <action android:name="APP_SPECIFIC_BROADCAST" />
    </intent-filter>
</receiver>
java 复制代码
public class MyBroadcastReceiver extends BroadcastReceiver {
        private static final String TAG = "MyBroadcastReceiver";
        @Override
        public void onReceive(Context context, Intent intent) {
            StringBuilder sb = new StringBuilder();
            sb.append("Action: " + intent.getAction() + "\n");
            sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
            String log = sb.toString();
            Log.d(TAG, log);

            ActivityNameBinding binding =
                    ActivityNameBinding.inflate(layoutInflater);
            val view = binding.root;
            setContentView(view);

            Snackbar.make(view, log, Snackbar.LENGTH_LONG).show();
        }
    }

2、基于Context注册广播receivers

groovy 复制代码
ContextCompat.registerReceiver(context, br, filter, receiverFlags);

unregisterReceiver(android.content.BroadcastReceiver)
相关推荐
素师良码41 分钟前
第5篇:显示驱动必备调试工具浅析
android
维克兜率天1 小时前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化
墨天梦2 小时前
B06_XML控件布局与ViewBinding
android·kotlin
晚风叙码2 小时前
MySQL 表的操作:从建表到删表,一篇讲清楚
android·mysql·oracle
事圆则缓3 小时前
Android 性能优化常见工具与使用场景:从症状到证据的排查指南
android·性能优化
avi91113 小时前
Unity 非后台,非自动构建,但统计报表 BuildReport ,构建自动化系统C#
android·webserver·ios打包·admin·c#后台·unity打包系统·unity自动构建
新鲜势力呀4 小时前
PHP 定时任务系统实战:从 Cron 混乱执行到任务调度中心 + Redis队列 + 失败重试
android·java·redis
YF02114 小时前
Android 16系统 如何修改 eth0 IP ?
android
其实防守也摸鱼4 小时前
渗透测试学习计划(全栈综合 · 零基础进阶)
android·数据库·学习·安全·oracle·自动化·学习方法
释厄6235 小时前
BSD 简单真理循环论——简单真理 × 复杂循环=大一统
android·开发语言·kotlin