2011-01-11 4 views
3

Я установил полную стену с интерфейсом AIDL. У меня есть приложение, которое должно контролироваться через стороннее приложение (у меня достаточно контроля над этим, поэтому я могу попросить их реализовать все, что мне нужно в их деятельности)Интерфейс AIDL между двумя приложениями

Первоначально мое приложение также было связано с интерфейсом и все, но я изменил его, чтобы быть фоновым сервисом и для тестирования, я создал фиктивное приложение, которому удается запустить сервисное приложение в фоновом режиме.

Теперь мне нужен способ запросить вызовы методов из службы (в основном, start, stop, sendData). Я создал файлы .aidl для обоих приложений. Файл aidl реализует только один метод (это любезно какой-то другой вопрос здесь.)

package foo.testapp; 
interface IScript 
{ 
    String executeScript(String script); 
} 

, а другой aidl такое же, кроме пакета «foo.otherapp». Реализации, которые я нашел в Интернете, имеют тот же пакет для обоих файлов-помощников, но для меня это вызывает ошибку (предположим, что это только проблема с моей стороны, так как я ненавижу пространства имен и пакеты, поэтому я часто называю их плохо, если это важно для измените их, я могу это сделать)

План должен был использовать этот метод для отправки строки в службу и просто иметь переключатель над предопределенными строками для вызова правильного метода (также можно было бы реализовать три разных метода, если он улучшит Использование).

Во всяком случае ... Я не могу получить aidl соединиться, я получаю сообщение об ошибке «Не удается запустить службу Intent

{действие = foo.testapp.IScript} не найден

я бы это предположение что-то делать с моим недопонимание, то есть. packagenames или так)

это реализация в моем тесте активности приложение

private final IScript.Stub mBinder = new IScript.Stub() 
{ 
    @Override 
    public String executeScript(String script) throws RemoteException 
    { 
     // TODO Auto-generated method stub 
    } 
}; 
IScript mService = null; 
private ServiceConnection mConnection = new ServiceConnection() 
{ 
    public void onServiceConnected(ComponentName className, IBinder service) 
    { 
     mService = IScript.Stub.asInterface(service); 
    } 
    public void onServiceDisconnected(ComponentName className) 
    { 
     mService = null; 
    } 
}; 

Тогда в OnCreate() метод, который я сделаю это:

bindService(new Intent(IScript.class.getName()), 
      mConnection, Context.BIND_AUTO_CREATE); 

В классе обслуживания я это;

@Override 
public IBinder onBind(Intent intent) 
{ 
    // Select the interface to return. If your service only implements 
    // a single interface, you can just return it here without checking 
    // the Intent. 
    if (IScript.class.getName().equals(intent.getAction())) 
    { 
     return mBinder; 
    } 
    return null; 
} 

/** 
* The IRemoteInterface is defined through IDL 
*/ 
private final IScript.Stub mBinder = new IScript.Stub() 
{ 
    @Override 
    public String executeScript(String script) throws RemoteException 
    { 
     if (script == "test") 
     { 
      return "foo"; 
     } 
     return "fail"; 
    } 
}; 

И, наконец, файлы манифеста;

хорошо, я понятия не имею, нужно ли мне что-то добавлять в файлы манифеста при работе с помощью. В одном примере я увидел это;

<intent-filter> 
     <action android:name="foo.otherapp.IScript" /> 
    </intent-filter> 

и

<intent-filter> 
     <action android:name="foo.testapp.IScript" /> 
    </intent-filter> 

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

В любом случае, любая помощь приветствуется.

Заранее благодарен!

ответ

3

я решил ответить на мой собственный вопрос, так как я нашел точное решение.

My Life With Android

Все работало только копией вставив источник и изменение имен пакетов и имена функций правильно (при условии, вы реализуете это в свой собственный проект)

Источник из папки клиента идет к клиенту деятельность и serviceimpl идет на обслуживание. Мне не нужна «служебная деятельность», поэтому я ее оставил (и на самом деле это не похоже на вызов).

У меня недостаточно репутации для публикации нескольких ссылок, поэтому вы можете получить исходный код в верхней части страницы.

Обновление: ознакомьтесь с обновленной программой для Android SDK 1.5. "

1

Я тоже боролся с этим. Вы правы в своих предположениях, что RemoteInterface.aidl должен иметь одинаковое имя пакета как в сервисе, так и в тестовом приложении - так, где вы его выразили !?

Если вы развиваетесь в Eclipse, тогда у вас есть общая исходная папка (общая для обоих проектов). Создайте эту папку за пределами обоих проектов и в свойствах/источнике сборки, нажмите «Источник ссылок» и перейдите к расположение общего источника. (Вы можете назвать это любое имя, которое вы хотите) Сделайте это в обоих проектах и ​​поместите туда интерфейс. Он появится в обозревателе пакетов Project, и когда вы измените его в одном проекте, он также будет обновлен.

В общей папке источника я поместил interface.aidl в пакет с тем же именем, что и служба.

Если вы используете Ant для сборки, это становится немного сложно, поскольку файл ant_rules.xml по умолчанию не поддерживает две папки-помощники, и вам придется немного изменить свой build.xml, добавив новую цель и все его зависимости.

я получил мой проект собирается адаптируя образцы образуют Глава 17 из «источника загрузки» здесь:

link text

+0

Спасибо за предложение. Я пробовал это быстро вчера и не мог понять это, хотя. Затем я попробовал просто рефакторинг имен пакетов, чтобы они были идентичны с уникальным .service и .client в конце. Итак, foo.projectname.client & foo.projectname.service. Это привело меня в неприятную ошибку, которая теперь вызывает много седых волос, приложения не могут установить на эмулятор ... 70-80% времени с ошибкой Класс не найден, а иногда он просто устанавливается плавно и начинается. Поэтому я думаю, что я переписал привязки на основе источника, который вы опубликовали. Назад с результатами, надеюсь, сегодня. –

+0

Вчера был немного занят, и я вообще не мог поработать над этим. В любом случае ... Теперь я создал папку в моей рабочей области под названием AIDL, под которой я создал папки foo.service и поместил там файл interface.aidl, а имя пакета в файле helpl - foo.service проблема в том, что я не могу импортировать это сейчас. Я также попытался иметь файл .aidl в корневой папке AIDL. Я использую eclipse. –

+0

Я немного поиграл с этим и в конце концов решил попробовать создать учебный проект из источников, которые вы связали. Учебник не работал сразу (по крайней мере, я не пытался выяснить, является ли это учебник, который решается в связанной с ним книге). Это давало ошибку. Intent не нашел .... в основном получил его в том же состоянии, что и мой текущий проект. Я больше искал тему и попал в золотой рудник. Чрезвычайно упрощенное и малое учебное пособие по обмену информацией по отдельным приложениям. http://mylifewithandroid.blogspot.com/2008/01/invoking-services.html –

Смежные вопросы