Android跨进程通信之ContentProvider
2016-06-29 16:42
585 查看
需求一:进程一操作或者得到进程二的数据
可以看到,可以通过这个几个方法远程调用另一个进程中ContentProvider的方法。这里需要说一个call这个函数,它相当于就是远程调用。
具体用法如下:
1、实现ContentProvider
2、远程调用
输入结果:
需求二:进程一观察进程二的某些数据的变化
使用观察者模式,在一个进程中观察另一个进程的数据情况,当另一个进程数据发生变化的时候,可以远程的通知该进程。
具体用法如下:
1、自定义ContentObserver
2、写一个客户端,注册监听,监听指定的URI
3、启动一个Service,Serivce运行在另外一个进程
具体可以参考文章:
ContentProvider和Uri详解
Android中ContentObserver的使用
欢迎关注微信公众号:DroidMind
精品内容独家发布平台
呈现与博客不一样的技术干货
可以看到,可以通过这个几个方法远程调用另一个进程中ContentProvider的方法。这里需要说一个call这个函数,它相当于就是远程调用。
具体用法如下:
1、实现ContentProvider
public class MyContentProvider extends ContentProvider { private static final String TAG = "MyContentProvider"; @Override public boolean onCreate() { return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.d(TAG, "MyContentProvider query"); return null; } @Nullable @Override public String getType(Uri uri) { Log.d(TAG, "MyContentProvider getType"); return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { Log.d(TAG, "MyContentProvider insert"); return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { Log.d(TAG, "MyContentProvider delete"); return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Log.d(TAG, "MyContentProvider update"); return 0; } @Nullable @Override public Bundle call(String method, String arg, Bundle extras) { Log.d(TAG, "MyContentProvider call"); return super.call(method, arg, extras); } }
2、远程调用
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver resolver = getContentResolver(); if (resolver != null) { resolver.insert(Uri.parse("content://com.mirhunana.mycontentprovider/test"), new ContentValues()); resolver.query(Uri.parse("content://com.mirhunana.mycontentprovider/test"), null, null, null, null); resolver.delete(Uri.parse("content://com.mirhunana.mycontentprovider/test"), null, null); resolver.update(Uri.parse("content://com.mirhunana.mycontentprovider/test"), new ContentValues(), null, null); resolver.call(Uri.parse("content://com.mirhunana.mycontentprovider/test"), "getService", null, null); } } }
输入结果:
06-29 16:27:46.340 :remote D/MyContentProvider: MyContentProvider insert 06-29 16:27:46.345 :remote D/MyContentProvider: MyContentProvider query 06-29 16:27:46.350 :remote D/MyContentProvider: MyContentProvider delete 06-29 16:27:46.350 :remote D/MyContentProvider: MyContentProvider update 06-29 16:27:46.355 :remote D/MyContentProvider: MyContentProvider call
需求二:进程一观察进程二的某些数据的变化
使用观察者模式,在一个进程中观察另一个进程的数据情况,当另一个进程数据发生变化的时候,可以远程的通知该进程。
具体用法如下:
1、自定义ContentObserver
public class MyContentObsever extends ContentObserver { private static final String TAG = "MyContentObsever"; public MyContentObsever(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { // 客户端可以得到数据源发生改变的通知 Log.d(TAG, "数据源发生了变化!"); super.onChange(selfChange); } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); } }
2、写一个客户端,注册监听,监听指定的URI
public class MainActivity extends Activity { private MyContentObsever myContentObsever; private Handler mHander = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myContentObsever = new MyContentObsever(mHander); getContentResolver().registerContentObserver(MyService.URI, false, myContentObsever); startService(new Intent(this, MyService.class)); } }
3、启动一个Service,Serivce运行在另外一个进程
public class MyService extends Service { public static final String AUTHORITY = "mirhunana"; public static final Uri URI = Uri.parse("content://" + AUTHORITY + "/cache"); public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); // 假设我们的数据源在这个服务中发生了改变,我们来通知客户端 ContentResolver resolver = getContentResolver(); resolver.notifyChange(URI, null); } }
具体可以参考文章:
ContentProvider和Uri详解
Android中ContentObserver的使用
欢迎关注微信公众号:DroidMind
精品内容独家发布平台
呈现与博客不一样的技术干货
相关文章推荐
- Android开发中RecyclerView组件使用的一些进阶技讲解
- Android 应用Crash Log在Logcat中消失的问题 threadid=1: thread exiting with uncaught exception
- Android 获取图片真实宽高
- Android Studio 查找logcat 高亮显示
- Android 设备连接电脑显示offline
- 如何让Android中 dialog显示在屏幕底部
- Android开发报错:AppCompat does not support the current theme features
- Android ListView 图片异步加载和图片内存缓存
- Android 四大组件Broadcast
- android SwipeRefreshLayout google官方下拉刷新控件
- Android使用Activity用作弹出式对话框
- android中Mediaplay的使用
- 深入解析Android中的RecyclerView组件
- Android MediaPlayer使用方法简单介绍
- Android root 原理
- Android插件化原理解析——Hook机制之动态代理
- 模板方法模式(Template Method Pattern
- android中不同类之间的数据通信之接口回调
- Java&Android开发视频教程汇总
- Android通过adb发送input 事件详解