Android跨进程通信之ContentProvider
来源:互联网 发布:excel对比2张表的数据 编辑:程序博客网 时间:2024/04/26 04:54
需求一:进程一操作或者得到进程二的数据
可以看到,可以通过这个几个方法远程调用另一个进程中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 insert06-29 16:27:46.345 :remote D/MyContentProvider: MyContentProvider query06-29 16:27:46.350 :remote D/MyContentProvider: MyContentProvider delete06-29 16:27:46.350 :remote D/MyContentProvider: MyContentProvider update06-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的使用
0 0
- Android跨进程通信之ContentProvider
- Android中跨进程通信之Activity
- Android 跨进程通信之:AIDL
- android之AIDL跨进程通信详解
- Android跨进程通信之AIDL
- android 跨进程通信
- Android 跨进程通信
- Android跨进程通信
- Android跨进程通信
- Android跨进程通信
- Android跨进程通信
- Android跨进程通信
- Android跨进程通信
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
- android跨进程通讯二:ContentProvider总结
- [Android开发]android 跨进程通信之content provider
- [Android开发]android 跨进程通信之Broadcast
- 跨进程通信之WM_COPYDATA
- cmd /c和cmd /k
- 022-3着色问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- 用DIV做文本编辑器
- visual stdio 插件,快速插入预设代码
- 牛客网刷题--剑指offer(重建二叉树)
- Android跨进程通信之ContentProvider
- Nginx安装及其配置
- 从一行JPA代码说起
- App异常自动重启
- java.lang.numberformatexception
- 每天一个linux命令(38):iostat命令
- APP集成Apple Pay指南
- 按行/列分割文件
- Android取消EditText自动默认获取焦点行为