1.使用ContentProvider跨进程传输数据,依靠的是ContentProvider$Transport extends ContentProviderNative。ContentProvider是处理业务的核心,但是本身不具备跨进程的能力。
2.而最终需要获得数据库数据(也可以是非数据库数据),还需要其他的Binder。IBulkCursor,实际类型是CursorToBulkCursorAdapter extends BulkCursorNative。
3.查询到的数据最初是保存到Cursor中的,最后会创建一个CursorWindow,通过fillWindow方法,将Cursor中的数据放到window中,window是一块共享内存,最后通过IBulkCursor控制Cursor将数据填充到window中,然后返回window的引用给客户端。所以客户端获得的Cursor不是服务端的Cursor,而是封装了IBulkCursor的BulkCursorToCursorAdapter。
4.Cursor是用于控制获取第几行第几列的数据的存取。CrossProcessCursor的就是利用Cursor获取第几行第几列的数据的方法去填充window的:
@Override
public void fillWindow(int position, CursorWindow window) {
DatabaseUtils.cursorFillWindow(this, position, window);
}
5.如果需要自定义Cursor,只要继承AbstractCursor就行,AbstractCursor继承了CrossProcessCursor,就是有window了,就可以把数据分