当前位置: 首页 > article >正文

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) 及以上版本,不会发送以下系统广播:

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中注册的方式。

<!-- 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>
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

ContextCompat.registerReceiver(context, br, filter, receiverFlags);

unregisterReceiver(android.content.BroadcastReceiver)

http://www.kler.cn/news/309096.html

相关文章:

  • 开源免费的NAS系统-TrueNAS CORE搭建和使用(保姆级教程)
  • 基于C++实现(MFC)职工工作量统计系统
  • 机器学习--逻辑回归
  • JavaScript如何判断输入的是空格
  • 常见的反爬虫和应对方法
  • 【SQL】数据库详解-标准SQL语句
  • 协同过滤算法商品推荐系统设计与实现
  • 解决ruoyi-vue-pro-master框架引入报错,启动报错问题
  • 毕设开源 基于python的搜索引擎设计与实现
  • 智能 Uber 发票 PDF 合并工具
  • 【乐企-业务篇】乐企开票具体代码实现
  • Java和西门子S7-1200通讯调试记录
  • GC的算法
  • 从基础到高级:模块化RAG技术全览
  • 【云原生监控】Prometheus之Alertmanager报警
  • 线性基速通
  • 哪款宠物空气净化器是除浮毛王者?希喂、范罗士、霍尼韦尔宠物空气净化器实测
  • 爬坑--docker构建容器ssh连接容器环境变量会发生变化
  • Redis的IO模型
  • 计算机网络分层结构解析:OSI与TCP/IP模型
  • Blender渲染太慢怎么办?blender云渲染已开启
  • 在设计开发中,如何提高网站的用户体验?
  • Qt开发技巧(四)“tr“使用,时间类使用,Qt容器取值,类对象的删除,QPainter画家类,QString的转换,用好 QVariant类型
  • Vite项目中eslint的简单配置
  • Amazon 正式官宣取消居家上班(WFH)
  • Ubuntu apt 命令全面讲解
  • 行业机遇!程序员:如何选择适合自己的就业方向?
  • linux--防火墙
  • 【Android】处理线程中未捕获的异常
  • python加载chgcar, aeccar压缩数据