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