Android 从服务向活动发送光标

Android 从服务向活动发送光标,android,cursor,parcelable,intentservice,Android,Cursor,Parcelable,Intentservice,我试图将数据库游标从一个服务(一个IntentService)发送到我的活动(它实现了一个接收器来捕获来自该服务的任何响应)。一旦我从querycursor=db.query(DBHelper.db_BOOKS_TABLE,columns,where,wherergs,groupBy,having,orderBy)中获得数据我想通过接收器将光标从服务发送回他的调用者。但是bundle结构只允许我发送垂直数据(字符串、整数,就是这样认为的)。我知道捆绑包还允许发送可打包对象和可序列化对象。但是如何

我试图将数据库游标从一个服务(一个IntentService)发送到我的活动(它实现了一个接收器来捕获来自该服务的任何响应)。一旦我从query
cursor=db.query(DBHelper.db_BOOKS_TABLE,columns,where,wherergs,groupBy,having,orderBy)中获得数据我想通过接收器将光标从服务发送回他的调用者。但是bundle结构只允许我发送垂直数据(字符串、整数,就是这样认为的)。我知道捆绑包还允许发送可打包对象和可序列化对象。但是如何将一个典型的游标转换为可打包或可序列化的游标呢。thks.

实际上,您不需要使用
捆绑包
服务
中的任何内容发送到
活动
。您可以在
服务中这样做。我这里严格说的是
服务
,而不是
IntentService
,因为我以前从未使用过它们。使用绑定的
服务
是相同的,但在完成后,只需在活动中调用
unbindService()

private Cursor cursor;
public void initializeCursor() {
    cursor = Cursor();
    //Now the cursor is created. Send a broadcast to the activity that it's done.
    broadcastManager.sendBroadcast("your.package.CURSOR_FINISHED");
}
并为
活动提供
getCursor()
方法:

public Cursor getCursor() {
    return this.cursor;
}
在您的
活动的
广播接收器
中,捕捉以下事件:

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals("your.package.CURSOR_FINISHED") {
        Cursor cursor = myService.getCursor();
        unbindService(myServiceConnection);
    }
}

由于您的活动绑定到您的服务,因此您的活动中将有一个可用的服务对象。一旦你得到了光标已完成的广播,只需终止服务。

我选择创建自己的自定义类,它实现了一个可打包接口。因为像这样的可包裹光标对我来说是相当陌生的

在我自己的ParcelableRow中,我只实现了HashMap对象。为了不再担心行或列的数量,我只需将光标映射到我自己的ParcelableRow对象。以下是mi代码:

public class ParcelableRow implements Parcelable {
 private HashMap<String, String> colsMap;


 public static final Parcelable.Creator<ParcelableRow> CREATOR
 = new Parcelable.Creator<ParcelableRow>() {

    @Override
    public ParcelableRow createFromParcel(Parcel source) {
        return new ParcelableRow(source);
    }

    @Override
    public ParcelableRow[] newArray(int size) {
        return new ParcelableRow[size];
    }
};


public ParcelableRow(Parcel in) {
    colsMap = new HashMap<String, String>();
    readFromParcel(in);
}
public ParcelableRow() {
    colsMap = new HashMap<String, String>();
}
@Override
public int describeContents() {
    return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {

    for(String key: colsMap.keySet()){

        dest.writeString(key);
        dest.writeString(colsMap.get(key));

    }

}
public void readFromParcel(Parcel parcel) {

    int limit = parcel.dataSize();
    parcel.setDataPosition(0);
    for(int i = 0; i < limit; i++){
        colsMap.put(parcel.readString(), parcel.readString());
    }

}


public void addNewCol(String colName, String colValue){
    colsMap.put(colName, colValue);
}
public String getColumnValue(String colName){
    return colsMap.get(colName);
}
公共类ParcelableRow实现Parcelable{
私有HashMap colsMap;
公共静态最终包裹。创建者
=新的Parcelable.Creator(){
@凌驾
公共地块行createFromParcel(地块源){
返回新的ParcelableRow(源);
}
@凌驾
公共地块行[]新数组(整数大小){
返回新的ParcelableRow[大小];
}
};
公共地块行(地块内){
colsMap=newhashmap();
从包裹中读取;
}
公共地块行(){
colsMap=newhashmap();
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
for(字符串键:colsMap.keySet()){
目的写入限制(键);
dest.writeString(colsMap.get(key));
}
}
公共无效readFromParcel(地块){
int limit=parcel.dataSize();
包裹。setDataPosition(0);
对于(int i=0;i
} 感谢@commonware给了我一个线索。竖起大拇指

我希望这对某些人有用,我只是花了几天时间试图找到一些能满足我需要的东西。下面是我使用过的一些代码示例。欢迎提出建议

警告这只会让我满意,因为我反对时间

继续编码