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>

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

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

Заранее спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос