当前位置:   article > 正文

Android四大组件之ConentProvider._android 四大组件之con

android 四大组件之con

Android中的四大组件有一个叫做ContentProvider的东西,这货是用来干什么的呢?

下面听小弟给你细细道来:

基本介绍:

           Android中有四大组件分别是Activity,ContentProvider,Service,BroadcastReceiver,它们都需要在AndroidManifest.xml文件中进行配置.

           ContentProvider组件主要用于Android系统中应用程序之间交换数据,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过ContentProvider来实现;其他应用程序就可以通过ContentResolver来操作ContentProvider暴露的数据.

           当一个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可以通过该接口操作该应用程序内部的数据,包括增加,删除,修改,查询数据等.

大概思路:

            

ContentProvider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用ContentResolver根据Uri去访问操作指定数据;

开发ContentProvider步骤:

         1.定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类.

         2.向Android系统注册这个ContentProvider,也就是在AndroidManifest.xml文件中注册这个ContentProvider,就和注册Activity一样,注册ContentProvider时需要为它绑定一个Uri;

         注:向Android中注册ContentProvider,只需在AndroidManifest.xml配置文件中<application.../>元素下添加如下子元素即可:

 

  1. <!- -下面配置中name属性指定为ContentProvider类,
  2. authorities就相当于为该ContentProvider指定域名,exported设置为true就是允许其他应用访问该应用内部
  3. - ->
  4. <provider
  5. android:name="com.xiyou.MProvider"
  6. android:authorities="com.xiyou.provider.mprovider"
  7. android:exported="true"/>

 通过注册上面的provider别的应用就可以通过这个Uri访问MProvider所暴露的数据.

 

 继承ContentProvider的这个MProvider类通常要提供以下几种方法,以让外部应用访问:

                 public boolean onCreate():该方法在ContentProvider创建后会被调用,当其他应用程序第一次访问ContentProvider,该ContentProvider会被创建出来,并立即回调该onCreate()方法.

                 public Uri insert(Uri uri,  ContentValues values):根据该Uri插入values对应的数据.

                 public int delete(Uri uri, String selection, String[] selectionArgs):根据Uri删除select条件所匹配的全部数据.

                 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):根据Uri修改select条件所匹配的全部记录.

                 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):根据Uri查询出select条件所匹配的全部记录,其中projection就是一个列名列表,表明只选择出指定的数据列. 

                 public String getType(Uri uri):该方法用于返回当前Uri所代表的数据的MIME类型.如果该Uri对应数据可能包括多条记录,那么MIME类型字符串应该以vnd.android.cursor.dir/开头;如果该Uri对应的数据只包含一条记录,那么返回MIME类型字符串应该以vnd.android.cursor.item/开头.

 

从每一个方法的参数中我们可以看出Uri是一个非常重要的参数,那么下面我们来了解了解Uri:

 

                我们先来给出一个简单的URL:http://www.xiyou.edu.cn/test.php

                分解开来看:

                http://:URL的协议部分;只要通过HTTP协议访问网站,这个部分是固定的.

                www.xiyou.edu.cn:域名部分.只要访问指定的网站,这个部分总是固定的.

                test.php:网站资源部分.当访问者需要访问不同资源时,这个部分根据资源的不同而改变.

 

                ContentProvider要求的Uri与此类似,例如如下Uri:content://com.xiyou.provider.mprovider/test

                分解开来看:

                content://:此部分是Android的ContentProvider规定的,就想网上的协议默认是http://一样.暴露ContentProvider,访问ContentProvider的协议默认是content://.

                com.xiyou.provider.mprovider:这个部分是就是ContentProvider的authority.系统就是由这个部分来找到操作哪个ContentProvider只要访问指定的ContentProvider,这个部分总是固定的.

                test:资源部分,当访问者需要访问不同的资源时,这个部分是动态改变的 

 

使用ContentResolver操作数据如下方法:

               通过getContentResolver()方法获取ContentResolver对象,获得ContentResolver对象后通过调用ContentResolver的如下方法操作ContentProvider中的数据.

               insert(Uri uri, ContentValues values):向对应的ContentProvider中插入values对应的数据.

               delete(Uri uri, String where, String[] selectionArgs):删除Uri对应的ContentProvider中where提交匹配的数据.

               update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri对应的ContentProvider中where提交匹配的数据.

               query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder):查询Uri对应的ContentProvider中select提交的匹配的数据.

               

                    ContentProvider,Uri,COntentResolver三者之间有着某些关系:

                    

     下面开发一个ContentProvider和ContentResolver的例子来给大家看看:

     ContentProvider程序:

     

  1. package com.example.firstprovider;
  2. import android.net.Uri;
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.content.ContentProvider;
  6. import android.content.ContentValues;
  7. import android.database.Cursor;
  8. import android.view.Menu;
  9. public class MainActivity extends ContentProvider {
  10. // 第一次创建该ContentProvider时调用该方法
  11. @Override
  12. public boolean onCreate() {
  13. System.out.println("==onCreate()方法被调用==");
  14. return true;
  15. }
  16. // 实现查询方法,该方法应该返回查询得到的Cursor
  17. @Override
  18. public Cursor query(Uri uri, String[] projection, String selection,
  19. String[] selectionArgs, String sortOrder) {
  20. System.out.println(uri + "==query()方法被调用==");
  21. System.out.println("selection参数为:" + selection);
  22. return null;
  23. }
  24. // 该方法的返回值代表了该ContentProvider所提供的数据的MIME类型.
  25. @Override
  26. public String getType(Uri uri) {
  27. return null;
  28. }
  29. // 实现插入的方法,该方法应该返回新插入的记录的Uri
  30. @Override
  31. public Uri insert(Uri uri, ContentValues values) {
  32. System.out.println(uri + "==insert()方法被调用==");
  33. System.out.println("values参数为:" + values);
  34. return null;
  35. }
  36. // 实现删除方法,该方法应该返回被更新的记录条数
  37. @Override
  38. public int delete(Uri uri, String selection, String[] selectionArgs) {
  39. System.out.println(uri + "==deletet()方法被调用==");
  40. System.out.println("selection参数为:" + selection);
  41. return 0;
  42. }
  43. // 实现更新方法,该方法应该返回被更新的记录条数
  44. @Override
  45. public int update(Uri uri, ContentValues values, String selection,
  46. String[] selectionArgs) {
  47. System.out.println(uri + "==update()方法被调用==");
  48. System.out
  49. .println("selection参数为:" + selection + ",values参数为:" + values);
  50. return 0;
  51. }
  52. }

 

 

 

