2011-06-01 86 views
2

我有一个小型的Android项目正在进行,其中涉及一些IPC,其中客户端活动绑定到我的服务。
我使用IPC和RPC的AIDL工作得很好,但我无法向客户端返回服务端实例化的AIDL接口实现:通过引用跨进程返回AIDL接口实现

当客户端运行在与服务 - 意味着在本地运行服务 - 一切正常。
但是,当客户端和服务在不同的进程中分离时,在ILogDroidBinder.aidl中定义的方法startLogSession始终返回null。
在此接口中实现的其他方法 - getSessionIds - 返回包含ints的List,始终可用(本地和跨进程)。

我正在猜测并假设我的ILogDroidSession实现也应该实现Parcelable,但这不起作用,因为我不能包含包含对SQLiteDatabase的引用的对象(或者我可以吗?)。

这里是相关的代码。 如果有人能帮助我,我真的很高兴。也许我只是在某个地方错过了一个观点,因为这是我的第一个Android项目,我还没有完全参与。

ILogDroidSession.aidl(这方面的一个实现就是我要返回给客户端的):

​​

ILogDroidBinder.aidl(该接口的IBinder传递到客户端的onServiceConnected):

package net.sourceforge.projects.logdroid; 

import net.sourceforge.projects.logdroid.ILogDroidSession; 
interface ILogDroidBinder { 

    /** 
    * Starts a new LogDroid session which handles all logging events. 
    * @param sessionName The name of the session. 
    * @return An instance of ILogDroidSession. 
    */ 
    ILogDroidSession startLogSession(in String sessionName); 

    /** 
    * Gets a list with all available LogSession ids. 
    */ 
    List getSessionIds(); 
} 

LogDroidService.java(从我的服务相关的代码):

public class LogDroidService extends Service { 

    /** 
    * The binder interface needed for Activities to bind to the 
    * {@code LogDroidService}. 
    */ 
    private final ILogDroidBinder.Stub binder = new ILogDroidBinder.Stub() { 
    /** 
    * Starts a new LogDroidSession. 
    */ 
    public ILogDroidSession startLogSession(String sessionName) { 
     return LogDroidService.this.createSession(sessionName); 
    } 

    /** 
    * Gets all available session ids. 
    */ 
    public List<Integer> getSessionIds() { 
     return LogDroidService.this.getSessionIds(); 
    } 
    }; 

    /** 
    * The database connection to be used for storing and retrieving log entries. 
    */ 
    private LogDroidDb database; 

    @Override 
    public void onCreate() { 
    super.onCreate(); 
    database = new LogDroidDb(getApplicationContext()); 
    try { 
     database.open(); // opens as writable database 
    } catch (SQLException ignorefornow) { 
    } 
    } 

    @Override 
    public IBinder onBind(Intent ignore) { 
    return binder; 
    } 

    /** 
    * Creates a new LogDroidSession which will be returned to the user as a 
    * AIDL remote object. 
    * @param sessionName Name of the session. 
    * @return A new instance of ILogDroidSession 
    */ 
    ILogDroidSession createSession(String sessionName) { 
    LogDroidSession session = new LogDroidSession(database, sessionName); 
    session.addLoggingOccurredListener(this); 
    return session; 
    } 

    /** 
    * Retrieves all session ids. 
    * @return Array containing all LogDroidSession ids. 
    */ 
    ArrayList<Integer> getSessionIds() { 
    return database.getSessionIds(); 
    } 
} 

MainActivity.java(相关客户端代码):

public class MainActivity extends Activity { 

    private ILogDroidSession session; 
    private ILogDroidBinder binder; 
    private ServiceConnection con = new ServiceConnection() { 
    public void onServiceConnected(ComponentName arg0, IBinder arg1) { 
     binder = ILogDroidBinder.Stub.asInterface(arg1); // always works 
     try { 
     // works locally but always returns null when cross-process 
     session = binder.startLogSession("TestSession"); 

     // always works 
     List<Integer> ids = binder.getSessionIds(); 
     } catch (Exception ex) { 
     // no exceptions are thrown either when running locally or cross-process 
     Toast.makeText(getApplicationContext(), ex.getMessage(), 
      Toast.LENGTH_LONG).show(); 
     } 
    } 

    public void onServiceDisconnected(ComponentName arg0) { 
    } 
    }; 
} 

回答

1

ILogDroidSession可以被定义为在Java文件只是接口,它不应该在AIDL。

如果客户端和LogDroidService在不同的进程中运行,LogDroidSession应该可以通过IPC进行发送/接收。

跨进程交换的数据应该只是发送方和接收方通过协议理解的字节流。

I'm taking a wild guess and suppose my ILogDroidSession implementation should also implement Parcelable, but that wouldn't work, because I can't parcel an object containg a reference to an SQLiteDatabase (or can I?). 

LogDroidSession不能在这里瓜分,增加新的功能,以ILogDroidBinder返回会话相关的信息(在普通数据类型的形式)。

+0

非常感谢!我会试试看 – Chris 2011-07-06 08:55:17