Android 四大组件 (四) ContentProvider介绍

ContentProvider虽然与Activity、Service、BroadcastReceiver齐名为Android四大组件。如果你不是特别开发一款与其他APP有数据交互的应用,它的使用频率远没有另外三者高。因为已经介绍了前三大组件,为了完善Android四大组件介绍了解,这次补充下ContentProvider介绍。哈哈~一边在看世界杯,巴西打瑞士。目前巴西1:0。我把所有金币全压巴西了~题外话说完,下面简单介绍下ContentProvider。

一.  ContentProvider简介和常见使用场景:

Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。

由此我们知道,ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的形式来组织数据。使用ContentProvider可以在不同的应用程序之间共享数据。Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。总结就是: ContentProvider一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。

二.ContentProvider 常见的几个类:

1.ContentResolver

Android为我们提供了ContentResolver来统一管理与不同ContentProvider间的操作。

调用getContentResolver()来获得ContentResolver。

ContentResolver是如何来区别不同的ContentProvider的呢?这就涉及到URI(Uniform Resource Identifier)问题。

2.URI

ContentProvider中的URI有固定格式,如下图:

  

  Authority:授权信息,用以区别不同的ContentProvider;
  Path:表名,用以区分ContentProvider中不同的数据表;
  Id:Id号,用以区别表中的不同数据;

三.ContentProvider查询手机通讯录联系人信息示例:

    private TextView tv_query_contacts;
    private TextView tv_info_contacts;

    String[] premiss = new String[]{
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_info_contacts = findViewById(R.id.tv_info_contacts);
        tv_query_contacts = findViewById(R.id.query_contacts);
        tv_query_contacts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkPresmissed();
            }
        });
    }

    /**
     * 查询手机通讯录所有联系人名称
     */
    private void queryContacts() {

        Uri urlContacts = Uri.parse("content://com.android.contacts/contacts");
        ContentResolver contentResolver = getContentResolver();
        Cursor cursorsContacts = contentResolver.query(urlContacts, new String[]{ContactsContract.Data._ID}, null, null, null);
        StringBuilder stringBuilder = new StringBuilder();
        while (cursorsContacts.moveToNext()) {

            Uri uriPhone = Uri.parse("content://com.android.contacts/contacts/" + cursorsContacts.getInt(0) + "/data");
            Cursor cursorPhone = contentResolver.query(uriPhone, new String[]{ContactsContract.Data.DATA1, ContactsContract.Data.MIMETYPE}, null, null, null);
            while (cursorPhone.moveToNext()) {
                if(cursorPhone.getString(cursorPhone.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){
                    //姓名
                    stringBuilder.append(cursorPhone.getString(cursorPhone.getColumnIndex("data1")));

                }
            }
        }

        tv_query_contacts.setText("");
        tv_info_contacts.setText(stringBuilder.toString());
    }

    private void checkPresmissed() {
        /**
         * 第 1 步: 检查是否有相应的权限
         */
        boolean isAllGranted = checkPermissionAllGranted(
                new String[]{
                        Manifest.permission.READ_CONTACTS,
                        Manifest.permission.WRITE_CONTACTS
                }
        );
        // 如果这3个权限全都拥有, 则直接执行备份代码
        if (isAllGranted) {
            queryContacts();
        } else {
            /**
             * 第 2 步: 请求权限
             */
            // 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉
            ActivityCompat.requestPermissions(this, premiss, 11);

        }

    }

    /**
     * 检查是否拥有指定的所有权限
     */
    private boolean checkPermissionAllGranted(String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                // 只要有一个权限没有被授予, 则直接返回 false
                return false;
            }
        }
        return true;
    }

    //授权回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 11) {
            queryContacts();
        }
    }

  

原文地址:https://www.cnblogs.com/bugzone/p/ContentProvider.html

时间: 2024-10-12 21:28:48

Android 四大组件 (四) ContentProvider介绍的相关文章

深入理解Android四大组件之一ContentProvider

ContentProvider作为Android四大组件之一,平时写自己的ContentProvider比较少,但是用到ContentProvider地方还是有的,比如去获取通讯录信息,这其实就间接的使用到了通讯录程序的ContentProvider组件. 先简单说一下ContentProvider组件.后面重点分析源码了解ContentProvider运行的过程. ContentProvider可以实现在应用程序之间共享数据. Android为常见的一些数据提供了默认的ContentProvi

Android四大组件之一Service介绍-android学习之旅(十二)

基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService启动并把绑定该组件进行通信. 使用场景 后台下载文件,以及播放音乐等 注意 service运行在主线程中,他不会创建属于自己的线程,也不是运行在独立的线程中,所以在使用的时候,需要自己创建线程,而不应该直接使用,这样会造成ANR错误. service的两种形式 started service 其他组

Android 四大组件 (三) BroadcastReceiver 介绍

一. BroadcastReceiver 使用场景 Broadcast主要是用作消息通信(专业术语叫IPC),Android的IPC基本都是binder来实现,那么这里的BroadcastReceiver其实也是对binder的一个封装,方便上层调用.开发过程中遇到的单进程多线程通信的场景比较多,所以这种情况下使用Broadcast并不是最佳选择,很多人会自己实现一套 Observer 或者使用EventBus等第三方库来完成该功能,不可否认,他们在这种场合下不论是效率还是灵活性方面都更具优势.

【Android的从零单排开发日记】之入门篇(九)——Android四大组件之ContentProvider

数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等).如果把第三方应用比作一个黑盒子的话,ContentProvider就像是从里面延伸出来的管道,从这个管道,应用可以把一些数据共享出来,我们也可以往里面输送数据.但是里面怎么处理数据我们看不到,也管不着.并且这个管道是有规范标准的,不是它规定的数据你塞不进

【Android的从零单排开发日记】——Android四大组件之ContentProvider

数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等).如果把第三方应用比作一个黑盒子的话,ContentProvider就像是从里面延伸出来的管道,从这个管道,应用可以把一些数据共享出来,我们也可以往里面输送数据.但是里面怎么处理数据我们看不到,也管不着.并且这个管道是有规范标准的,不是它规定的数据你塞不进

android四大组件之ContentProvider(一)

ContentProvider学习笔记 1. ContentProvider基本概念 ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需. (1)

Android笔记(五十四) Android四大组件之一——ContentProvider(一)

ContentProvider提供数据 在Android中,他的每个应用都是相互独立的,各自运行在自己的Dalvik虚拟机中,但现实使用中常常需要在多个应用之间进行数据交换,例如发短信需要获取联系人中的内容,QQ上传头像需要获取相册内容等等,Android为这种跨应用的数据交换提供了一个标准ContentProvider,用户实现自己的ContentProvider时,需要实现他规定的抽象方法: public boolean onCreate():该方法在ContentProvider创建后会被

Android四大组件之ContentProvider

内容提供者 应用的数据库是不允许其他应用访问的,内容提供者的作用就是把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. 我们可以通过自定义内容提供者来了解内容提供者的原理 自定义内容提供者步骤: 第一步:我们想写一个myOpenHelper继承SQLiteOpenHelper,来创建一个数据库 第二步 :写myContentProviderjava类继承ContentProvider的内容提供者类,重写增删改查的方法. 内容提供者需要在清单文件中注册 具体代码: //内容提供者

Android四大组件之Activity介绍

1.activity (1)一个Activity通常就是一个单独的屏幕(窗口),简单来说activity就是一个交互界面,一般应用程序都要由一个或者多个activity组成. (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. (4)Activity的生命周期 一个Activity的启动顺序: onCreate()-->onStart()