ContentProvider程序的AndroidManifest.xml

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.firstprovider"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="18" />
  9. <application
  10. android:allowBackup="true"
  11. android:icon="@drawable/ic_launcher"
  12. android:label="@string/app_name"
  13. android:theme="@style/AppTheme" >
  14. <activity
  15. android:name="com.example.firstprovider.MainActivity"
  16. android:label="@string/app_name" >
  17. <intent-filter>
  18. <action android:name="android.intent.action.MAIN" />
  19. <category android:name="android.intent.category.LAUNCHER" />
  20. </intent-filter>
  21. </activity>
  22. <provider
  23. android:name=".MainActivity"
  24. android:authorities="com.xiyou.provider.firstprovider"
  25. android:exported="true"
  26. ></provider>
  27. </application>
  28. </manifest>

 

 

 

 

 

ContentResolver程序:

布局代码中只有四个button所以未给出:

 

  1. package com.example.firstresolver;
  2. import android.net.Uri;
  3. import android.os.Bundle;
  4. import android.R.integer;
  5. import android.app.Activity;
  6. import android.app.DownloadManager.Query;
  7. import android.content.ContentResolver;
  8. import android.content.ContentValues;
  9. import android.database.Cursor;
  10. import android.view.Menu;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.Toast;
  15. public class MainActivity extends Activity {
  16. Button query, insert, update, delete;
  17. Uri uri = Uri.parse("content://com.xiyou.provider.firstprovider/");
  18. ContentResolver contentResolver;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. contentResolver = this.getContentResolver();
  24. query = (Button) findViewById(R.id.query);
  25. update = (Button) findViewById(R.id.update);
  26. insert = (Button) findViewById(R.id.insert);
  27. delete = (Button) findViewById(R.id.delete);
  28. query.setOnClickListener(new OnClickListener() {
  29. @Override
  30. public void onClick(View v) {
  31. // TODO Auto-generated method stub
  32. query(v);
  33. }
  34. });
  35. insert.setOnClickListener(new OnClickListener() {
  36. @Override
  37. public void onClick(View v) {
  38. // TODO Auto-generated method stub
  39. insert(v);
  40. }
  41. });
  42. delete.setOnClickListener(new OnClickListener() {
  43. @Override
  44. public void onClick(View v) {
  45. // TODO Auto-generated method stub
  46. delete(v);
  47. }
  48. });
  49. update.setOnClickListener(new OnClickListener() {
  50. @Override
  51. public void onClick(View v) {
  52. // TODO Auto-generated method stub
  53. update(v);
  54. }
  55. });
  56. }
  57. @Override
  58. public boolean onCreateOptionsMenu(Menu menu) {
  59. // Inflate the menu; this adds items to the action bar if it is present.
  60. getMenuInflater().inflate(R.menu.main, menu);
  61. return true;
  62. }
  63. public void query(View source) {
  64. // 调用ContentResolver的query()方法
  65. // 实际返回的是该Uri对应的ContentProvider的query()的返回值
  66. Cursor c = contentResolver.query(uri, null, "query_where", null, null);
  67. Toast.makeText(this, "远程ContentProvider返回的Cursor为:" + c,
  68. Toast.LENGTH_SHORT).show();
  69. }
  70. public void insert(View source) {
  71. ContentValues contentValues = new ContentValues();
  72. contentValues.put("name", "xiyoucx");
  73. // 调用ContentResolver的insert()方法
  74. // 实际返回的是该Uri对应ContentProvider的insert()方法返回值
  75. Uri newUri = contentResolver.insert(uri, contentValues);
  76. Toast.makeText(this, "远程ContentProvider返回的新插入记录的Uri为:" + newUri,
  77. Toast.LENGTH_SHORT).show();
  78. }
  79. public void update(View source) {
  80. ContentValues contentValues = new ContentValues();
  81. contentValues.put("name", "xiyoucx");
  82. // 调用ContentResolver的update()方法
  83. // 实际返回的是该Uri对应的contentp的update()返回值
  84. int count = contentResolver.update(uri, contentValues, "update_values",
  85. null);
  86. Toast.makeText(this, "远程ContentProvider返回的新插入记录数为:" + count,
  87. Toast.LENGTH_SHORT).show();
  88. }
  89. public void delete(View source) {
  90. // 调用ContentResolver的delete()方法
  91. // 实际返回的是该Uri对应的contentp的delete()的返回值
  92. int count = contentResolver.delete(uri, "delete_where", null);
  93. Toast.makeText(this, "远程ContentProvider返回的删除记录数为:" + count,
  94. Toast.LENGTH_SHORT).show();
  95. }
  96. }


运行结果:

 

 

这奏是两个程序之间的数据交换.

 

下面我们再来看看应用程序如何获取系统内部数据:

以联系人为例:

 

               未完待续~~

               

 

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号