Android四大组件全面解析,夯实基础。(下)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Android四大组件lay a solid foundation夯实基础

2.2 动态注册

AndroidMonifest 一定添加

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

Activity

registerReceiver(new MyReceiver(),new IntentFilter("xxx"));
sendBroadcast(new Intent("xxx"));

xml中注册的广播优先级高于动态注册

3. 内部实现机制

  1. 自定义广播接受者 BrodcastReceiver,并复习 onRecvice()方法
  2. 通过 Binder 机制 AMS (Activity Manager Service)进行注册
  3. 广播发送者通过 Binder 机制向AMS发送广播
  4. AMS查找符合相应条件(IntentFilter/Permission等) 的BriadcastReaceiver,将广播发送到 BrodcastReceiver(一般情况下是Activity)相应的消息循环队列之中。
  5. 消息循环 执行拿到此广播后,回调 BrodcastReceiver 中的 onReceiver() ,完成广播发送

4. 本地广播

4.1 LocalBrodcastManager详解

  1. 使用它发送的广播将只在自身app传播,因此不必担心泄漏隐私数据
  2. 其他APP 无法对你的app发送该广播,因为你的app 根本就不可能接收到非自身应用发送的该广播,因此不必担心有安全漏洞可以利用。
  3. 比系统的全局广播更加高效。

Demo

public class Main4Activity extends AppCompatActivity {
    private LocalBroadcastManager localBroadcastManager;
    private IntentFilter intentFilter;
    private Receiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        //过滤器
        intentFilter=new IntentFilter();
        //添加意图
        intentFilter.addAction("xxx");
        receiver=new Receiver();
        //获取实例
        localBroadcastManager=LocalBroadcastManager.getInstance(this);
        //注册本地广播监听器
        localBroadcastManager.registerReceiver(receiver,intentFilter);
        findViewById(R.id.btn_send_Nor).setOnClickListener(v -> {
            Intent intent=new Intent("xxx");
            localBroadcastManager.sendBroadcast(intent);
        });
    }
    class Receiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "收到消息", Toast.LENGTH_SHORT).show();
        }
    }
}

4.2 LocalBroadcastManager

  1. LocalBroadcastManager 高效的原因主要是因为它内部是通过Handler 实现的,它的 senBroadcast() 方法含义并非和我们平常所用的一样,它的 sendBroadcast() 方法其实是通过 Handler 发送了一个 Message 实现的。
  2. 既然它内部是通过Handler实现广播发送,那么相比系统广播通过Binder 实现那肯定是更高效了。同时 别的应用无法向我们的应用发送广播,而我们应用内发送的广播也不会离开我们的应用。
  3. LocalBroadcastManager 内部协作主要是靠两个 Map :mReceier 和 mActions ,当然还有一个 List 集合 mPendingBroadcast,这个主要就是存储待接收的广播对象。

5. 静态注册于动态注册的区别

  • 静态广播:

注册完成就一直在运行

直接把广播接受者写在AndrodMofit,即使Activity被销毁,还是可以收到广播。

  • 动态注册:必须在代码中执行 受activity的生命周期影响
  • 当广播为有序广播时:
  1. 同优先级的广播接收器,静态注册优先级高于动态注册
  2. 同优先级的同类广播接收器,静态广播:先扫描的优先于后扫描的。动态广播:先注册得优先于后注册的。
  • 当广播为标准广播时:

1.无视优先级,动态广播优先于静态广播接收器

2.同优先级的同类广播接收器,静态广播:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

6. 需要注意的地方

当如果要进行的操作需要花费比较长的时间,则不适合放在BroadcastReceiver中进行处理。

引用网上找到的一段解释:

