【问题标题】:How to pass view instance via aidl如何通过aidl传递视图实例
【发布时间】:2014-07-19 00:11:48
【问题描述】:

我正在尝试从 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 将视图实例传递给绑定到它的任何人。所以我知道我需要编写一个以 View 为成员的 parcelable 类并返回 parcelable 类实例。

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

【问题讨论】:

  • 您是否尝试过返回您需要为视图设置的数据,并且在您的活动中像往常一样设置视图?因此,您避免通过视图。据我所知,您只需要归还资源,对吗?

标签: android aidl


【解决方案1】:

我认为 Nikola 的意思是,您可以始终传递其状态,而不是传递实际的 View 实例。其复杂性取决于视图的复杂性。例如,如果你有一个数据库连接,那么你也需要传递它的状态。对于 View 类的任何和所有本身不是 Parcelable 的数据成员也是如此。

一旦您在 AIDL 接口的另一端收到状态,yiu 就可以简单地重建 View 类的新实例。

【讨论】:

    【解决方案2】:

    这只是一个想法,但您可以创建一个 AIDL 接口来包装您的 View 实例。因此,可以说视图具有以下公共方法。你不能对私人做太多事情。

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

    用基本相同的方法制作一个aidl接口。然后,您可以新建该aidl 接口的实现。当您这样做时,您将必须实现该aidl 接口的方法。对于其中的每一个,您只需在实际视图上调用相应的方法。所以...

    类似的东西

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多