一分钟学会Android--ContentProvider

vivo秋招软件岗笔试复盘:Android基础考点与系统设计全解析 在移动应用开发中,进程通信与系统机制是决定应用稳定性和用户体验的基石。adb调试、fastboot刷机、无线调试配对等技术看似是日常工具,实则映射出Android系统底层的安全模型与通信原理。理解这些概念,有助于开发者深入掌握权限管理、消息传递和系统服务调用等核心机制。在手机厂商的软件招聘中,这些基础知识往往成为笔试的重点考察方向。vivo秋招笔试便以选择题、编程题和系统设计题的形式,全面检验候选人对Android系统架构、View绘制流程、Handler消息机制以及日志上报系统等工程化方案的设计能力。针对 阅读详情

在开发中,我们经常会调用系统联系人,系统相册,视频等。联系人,相册这些算是一个独立的应用,那我们自己的应用怎么能调用其他应用的数据呢?
这其实就是ContentProvider的功劳了,ContentProvider:Android四大组件之一,其作用相当于两个不同应用之前数据交互的桥梁,通过它可以实现跨应用数据共享。

实现步骤

第一步:被调用方提供操作数据的接口,通过继承ContentProvider并重写insert(),delete(),query(),update()完成增删查改的功能。
注意:这里的这几个方法看起来跟数据库的很像,但是这并不意味着数据源必须是数据库,也可以是文件,SharedPreference等,只是大部分数据源都是用的数据库而已。

第二步:被调用方在Manifest.xml文件中注册上一步实现的ContentProvider。

第三步:调用方通过ContentResolver用Uri与第一步创建的ContentProvider连接,并调用暴露出的方法实现数据交互。

下面用代码来说明ContentProvider的使用,顺便吐槽一句,好多人写博客,明明是讲这个,非要在里面揉一大推其他的东西,讲个ContentProvider,三分之二都是SqlLite的操作,除了篇幅多了还有什么卵用。

创建ContentProvider,都是需要重新的父类方法

public class MyContentProvider extends ContentProvider {

    @Override
    public boolean onCreate() {
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.v("out" , "getType方法执行了");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.v("out" , "Insert方法执行了");
        return uri;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.v("out" , "getType方法执行了");
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

在Manifest.xml中注册

<provider
            android:authorities="com.wangliang160616.androidtest.hello"
            android:name="com.wangliang160616.androidtest.others.MyContentProvider"
            android:exported="true"/>

* 创建一个Activity调用这个ContentProvider,为了实现跨进程调用,我们配置了这个Activity的process属性让它运行在另外一个进程中*

public class ContentProviderTestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int pid = android.os.Process.myPid();
        Log.v("out" , "新Activity的进程:"+pid);
        setContentView(R.layout.activity_content_provider_test);
        //创建ContentResolver对象
        ContentResolver contentResolver = getContentResolver();
        Uri uri = Uri.parse("content://"+"com.wangliang160616.androidtest.hello/a/b/10");
        ContentValues contentValues = new ContentValues();
        Uri returnUri = contentResolver.insert(uri , contentValues);
        Log.v("out" , "返回的uri:"+returnUri);
    }
}

看一下结果:
这里写图片描述

最后,还有一个技能点需要get,就是Uri的处理,上面我们将Uri传到了ContentProvider,拿到Uri后需要解析。

UriMatcher和ContentMatcher(下面的代码是网上扒来的,非原创)