在 Android 中,程序的响应( Responsive )被活动管理器( Activity Manager )和窗口管理器( Window Manager )这两个系统服务所监视。当 BroadcastReceiver 在 10 秒内没有执行完毕,Android 会认为该程序无响应。所以在 BroadcastReceiver 里不能做一些比较耗时的操作,否侧会弹出ANR ( Application No Response )的对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent 给 Service ,由 Service 来完成。而不是使用子线程的方法来解决,因为 BroadcastReceiver 的生命周期很短(在 onReceive() 执行后 BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束BroadcastReceiver 就先结束了。如果 BroadcastReceiver 结束了,它的宿主进程还在运行,那么子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。

ContentProvider 内容提供者

Android四大组件之一,它主要作用就是将程序的内部数据和外部进行共享,微数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享那一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。contentprovider是一种跨程序共享数据的重要组件。

为什么Android要提供 ContentProvider ,而不是直接让我们进行操作,这样不是更复杂吗?

因为我们一一部手机里面可不只有一个app提供内容,它可能安装了很多含有提供商的应用,比如联系人,日历等。有如此多的提供者,如果你开发一块应用要使用其中多个,你不得了解每个 ContentProvider 的不同实现吗,这样来看,岂不是工作量特别大。所以Android为我们提供了 ContentProvider 来同意管理与不同的 ContentProvider 间的操作。



只需它是靠什么来制定不同的访问规则,请看下面。


// 设置URI
Uri uri = Uri.parse("content://com.carson.provider/User/1") 
// 上述URI指向的资源是:名为 `com.carson.provider`的`ContentProvider` 中表名 为`User` 中的 `id`为1的数据
// 特别注意:URI模式存在匹配通配符* & #
// *:匹配任意长度的任何有效字符的字符串
// 以下的URI 表示 匹配provider的任何内容
content://com.example.app.provider/* 
// #:匹配任意长度的数字字符的字符串
// 以下的URI 表示 匹配provider中的table表的所有行
content://com.example.app.provider/table/#

2. 使用方法:

新建一个类继承ContentProvider的方式,并重写它的6个抽象方法。

1.onCreaete()

初始化内容提供器,通常会在这里完成,对数据库的创建和升级数据库,返回true,和false,

2.query()

从内容提供器中查询数据,使用uri参数确定来查询那个那张表,progjction参数用于确定查询那些列,selection和selectionAargs参数用于约束查询哪些行,查询的结果存放在Cursor对象中。

3.insert()

想内容提供器中添加一条数据,使用uri参数来确定要添加到的表,待添加的数据保存在values参数中,添加完成后,返回一个用于表示这条新记录的uri.

4.update()

更新内容提供器中已有的数据,使用URI参数来确定更新那一张表中的数据,新数据保存在values参数中,,selection和selectionArgs参数用于约束更新那些行,受影响的的行数将做为返回值返回。

5.delete()

从内容提供器中删除数据2,使用uri参数来确定删除哪一样表中的数据,selection和selectionArgs参数用于约束删除那些行,被删除的行数将作为返回值返回。

6.getType()

根据返回的内容URI来返回相应的MIME类型。

而他们每一个方法都带有一个uri参数,这个参数正是调用ConterntResolver的增删改查方法时传递过来的。

目录
相关文章
|
19天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
96 2
|
18天前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
20天前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
51 0
|
2天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
8 1
|
12天前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
55 2
|
14天前
|
机器学习/深度学习 编解码 算法
深入解析MaxFrame:关键技术组件及其对视频体验的影响
【10月更文挑战第12天】随着流媒体服务和高清视频内容的普及,用户对于视频质量的要求越来越高。为了满足这些需求,许多技术被开发出来以提升视频播放的质量。其中,MaxFrame是一种旨在通过一系列先进的图像处理算法来优化视频帧的技术。本文将深入探讨构成MaxFrame的核心组件,包括运动估计、超分辨率重建以及时间插值算法,并讨论这些技术如何协同工作以改善视频播放效果。
25 1
|
21天前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
17 3
|
21天前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
27天前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
37 4
|
30天前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
34 6

推荐镜像

更多