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
原创粉丝点击