Я воткнул тотальную стену с интерфейсом AIDL. У меня есть приложение, которым нужно управлять через стороннее приложение (у меня достаточно контроля над этим, поэтому я могу попросить их реализовать то, что мне нужно, в их деятельности)
Первоначально мое приложение также было активностью с интерфейсом и всем остальным, но я изменил его на фоновую службу, и для тестирования я создал фиктивное приложение, которому удается запустить приложение службы в фоновом режиме.
Теперь мне нужен способ запрашивать вызовы методов из службы (в основном, start, stop, sendData). Я создал файлы .aidl для обоих приложений. Файл помощи реализует только один метод (это любезно предоставлено другим вопросом здесь.)
package foo.testapp;
interface IScript
{
String executeScript(String script);
}
в то время как другой помощник такой же, за исключением того, что пакет «foo.otherapp». Реализации, которые я нашел в Интернете, имели один и тот же пакет для обоих файлов помощи, но для меня это вызывает ошибку (думаю, это просто проблема с моей стороны, так как я ненавижу пространства имен и пакеты, поэтому я часто просто неправильно называю их, если это важно меняй, я умею)
План состоял в том, чтобы использовать этот метод для отправки строки в службу и просто переключаться между предопределенными строками для вызова правильного метода (можно также просто реализовать три разных метода, если это улучшит использование).
Во всяком случае ... Я не могу подключиться к помощи, я получаю сообщение об ошибке «Невозможно запустить службу
{act=foo.testapp.IScript}: не найдено
Я хотел бы, чтобы это предположение имело какое-то отношение к моим недоразумениям, т.е. имена пакетов или около того)
это реализация в моем тестовом приложении activity
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";
}
};
И, наконец, файлы манифеста;
ну на самом деле, я понятия не имею, нужно ли мне что-то добавлять в файлы манифеста при работе с helpl. В одном примере я видел это;
<intent-filter>
<action android:name="foo.otherapp.IScript" />
</intent-filter>
а также
<intent-filter>
<action android:name="foo.testapp.IScript" />
</intent-filter>
Я предполагаю, что ошибки могут быть где угодно. Я пытался устроить это с помощью жевательной резинки и лейкопластырей. Думаю, я просто неправильно понял некоторые основные концепции этого.
В любом случае, любая помощь приветствуется.
Заранее спасибо!