Я установил полную стену с интерфейсом 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>
Я бы предположил, что ошибки могут быть где угодно. Я пытался настроить это на жевательную резинку и бандажи. Думаю, я просто неправильно понял некоторые основные понятия об этом.
В любом случае, любая помощь приветствуется.
Заранее благодарен!
Спасибо за предложение. Я пробовал это быстро вчера и не мог понять это, хотя. Затем я попробовал просто рефакторинг имен пакетов, чтобы они были идентичны с уникальным .service и .client в конце. Итак, foo.projectname.client & foo.projectname.service. Это привело меня в неприятную ошибку, которая теперь вызывает много седых волос, приложения не могут установить на эмулятор ... 70-80% времени с ошибкой Класс не найден, а иногда он просто устанавливается плавно и начинается. Поэтому я думаю, что я переписал привязки на основе источника, который вы опубликовали. Назад с результатами, надеюсь, сегодня. –
Вчера был немного занят, и я вообще не мог поработать над этим. В любом случае ... Теперь я создал папку в моей рабочей области под названием AIDL, под которой я создал папки foo.service и поместил там файл interface.aidl, а имя пакета в файле helpl - foo.service проблема в том, что я не могу импортировать это сейчас. Я также попытался иметь файл .aidl в корневой папке AIDL. Я использую eclipse. –
Я немного поиграл с этим и в конце концов решил попробовать создать учебный проект из источников, которые вы связали. Учебник не работал сразу (по крайней мере, я не пытался выяснить, является ли это учебник, который решается в связанной с ним книге). Это давало ошибку. Intent не нашел .... в основном получил его в том же состоянии, что и мой текущий проект. Я больше искал тему и попал в золотой рудник. Чрезвычайно упрощенное и малое учебное пособие по обмену информацией по отдельным приложениям. http://mylifewithandroid.blogspot.com/2008/01/invoking-services.html –