`
bk_lin
  • 浏览: 336709 次
社区版块
存档分类
最新评论

Android入门:监听ContentProvider数据改变

阅读更多

一、监听ContentProvider主要步骤


1.在ContentProvider类的insert\update\delete方法加入this.getContext().getContentResolver().notifyChange(URI,null);
其中URI表示监听的URI
null表示发送消息给任何人;
2.在访问者的类中调用如下方法:
context.getContentResolver().registerContentObserver(uri,true,ContentObserver observer);
即可;

二、实例





我们在Test1和Test2应用都对ContentProvider的数据改变进行注册,如果ContentProvider发出通知,则Test1和Test2都会收到通知;
注意:此处有一个很重要的问题,如果Test1和Test2应用的MainActivity为同一个包,则如果先运行Test2,再运行Test1,则Test2会停止运行,因为Test1应用会覆盖Test2的应用,即接收不到通知;
因此我们要把Test1应用和Test2应用的包名设为不同,此处为org.xiazdong和org.xzdong;


ContentProvider.java

Java代码 
  1. package org.xiazdong.db;  
  2.   
  3. import android.content.ContentProvider;  
  4. import android.content.ContentUris;  
  5. import android.content.ContentValues;  
  6. import android.content.UriMatcher;  
  7. import android.database.Cursor;  
  8. import android.database.sqlite.SQLiteDatabase;  
  9. import android.net.Uri;  
  10.   
  11. public class PersonProvider extends ContentProvider{  
  12.     private DatabaseHelper helper;  
  13.     private SQLiteDatabase db;  
  14.     private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  
  15.     @Override  
  16.     public boolean onCreate() {  
  17.         helper = new DatabaseHelper(this.getContext());  
  18.         matcher.addURI("org.xiazdong.provides.personprovider""person"1);  
  19.         return true;  
  20.     }  
  21.   
  22.     @Override  
  23.     public Cursor query(Uri uri, String[] projection, String selection,  
  24.             String[] selectionArgs, String sortOrder) {  
  25.         return null;  
  26.     }  
  27.     /* 
  28.      * 如果操作集合,则必须以vnd.android.cursor.dir开头 
  29.      * 如果操作非集合,则必须以vnd.android.cursor.item开头 
  30.      * */  
  31.     @Override  
  32.     public String getType(Uri uri) {  
  33.         return "";  
  34.     }  
  35.     @Override  
  36.     public Uri insert(Uri uri, ContentValues values) {  
  37.         db = helper.getWritableDatabase();  
  38.         switch(matcher.match(uri)){  
  39.         case 1:  
  40.             long rowid = db.insert("person"null, values);  
  41.             this.getContext().getContentResolver().notifyChange(uri, null);//如果改变数据,则通知所有人  
  42.             return ContentUris.withAppendedId(uri, rowid);  //返回插入的记录所代表的URI  
  43.         default:  
  44.             throw new IllegalArgumentException("wrong uri");  
  45.         }  
  46.     }  
  47.     @Override  
  48.     public int delete(Uri uri, String selection, String[] selectionArgs) {  
  49.         return 0;  
  50.     }  
  51.     @Override  
  52.     public int update(Uri uri, ContentValues values, String selection,  
  53.             String[] selectionArgs) {  
  54.         return 0;  
  55.     }  
  56. }  


Test1应用

Java代码 
  1. package org.xiazdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ContentResolver;  
  5. import android.content.ContentValues;  
  6. import android.database.ContentObserver;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14.   
  15. public class MainActivity extends Activity {  
  16.     private Button button;  
  17.     private OnClickListener listener = new OnClickListener(){  
  18.   
  19.         @Override  
  20.         public void onClick(View v) {  
  21.             ContentResolver resolver = MainActivity.this.getContentResolver();  
  22.             Uri uri = Uri.parse("content://org.xiazdong.provider2/person");  
  23.             resolver.registerContentObserver(uri, truenew PersonObserver(new Handler()));  
  24.             ContentValues values = new ContentValues();  
  25.             values.put("name""zzz");  
  26.             values.put("age"1);  
  27.             resolver.insert(uri, values);   //向ContentProvider插入数据  
  28.         }  
  29.     };  
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.main);  
  34.         button = (Button)this.findViewById(R.id.button);  
  35.         button.setOnClickListener(listener);  
  36.     }  
  37.     private class PersonObserver extends ContentObserver{//监听  
  38.         public PersonObserver(Handler handler) {  
  39.             super(handler);  
  40.         }  
  41.         //当ContentProvier数据发生改变,则触发该函数  
  42.         @Override  
  43.         public void onChange(boolean selfChange) {  
  44.             super.onChange(selfChange);  
  45.             Log.i("Test1""数据改变");  
  46.         }  
  47.     }  
  48. }  

Test2应用

Java代码 
  1. package org.xzdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.database.ContentObserver;  
  5. import android.net.Uri;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.util.Log;  
  9.   
  10. public class MainActivity extends Activity {  
  11.     /** Called when the activity is first created. */  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.         Uri uri = Uri.parse("content://org.xiazdong.provider2/person");  
  17.         this.getContentResolver().registerContentObserver(uri, truenew PersonObserver(new Handler()));  
  18.     }  
  19.     private class PersonObserver extends ContentObserver{  
  20.   
  21.         public PersonObserver(Handler handler) {  
  22.             super(handler);  
  23.         }  
  24.         //当ContentProvier数据发生改变,则触发该函数  
  25.         @Override  
  26.         public void onChange(boolean selfChange) {  
  27.             super.onChange(selfChange);  
  28.             Log.v("Test2""数据改变");  
  29.         }  
  30.     }  
  31. }  

效果:


5
3
分享到:
评论

相关推荐

    Android入门必备:用Eclipse开发Android应用程序.doc

    5. **ContentProvider**:共享和访问数据的接口,允许不同应用之间交换数据。 AndroidManifest.xml文件是每个应用的重要组成部分,它包含了应用的元数据,如所需的权限、使用的库、声明的活动和服务等。例如,清单1...

    android入门到精通.pdf

    《Android入门到精通》这本书是为想要学习和掌握Android应用开发的初学者量身打造的指南。Android作为全球最流行的移动操作系统,拥有庞大的用户群体,为开发者提供了广阔的应用市场和无限的创新空间。本书旨在帮助...

    android从入门到精通ppt

    《Android从入门到精通》是一套全面而深入的Android学习教程,主要针对想要掌握Android开发技术的初学者和进阶者。本教程通过PPT的形式,以清晰的逻辑和丰富的实例,逐步引领学习者步入Android的世界。以下是本教程...

    Android经典入门教程

    4. ContentProvider:ContentProvider是数据存储和共享的桥梁,允许应用之间共享数据,如联系人、日历等。 四、Intent和激活组件 Intent是Android中连接组件的桥梁,它用来启动Activity或Service,或者在组件间传递...

    android 从入门到精通电子书

    Android提供了多种数据存储方式,包括SharedPreferences用于轻量级数据存储,SQLite数据库用于结构化数据,以及文件存储和ContentProvider等。理解何时选择合适的存储方式,以及如何进行数据操作,是提升应用功能性...

    Android入门到精通详解

    Android入门到精通详解 在移动应用开发领域,Android是最受欢迎的操作系统之一,为开发者提供了丰富的功能和广阔的创新空间。本文将全面介绍从Android基础到高级技术的各个环节,帮助你从入门到精通,成为一名合格...

    Android入门中文文档

    Android入门中文文档是一份专为初学者设计的指南,旨在帮助新接触Android开发的朋友们快速理解和掌握这个全球最大的智能手机操作系统的基础知识。这份文档通常包含了从安装开发环境到编写第一个应用程序的所有步骤,...

    android入门到精通

    在进入Android开发的世界之前,首先理解“Android入门到精通”这一主题是非常重要的。这是一套专为初学者设计的学习资源,旨在帮助你从零基础逐渐掌握Android应用开发的方方面面。以下是一些关键知识点的详细说明: ...

    Android开发入门教程笔记

    6. **数据存储**:Android支持多种数据存储方式,如SQLite数据库、SharedPreferences用于轻量级数据、文件系统存储、ContentProvider等,根据数据需求和复杂度选择合适的方式。 7. **网络通信**:Android应用可以...

    Android开发入门60个小案例+源代码

    你可能需要学习如何读写本地文件、使用SQLite数据库存储数据,或者调用Android的ContentProvider访问外部存储。 通知和服务(Service)也是Android开发的重要部分。案例可能包含创建通知和后台运行的服务,让你理解...

    Android开发入门与实战体验-ppt

    - **ContentProvider**:共享应用数据的标准化接口,跨应用数据交换。 8. **通知与消息推送** - **Notification**:向用户展示重要信息或提醒。 - **Firebase Cloud Messaging (FCM)**:Google提供的消息推送...

    Android开发从入门到精通.pdf

    《Android开发从入门到精通》是一本专门为Android编程新手量身打造的教程。这本书全面覆盖了Android开发的基础知识,旨在帮助读者快速掌握Android应用开发的核心技能。以下是对书中的主要知识点进行的详细解读: 1....

    android入门、增删改查

    在Android开发领域,"android入门、增删改查"是一个非常基础且重要的主题,它涵盖了Android应用程序开发的基本操作,特别是涉及到数据管理的核心部分。在这个主题中,开发者将学习如何创建用户界面,处理用户输入,...

    [Android开发从入门到精通].扶松柏.扫描版 pdf

    根据提供的文件信息,我们可以推断出这是一本关于Android开发的书籍——《Android开发从入门到精通》,作者为扶松柏。尽管具体内容链接无法直接访问,但基于标题、描述及部分可见信息,我们可以总结出一些重要的知识...

    Android从入门到精通+经典教程

    4. **数据存储**:Android提供了多种数据存储方式,包括SQLite数据库、SharedPreferences、内部/外部存储、ContentProvider等,适用于不同场景的数据保存需求。 5. **网络编程**:Android应用可以通过...

    Google Android开发入门与实战(pdf和源代码)

    《Google Android开发入门与实战》是一本专门为初学者和开发者准备的指南,旨在帮助读者快速掌握Android应用开发的基础知识,并通过实战项目加深理解。这本书涵盖了从Android开发环境的搭建到实际应用开发的全过程,...

    Android开发入门60个小案例+源代码.rar.rar

    "Android开发入门60个小案例+源代码.rar.rar" 提供了一套全面的学习资源,旨在帮助初学者快速熟悉Android应用开发的基本流程和技术要点。以下是对这些小案例及其源代码的详细解析。 1. **环境配置**:首先,学习...

    Android应用开发详解d88 android入门

    "Android应用开发详解d88 android入门"是一个适合新手的引导性资源,它旨在帮助初学者建立起对Android开发的基本理解。以下是对该主题的详细阐述: 一、Android应用架构 Android应用基于Java或Kotlin语言编写,其...

Global site tag (gtag.js) - Google Analytics