uriMatcher用于匹配Uri

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.bing.procvide.personprovider/person路径,返回匹配码为1
sMatcher.addURI("com.bing.procvide.personprovider", "person", 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配content://com.bing.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI("com.bing.provider.personprovider", "person/#", 2);//#号为通配符
switch (sMatcher.match(Uri.parse("content://com.ljq.provider.personprovider/person/10"))) { 
   case 1
     break;
   case 2
     break;
   default://不匹配
     break;
}

ContentUris类用于操作Uri路径后面的ID部分:

Uri uri = Uri.parse("content://com.bing.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10); 
//生成后的Uri为:content://com.bing.provider.personprovider/person/10
//parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10

补充:还有很重要的一点,数据变化和监听

设置监听也很简单,ContentResolver调用registerContentObserver()方法即可。

//注册监听
//这个true代表了只要是uri的派生出的Uri变化了也会通知
        contentResolver.registerContentObserver(uri, true, new ContentObserver(null) {
        //onChange还有一个更多参数的重载方法,但是没什么用,还是调用的这个方法,所以只需要重写这个就可以了
            @Override
            public void onChange(boolean selfChange) {
                super.onChange(selfChange);
                Log.v("out" , "我知道你变了");
            }
        });

然后在数据变化的地方开启通知:

getContext().getContentResolver().notifyChange(uri , null);
好了,ContentProvider就是这么简单,告诉我,是不是分分钟掌握。至于增删查改的具体操作,随你了…
2023年360校招Android客观题解析:高频考点与备考策略 在大厂Android技术岗的笔试中,客观题往往承担着基础能力筛选的重任,这类题目通常围绕Java/Kotlin语言特性、Android系统运行机制以及实际开发中的常见问题展开。其中,Handler机制和Activity生命周期是考察重灾区,也是开发者日常高频使用的核心知识点。理解Handler的Looper与MessageQueue协作原理、掌握Activity在不同场景下的生命周期回调,是应对笔试乃至实际工程开发的关键。对于正在备战大厂校招或希望系统查漏补缺的开发者而言,梳理集合框架、并发编程、四大组件、 阅读详情

相关推荐

AI Agent实时搜索接入实战:基于Google SERP API的完整方案

大语言模型的知识存在截止日期,面对瞬息万变的实时信息,模型参数里的历史快照往往力不从心。AI Agent 要真正具备感知当前世界的能力,关键不在于记住更多数据,而在于知道去哪里获取实时信息,以及如何解析这些信息。SERP(搜索引擎结果页)API 正是打通这一环节的基础设施,它以结构化 JSON 返回搜索结果,让智能体、舆情系统、竞品监控等应用能以标准化方式接入实时数据。文章从 API 核心参数拆解出发,通过 Python 客户端封装与 LangChain 工具回调,完整演示了将实时搜索能力接入 Agent

weixin_33888907的博客 415

ContentProvider基础学习(含权限基本学习)

该组件主要用于在不同应用之间实现数据共享,不过该数据共享可以实现部分数据共享,比如打电话拨号只共享电话本相关信息权限分为两种危险权限和普通权限,如果是普通权限如果你的应用需要使用的话只需要使用以下方式赋予就行,如果是危险权限就需要在应用使用该权限时来决定是否赋予,也就是使其进行运行时权限的赋予。onCreate()当ContentProvider被创建时调用。你可以在这个方法中执行一些初始化工作,比如初始化数据库连接或者其他资源。query()当其他应用程序请求查询数据时调用。

m0_45219171的博客 1391

UE4-(蓝图)第五十五课图片九宫格拉伸的使用

一、为什么使用九宫格拉伸 在UI布局的时候,有时候使用的图片与我们要制作的UI大小有差距,如果图片是普通方式直接拉伸很可能造成图片四个角上的效果与原图片差距太大甚至是变形,这时候使用九宫格模式拉伸,可以保持图片四个角上的样式不发生改变,只对中间区域拉伸。 原始 正常拉伸: 九宫格拉伸: 二、图片参数设置 1.新建一个UI 控件蓝图,在CanvasPanel下拖入一个Image,选择一张...

Stone的博客 7884

在Android Studio中如何实现contentprovider实验+SQLite数据库(保姆级教程)

ContentProvider是Android四大组件之一,另外三个是Activity、Service和Broadcast。它可以被其他应用程序调用,从而实现数据的共享和交互。ContentProvider是Android系统中的一个组件,用于在不同的应用程序之间共享数据。它提供了一种统一的接口,使得应用程序可以访问和修改其他应用程序中的数据,同时还可以对数据进行安全性和权限控制。数据共享:ContentProvider提供了一种标准的接口,允许不同应用程序之间共享数据。

qq_74706597的博客 1353

超详细网安学习路线(Day1-Day2)

渗透测试(Penetration Testing),就是一种通过模拟恶意攻击者的技术与方法,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响后果安全隐患的一种安全测试与评估方法。简单来说,就是合法去入侵别人的系统,来帮助其找出漏洞,增强防护能力。

aobulaien001的博客 3383

ROS2实战:手把手教你用walking机器人仿真实现医院多楼层自动配送(含实时地图切换)

本文详细介绍了如何利用ROS2和walking机器人仿真平台实现医院多楼层自动配送系统,重点讲解了动态地图切换技术和多楼层导航的实现方法。通过实时加载地图和优化电梯过渡策略,解决了医院复杂环境下的自主配送难题,为医疗物流自动化提供了实用解决方案。

weixin_29090917的博客 357

详解ContentProvider的使用

在Android中,应用间的数据共享是一件很常见的事情,典型的场景就是读取手机通讯录。为了实现安全高效地数据共享,Android提供了ContentProvider这一组件,即内容提供器。本文就简单讲解一下ContentProvider的使用。

CodingEnding的博客 2532

解密网页视频Blob链接:从防盗链到流媒体分片技术

本文深入解析了网页视频中Blob链接的工作原理,揭示了其作为现代视频防盗链与流媒体分片技术核心的本质。文章详细阐述了Blob对象与Media Source API如何协同工作,将视频数据分片传输,并结合HTML5的video元素实现安全、流畅的播放体验,有效提升了资源保护能力。

c7d8e的博客 317

Android基础入门教程——4.4.1 ContentProvider初探

Android基础入门教程——4.4.1 ContentProvider初探 本节引言: 1.ContentProvider概念讲解: 2.使用系统提供的ContentProvider 1)简单的读取收件箱信息: 2)简单的往收件箱里插入一条信息 3)简单的读取手机联系人 4)查询指定电话的联系人信息 5)添加一个新的联系人 3.自定义ContentProvider 4.通过ContentObserver监听Cont

