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的增删改查方法时传递过来的。

目录
相关文章
|
3月前
|
前端开发 JavaScript
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
91 17
|
4月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
4月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
8天前
|
索引
【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
在 Flutter 开发中,AzListView 是实现字母索引分类列表的理想选择。它支持 A-Z 快速跳转、悬浮分组标题、自定义 UI 和高效性能,适用于通讯录、城市选择等场景。本文将详细解析 AzListView 的核心参数和实战示例,助你轻松实现流畅的索引列表。
26 7
|
3月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
3月前
|
前端开发 UED
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
129 8
|
3月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
3月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
4月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
4月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
106 0

热门文章

最新文章

  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    56
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    39
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    40
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    44
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    155
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    52
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    67
  • 9
    Android历史版本与APK文件结构
    170
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54
  • 推荐镜像

    更多