Android 面试总结之ContentProvider

1、ContentProvider 是如何实现数据共享的:

在 Android 中如果想将自己应用的数据(一般多为数据库中的数据)提供给第三发应用,那么我们只能通过 ContentProvider 来实现了。 ContentProvider 是应用程序之间共享数据的接口。使用的时候首先自定义 一个类继承 ContentProvider,然后覆写 query、insert、update、delete 等 方法。因为其是四大组件之一因此必须在 AndroidManifest 文件中进行注册。 把自己的数据通过 uri 的形式共享出去 android 系统下 不同程序 数据默认是不能共享访问 需要去实现一个类去继承 ContentProvider。

public class PersonContentProvider extends ContentProvider{
    public boolean onCreate(){ 
   }
   query(Url, String[], String, String[], String);
   insert(Uri,ContentValues);
   update(Uri,ContentValues,String[]);
   delete(Uri,String,String[]);
} 


2. 为什么要用 ContentProvider?它和 sql 的实现上有什么差别?

 ContentProvider 屏蔽了数据存储的细节,内部实现对用户完全透明,用户只 需要关心操作数据的 uri 就可以了,ContentProvider 可以实现不同 app之间 共享。Sql 也有增删改查的方法,但是 sql 只能查询本应用下的数据库。而 ContentProvider 还可以去增删改查本地文件. xml 文件的读取等。

3、Uri介绍


为系统的每一个资源给其一个名字,比方说通话记录。
1)每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。 
2)Android所提供的ContentProvider都存放在android.provider包中。 将其分为A,B,C,D 4个部分:
A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://";
B:URI 的标识,用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在元素的 authorities属性中说明:一般是定义该ContentProvider的包类的名称;
C:路径(path),通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就可以了;"content://com.bing.provider.myprovider/tablename"。

D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部; "content://com.bing.provider.myprovider/tablename/#" #表示数据id。


6. 如何访问 asserts 资源目录下的数据库?

把数据库db复制到 /data/data/packagename/databases/目录下 然后直接就能访问了。

 

7. Android Intent的使用


三大组件——Activity、Service和Broadcast Receiver都是被什么激活的?
答案:Intent是一种运行时绑定的消息机制,而三大组件——Activity、Service和Broadcast Receiver都是被消息激活的,这种消息就是Intent。正如网上一些人解析所说,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent在这里起着实现调用者与被调用者之间的解耦作用。

 一个Intent对象包括六个属性,请一一列举这六个属性。
答案:组件名(Component Name)、动作(Action)、数据(Data)、分类(Category)、额外信息(Extra)和标志(Flags)。

  Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiver或Service),也就是Intent的响应者,有两种方法来匹配:

1、显示意图:

Intent intent = new Intent(TestA.this,TestB.this);
this.startActivity(intent);

2、隐式意图:

隐式匹配,首先要匹配Intent的几项值:Action, Category, Data/Type,Component 
如果填写了Componet就是上例中的Test.class这就形成了显示匹配。所以此部分只讲前几种匹配。匹配规则为最大匹配规则。

 

9、IntentFilter(Intent过滤器) 


为什么要引入IntentFilter? 
答案:对于显式Intent,它的接受者已被指定,所以系统会自动把这个Intent发给指定的组件。但是对于隐式Intent,由于并没有指定其组件名属性,所以系统不知道该把它发给哪个组件名,于是系统就直接将其发出去,算是所有的组件都有权接收,这就需要定义一个组件可以接收到哪些Intent,所以就引入了IntentFilter(Intent过滤器)。

10、Intent 传递数据时,可以传递哪些类型数据? 


Intent 可以传递的数据类型非常的丰富,java 的基本数据类型和 String 以及他们的数组形式都可以,除此之 外还可以传递实现了 Serializable 和 Parcelable 接口的对象。
 

原文:https://blog.csdn.net/vfush/article/details/51482296 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值