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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 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的增删改查方法时传递过来的。

目录
相关文章
|
3天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
74 0
|
1月前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
24 3
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
17天前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
33 0
|
1月前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
52 4
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
44 6
|
1月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
216 0
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2

推荐镜像

更多