Как передать экземпляр просмотра через aidl - PullRequest
0 голосов
/ 11 марта 2011

Я пытаюсь получить расширенное представление уведомлений из 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.Какие-либо предложения?Я думаю что-то поиграть с байтовыми массивами.Кто-нибудь знает, как преобразовать экземпляр представления и записать как байтовые массивы?

Ответы [ 2 ]

0 голосов
/ 18 июля 2014

Это просто идея, но вы можете создать интерфейс AIDL, чтобы обернуть ваш экземпляр View.Допустим, у представления есть следующие публичные методы.С частными вы ничего не можете сделать.

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

Создайте интерфейс aidl, используя в основном те же методы.Затем вы можете создать новую реализацию этого интерфейса помощи.Когда вы это сделаете, вам придется реализовать методы этого интерфейса.Для каждого из них вы просто вызываете соответствующий метод в вашем фактическом представлении.Итак ...

что-то вроде этого

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

Затем вы можете передать этот экземпляр через aidl вашему сервису или другому процессу или любому другому зданию.

Просто еще один вариант...

0 голосов
/ 24 января 2012

Я думаю, что Никола хотел сказать, что вместо передачи фактического экземпляра View вы всегда можете вместо этого передать его состояние.Сложность этого зависит от сложности представления.Например, если у вас есть соединение с базой данных, вам нужно будет также передать его состояние.То же самое верно для любого и всех членов данных класса View, которые сами не являются Parcelable.

Как только вы получите состояние на другом конце интерфейса AIDL, вы можете просто перестроить новый экземпляр View.класс.

...