Android 通过引用跨流程返回AIDL接口实现

Android 通过引用跨流程返回AIDL接口实现,android,reference,ipc,rpc,aidl,Android,Reference,Ipc,Rpc,Aidl,我有一个小的Android项目正在进行,它涉及一些IPC,其中客户端活动绑定到我的服务。 我正在为IPC和RPC使用AIDL,它工作得很好,但是我在向客户端返回服务端实例化的AIDL接口实现时遇到了问题: 当客户机与服务在同一进程中运行时(即在本地运行服务),一切正常。 但是,当客户端和服务在不同的进程中分离时,ILogDroidBinder.aidl中定义的方法STARTOGSESSION总是返回null。 在这个接口中实现的另一个方法——getSessionID——返回一个包含int的列表,

我有一个小的Android项目正在进行,它涉及一些IPC,其中客户端活动绑定到我的服务。
我正在为IPC和RPC使用AIDL,它工作得很好,但是我在向客户端返回服务端实例化的AIDL接口实现时遇到了问题:

当客户机与服务在同一进程中运行时(即在本地运行服务),一切正常。
但是,当客户端和服务在不同的进程中分离时,ILogDroidBinder.aidl中定义的方法STARTOGSESSION总是返回null。
在这个接口中实现的另一个方法——getSessionID——返回一个包含int的列表,它总是工作(本地和跨进程)

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

这是相关代码。 如果有人能帮我,我真的很高兴。也许我只是遗漏了一点,因为这是我的第一个Android项目,我还没有完全参与其中

ILogDroidSession.aidl(这是我想要返回给客户机的实现):

package net.sourceforge.projects.logdroid;
接口ILogDroidSession{
/**
*将给定文本记录到当前日志的错误消息通道
*会议。
*@param text要记录的文本。
*/
无效日志错误(在字符串文本中);
}
ILogDroidBinder.aidl(传递给客户端onServiceConnected的IBinder接口):

package net.sourceforge.projects.logdroid;
导入net.sourceforge.projects.logdroid.ILogDroidSession;
接口ILogDroidBinder{
/**
*启动处理所有日志事件的新LogDroid会话。
*@param sessionName会话的名称。
*@return一个ILogDroidSession实例。
*/
ILogDroidSession(字符串sessionName);
/**
*获取包含所有可用日志会话ID的列表。
*/
列出getSessionId();
}
LogDroidService.java(我的服务中的相关代码):

公共类LogDroidService扩展服务{
/**
*活动绑定到所需的绑定器接口
*{@code LogDroidService}。
*/
private final ILogDroidBinder.Stub binder=new ILogDroidBinder.Stub(){
/**
*启动新的LogDroidSession。
*/
公共ILogDroidSession会话(字符串sessionName){
返回LogDroidService.this.createSession(sessionName);
}
/**
*获取所有可用的会话ID。
*/
公共列表getSessionId(){
返回LogDroidService.this.getSessionId();
}
};
/**
*用于存储和检索日志项的数据库连接。
*/
专用LogDroidDb数据库;
@凌驾
public void onCreate(){
super.onCreate();
数据库=新的LogDroidDb(getApplicationContext());
试一试{
database.open();//作为可写数据库打开
}捕获(SQLException ignorefornow){
}
}
@凌驾
公共IBinder onBind(意图忽略){
返回活页夹;
}
/**
*创建新的LogDroidSession,该会话将作为
*远程对象。
*@param sessionName会话的名称。
*@return ILogDroidSession的新实例
*/
ILogDroidSession createSession(字符串sessionName){
LogDroidSession会话=新的LogDroidSession(数据库,会话名称);
session.AddLoggingOccurrendListener(此);
返回会议;
}
/**
*检索所有会话ID。
*@包含所有LogDroidSession ID的返回数组。
*/
ArrayList GetSessionId(){
返回database.getSessionId();
}
}
MainActivity.java(相关客户端代码):

公共类MainActivity扩展活动{
私人ILogDroidSession会话;
私人ILogDroidBinder活页夹;
私有ServiceConnection con=新ServiceConnection(){
ServiceConnected上的公共无效(组件名称arg0,IBinder arg1){
binder=ILogDroidBinder.Stub.asInterface(arg1);//始终有效
试一试{
//在本地工作,但跨进程时始终返回null
session=binder.startologsession(“TestSession”);
//总是有效的
List id=binder.getSessionId();
}捕获(例外情况除外){
//在本地或跨进程运行时不会引发异常
Toast.makeText(getApplicationContext(),例如getMessage(),
Toast.LENGTH_LONG).show();
}
}
ServiceDisconnected上的公共无效(组件名称arg0){
}
};
}

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添加新函数,以返回会话相关信息(以普通数据类型的形式)。

非常感谢!我要试一试