- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在 Udacity 上学习 Android 类(class),并且遇到了一位学习者在标题中提出的问题。
引用自视频:
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(DroidTermsExampleContract.CONTENT_URI, null, null, null, null);
This code accesses the correct content provider and grabs some data from it. We've got some new concepts of vocabulary here, so I'm going to break it down. The first new concept is the ContentResolver. So our original diagram is fairly simplistic. Let's look at this drawing that we saw before.
The more accurate version of this drawing is this.
And this drawing involves a content resolver. So what's the purpose of having this class sit between your app and direct access to the content provider?
If you think about it, there are multiple content providers on your phone, and you add more content providers when you download apps that store local data, which use content providers. Besides the DroidTermsExample content provider, you have a content provider for contacts, your device has one for user files of the device, one that keeps track of user alarms, the calendar provider, and some others.
Also, your app is not the only app running on the device. There are other apps that might also be using content providers in parallel. Managing what content providers are talking to what apps, and keeping all the data in sync, could turn into a huge traffic jam. That's where the content resolver comes in.
The content resolver acts as an intermediary between each app and the content provider, or providers, it wants to access. It handles inter-process communication and keeps everything in sync and running smoothly. Even if you have five processes accessing two content providers.
So wherever you want to use a Content Provider, you'll need to do it through a ContentResolver. Okay, so now you know what this first line is doing,
ContentResolver resolver = getContentResolver();
getting us a reference to the system's Content Resolver. This is the next step for accessing the Content Provider.
视频中的解释(尤其是上面粗体标记的行)清楚地让我认为有一个适用于 Android 操作系统的 ContentResolver
。
它的工作是让所有想要与一个或多个应用程序的内容提供者对话的应用程序的生活更轻松。
The Content Resolver is the single, global instance in your application that provides access to your (and other applications’) content providers.
来自Android docs :
When you want to access data in a content provider, you use the ContentResolver object in your application's Context to communicate with the provider as a client.
声明:
Since it is mentioned ContentResolver object in your application's Context, hence each Application has it's own Content Resolver
我仍然有一个简单的公平理解,即操作系统提供了一个 ContentResolver
,然后将此解析器带到给定应用程序的上下文中以使用它。这不可能吗?
这是我的第一个 Android 类(class),我是这里的绝对初学者。如果我对这个概念有错误的理解,有人可以澄清一下吗?
最佳答案
ContentResolver
只有一个 单个实例任何给定应用程序中的类。
查看实际ContextImpl
的来源类(实际实现Context
接口(interface)的类),你会发现一个内部静态ApplicationContentResolver
摘要的子类 ContentResolver
管理应用程序和系统服务器之间所有通信的类。 ApplicationContentResolver
的实例在 ContextImpl
的构造函数中创建,并且对于该上下文(或应用程序)是唯一的。
ApplicationContentResolver
将它的调用委托(delegate)给 ActivityThread
负责管理应用程序的主线程 并向系统服务器提供 IPC 通信(通过绑定(bind)程序)的类。在 ActivityThread
类中,您会发现类似 ActivityThread#acquireProvider()
的调用重新使用现有提供程序(并增加其引用计数)或请求 ActivityManagerNative
通过系统服务器 获取提供程序的新实例。这是重要的一步,因为此时系统服务器将检查调用应用程序是否具有所需的权限。
一旦系统服务器确定调用应用程序有足够的权限使用 ContentProvider
,它就会创建 ContentProvider
或重新使用如果它存在并返回对调用应用程序的引用。
来自 ContentProvider
的文档,
Data access methods may be called from many threads at once, and must be thread-safe. Other methods (such as onCreate()) are only called from the application main thread, and must avoid performing lengthy operations.
这意味着单个 ContentProvider
实例在多个应用程序之间共享,并且它的生命周期由系统管理(就像其他组件一样)。
因此总结一下,每个应用程序都有一个单个ContentResolver
实例,还有一个一个单个ContentProvider
整个系统的实例(对于给定的权限)。
关于java - Android 操作系统是否有一个由所有应用程序共享的 `ContentResolver` 对象,或者每个应用程序是否都有自己的 `ContentResolver` 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49547887/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!