Coder-Pig的猪栏 4万+

GitLab社区版vs企业版:本地部署性能对比与选型建议(含实测数据)

本文深入对比GitLab社区版(CE)与企业版(EE)在本地部署中的性能差异与功能特性,提供实测数据与选型建议。测试显示EE版在并发克隆、CI流水线启动等场景性能提升显著,尤其适合需要高级安全合规与CI/CD功能的团队。文章还包含硬件配置指南与成本效益分析,帮助技术决策者做出明智选择。

weixin_28828243的博客 290

衡山派Luban-Lite系统SDIO无线网络配置实战:以D133CBV-QFN88开发板与RTL8189模组为例

本文详细介绍了在衡山派D133CBV-QFN88开发板上,为Luban-Lite系统配置SDIO无线网络的完整实战流程。通过配置SDMC接口、RTL8189 Wi-Fi驱动、lwIP协议栈及内核参数,并解决编译分区问题,最终实现Wi-Fi网络连接与测试,为嵌入式设备联网提供清晰指导。

weixin_35677363的博客 266

ContentProvider讲解与实例应用

什么是ContentProvider: 是Android的四大组件之一 主要用于不同的应用程序之间实现数据共享功能 什么是ContentResolver: 是数据调用者,ContentProvider将数据发布出来,通过ContentResolver对象结合Uri进行调用 通过ContentResolver对象可以调用ContentProvider的增删改查 ...

shaochen2015821426的博客 3万+

UFS软件分区介绍

本文主要介绍了ufs软件分区管理的概况,能够使大家对软件分区有个大体的认识

肥匪斐's blogs 1万+

学习笔记:Android这四个你不可不知的知识点,你都了解多少?

那些你不一定知道的Android知识N系列… Android的四大组件 Activity (活动) Service (服务) Content provider(内容提供器) BroadCast Recevicer(广播) Activity (活动) 体现: 你所看到APP里每个单独的窗口基本上都是Activity。 通信: Activity之间传输数据利用的是Intent组件间通信...

Aerfa789的博客 451

字符编码——简体中文编码中区位码、国标码、内码、外码、字形码的区别及关系

目录区位码国标码(交换码)内码(机内码)区位码、国际码、内码的转换为什么要加上20H为什么加上80H 本文以GB2312为例,讲述区位码、国标码、内码、外码、字形码 区位码 整个GB2312字符集分成94个区,每区有94个位,每个区位上只有一个字符,即每区含有94个汉字或符号,用所在的区和位来对字符进行编码(实际上就是字符编号、码点编号),因此称为区位码。 换言之,GB2312将包括汉字在内的所有字符编入一个94 * 94的二维表,行就是“区”、列就是“位”,每个字符由区、位唯一定位,其对应的区、位编号合并

路人coder 5338

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android 四大组件

