Речь идет о IPC на основе памяти (например, LocalService ), но для двух приложений, работающих в одном процессе:
У меня есть два приложения (App1
, App2
) и общий проект (Shared
), который определяет некоторые интерфейсы и абстрактные классы для обоих приложений:
Shared (regular Java project, references android.jar)
- abstract myAbstractService
- Binder myBinder
App1 (Android Project, references Shared)
- MainActivity
App2 (Android Project, references Shared)
- myService extends myAbstractService
Оба приложения работают в одном и том же процессе (my.process
, определенный в <application>
),
App2
публикует com.www.app2.myService
:
<-- Both Apps run in the same process -->
<manifest <!-- *snip* --> android:sharedUserId="my.shareduser">
<!-- ... -->
<application <!-- *snip* --> android:process="my.process">
<-- App2 exports the service -->
<service android:name="com.www.app2.myService" android:exported="true">
<intent-filter>
<action android:name="com.www.app2.myService" />
</intent-filter>
</service>
Это аннотация myAbstractService
(myService
пока ничего нового не добавляет):
abstract public class GameClient extends Service
{
private static final String LOGTAG = "GameClient";
private myBinder binder = new myBinder();
public IBinder onBind(Intent intent)
{
Log.d(LOGTAG, "onBind()");
return this.binder;
}
public class myBinder extends Binder
{
public void sendMessage()
{
Log.d(LOGTAG, "sendMessage()");
}
}
}
Когда я пытаюсь привязаться к myService
(App2) из моего MainActivity
(App1):
public void onServiceConnected(ComponentName name, IBinder service)
{
Log.d("MS", service.getClass().toString());
main.this.t = (myBinder) service; // Exception in this line of course
}
Я получаю исключение:
DEBUG / MS (5464): класс com.www.shared.myBinder
ОШИБКА / AndroidRuntime (5464): java.lang.ClassCastException: com.www.shared.myBinder
Поскольку оба приложения работают в одном и том же процессе, связь с памятью должна работать (по крайней мере, я так думал). Я действительно не хочу использовать общение на основе сообщений или широковещательной рассылки, поскольку я отправлю довольно много сообщений.
Я подозреваю, что это исключение происходит из-за двух разных загрузчиков классов, используемых для одного и того же класса? Этот подход просто невозможен / неправильный, или я что-то упустил?
Обновление:
Моя цель - написать очень модульное приложение, в котором App1 используется как делегирующее и запускающее приложение для других модулей (приложений). Поскольку я не хочу поставлять App1
с каждым приложением в зависимости от него, я сделал это своим собственным приложением.
Допустим, у меня есть третье приложение (App3, проект Android). App2 и App3 оба запускаются App1 (отвечает за настройку соединений, в то время как App2 и App3 предоставляют разную логику приложения (но имеют одинаковый интерфейс).
С другой стороны, я думаю, что это можно решить и с помощью библиотеки Android (App1 & Shared объединяется в библиотеку с App2
и App3
, запускающими Activity этой библиотеки и ожидающими результат)? Однако данные не подлежат передаче (сетевые подключения), и я понятия не имею, как эта библиотека могла бы распространяться независимо по рынку Android (например, App2
и App3
публикуются там, но просят также установить библиотеку). Решит ли это эту проблему вообще?