如何通过aidl传递视图实例

时间:2011-03-11 10:37:45

标签: android aidl

我正在尝试从statusbarService.java获取通知扩展视图,并通过aidl服务将其传递给另一个应用程序。

-frameworks/base/services/java/com/android/server/status/StatusBarService.java

private void makeStatusBarView(Context context) {
    Resources res = context.getResources();
    mRightIconSlots = res.getStringArray(com.android.internal.R.array.status_bar_icon_order);
    mRightIcons = new StatusBarIcon[mRightIconSlots.length];

    **ExpandedView expanded** = (ExpandedView)View.inflate(context,
            com.android.internal.R.layout.status_bar_expanded, null);
}

我希望通过服务存储此“扩展”视图实例,并将其传递给通过aidl绑定到服务的任何人。

  • 我写了一个服务类。但我不知道如何将此视图传递给服务实例。 要绑定到服务,它必须是活动或服务。 StatusBarService.java不是两者之一。所以我不知道如何将这个视图实例传递给服务。

  • 假设如果以某种方式将视图实例传递给服务,我需要通过aidl将视图实例传递给绑定它的任何人。所以我知道我需要编写一个parcelabale类,它将View作为成员并返回parcelable类实例。

  • 我不确定如何通过parcel编写视图实例。有什么建议? 我认为可以使用字节数组。有人知道如何转换视图实例并写为字节数组吗?

1 个答案:

答案 0 :(得分:0)

这只是一个想法,但您可以创建一个AIDL接口来包装您的View实例。所以我们假设该视图具有以下公共方法。你不能对私人做很多事情。

int getWidth()
int getHeight()
String getFoo()

使用基本相同的方法创建一个aidl接口。然后,您可以新建一个aidl接口的实现。当你这样做时,你将不得不实现该aidl接口的方法。对于每个人,您只需在实际视图上调用相应的方法。所以...

类似这样的事情

new view_interface(){
   int getWidth(){
      return view.getWidth();
   }
// and so on ...
};

然后,您可以通过aidl将此实例传递给您的服务或其他进程或任何建筑物。

只是另一种选择......