0

我正在尝试从 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 类实例。

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

4

2 回答 2

0

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

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

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

像这样的东西

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

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

只是另一种选择...

于 2014-07-18T16:11:48.390 回答
0

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

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

于 2012-01-24T08:43:36.567 回答