1.Activity 1)生命周期 onCreate()->onStart()->onResume()->onPause()->onStop()->onRestart()/onDestory() 2)加载模式 standard,singleTop,singleTask,singInstance 2.Service 1)启动方式 startService() 生命周期onCreate(

碎片整理 359

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android 代码 混淆- 原来如此简单

一个xxx.apk提交给测试、 ok,去倒杯水,看看网页~~~~~ 呃,忽然觉得 是不是应该 给我的代码 提高点安全性, 记得看过 apk直接可以 解压,然后很容易的就可以 反编译出 .java

dearbaba_8520的博客 2731

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android校招笔试复盘:系统原理与构建工具链考点精讲

Android系统原理与构建工具链是开发者提升工程能力的关键。Binder作为Android独有的IPC机制,通过一次拷贝实现高效跨进程通信;AMS统一管理组件生命周期,支撑起startActivity背后的复杂调度。而AGP与Gradle的版本对应关系,例如Android Studio Hedgehog对应AGP 8.2,则直接影响构建效率与兼容性。在Android 13及分区存储普及后,FileProvider的content:// URI授权成为跨应用共享文件的标准方案。从底层机制到构建配置,深入理解

weixin_33895516的博客 399

360校招Android笔试客观题全解析:考点分布与复习策略

Android开发岗位的校招笔试,往往通过客观题考察求职者对系统底层原理的掌握程度,而非简单的API记忆。从Java基础、Handler消息机制,到Activity启动模式与内存优化,每一个高频考点都直接关联着实际工程中的性能调优与架构设计。对于准备面试的开发者而言,理解四大组件的生命周期、消息循环的运作方式以及安全防护的常见陷阱,是构建稳定知识体系的必要前提。无论是参加校招的应届生,还是希望巩固基础的工程师,都可以通过系统梳理笔试真题中的典型题目,高效定位薄弱环节,从而制定更有针对性的复习计划。本合集以3

334

自学Android之设置闹钟

在Android中设置闹钟是通过AlarmManager来实现。 首先我们新建Activity与布局文件。 布局文件代码如下 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" andro

xwq1996的博客 625

android 代码混淆

android 代码 混淆- 原来如此简单 一个xxx.apk提交给测试、 ok,去倒杯水,看看网页~~~~~ 呃,忽然觉得 是不是应该 给我的代码 提高点安全性, 记得看过 apk直接可以 解压,然后很容易的就可以 反编译出 .java 找了找,果然,这一切 只不过是 一分钟的事儿, 1、得到 classes.dex文件;直接用你机器上的 解压软件 打开 .apk 文件...

weixin_30312563的博客 106

面试提前准备,offer胜算翻倍,Android 高级开发面试题及答案解析

无论是应届毕业生、转行还是跳槽,金三银四无疑是一个非常好的找到心仪工作的机会,其重要程度不言而喻。对于互联网行业越来越卷的今天,面对越来越近的金三银四,自然是准备越早,所学知识越细致,上岸的几率越大。 面试需要做哪些准备? 一,个人简历 1) 突出你的亮点 一份简历,简单来说,主要分为四部分: 个人基本信息 工作经历 个人技能 项目经历 而 HR,面试官在筛选简历的时候,很有可能不超过一分钟,在这短短的 60 秒时间之内,如果要脱颖而出,简历一定要突出你的亮点,让人耳目一新,彰显自己的才能。 2. 展现

qq_44102588的博客 476

建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS)...

建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS) 电话黑客android恶意软件编程黑客入侵linux 随着我们继续我们的系列,AMUNET应用程序变得复杂,需要了解新的功能和结构。我们将继续前进。如前面教程中所述,该应用程序并不完全存在,因为我在分享之前构建了它们,如果在教程出来之前时间很长的话请原谅我。我需要确保一...

dfdhxb995397的博客 306

android 代码 混淆

android 代码 混淆- 原来如此简单 一个xxx.apk提交给测试、 ok,去倒杯水,看看网页~~~~~ 呃,忽然觉得 是不是应该 给我的代码 提高点安全性, 记得看过 apk直接可以 解压,然后很容易的就可以 反编译出 .java 找了找,果然,这一切 只不过是 一分钟的事儿, 1、得到 classes.dex文件;直接用你机器上的  解压软件 打开 .apk 文件

OMG_2012的专栏 740
上一篇: Java----IO详解
下一篇: Android适配解决方案
HHcoco
博客等级 码龄13年 46粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值