【发布时间】:2017-09-12 06:36:03
【问题描述】:
也许我只是累了。但是我很难理解 IBinder 接口是如何工作的。
服务有一个方法调用 onBind(Intent intent),这会将某种形式的 IBinder 传递给绑定活动。
我苦苦挣扎的是如何将其可视化。 IBinder 对象是否是服务和活动之间的管道,以便活动可以直接与服务交互?还是 IBinder 是一个传递给 Activity 的对象,其中包含来自 Service 的信息(类似于 Intent)?
编辑:这个想法是让我能够从绑定活动中调用 getSomeData 函数。或者更确切地说,这个想法是让 mSomeData 对象加入活动。
我正在使用以下类,我试图找出从服务中获取活动请求数据(如果需要,可序列化,但我不想)的最佳方式。
public class MainService extends Service{
private CustomBinder mIBinder;
private SomeDataObject mSomeData;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mIBinder = new CustomBinder();
return super.onStartCommand(intent, flags, startId);
}
@Override
public CustomBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// This is auto generated and I havent changed it yet. I am not
// Experiencing errors as this is not designed to run yet.
throw new UnsupportedOperationException("Not yet implemented");
}
public final SomeDataObject getSomeData(){
return mSomeData;
}
class SomeBinder extends MainEngineBinder{
// All the Auto Generated Stuff
}
}
【问题讨论】:
-
第一种情况——客户端activity可以在返回的binder上调用
transact()方法,而onTransact()会在服务端被调用 -
这很有趣。我会玩一点。那么在活页夹中添加返回对象的方法的正确方法是什么?
-
什么对象?和什么方法?你的意思是AIDL 方法吗?还是只是没有任何高级 AIDL 的原始 IBinder?
-
我想我不知道该如何回答。我将编辑我的帖子以显示我正在修补的内容的一些背景。我目前没有使用 AIDL。
-
@pskink 我在帖子中添加了一些代码