AIDL interface between two applications

Marko Järvenpää picture Marko Järvenpää · Jan 11, 2011 · Viewed 14k times · Source

I've stuck a total wall with the AIDL interfacing. I've an app which has to be controlled via 3rd party application (I've enough control over this so I can ask them to implement what ever I need into their activity)

Originally my app was also an activity with interface and everything but I've changed it to be a background service and for testing, I created a dummy app which manages to start the service app to the background.

Now I would like a way to request method calls from the service (mainly; start, stop, sendData). I've created the .aidl files for both apps. The aidl file implements only one method (this is courtesy of some other question here.)

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

while the other aidl is same except the package is "foo.otherapp". The implementations I've found online had same package for both aidl files, but for me this causes an error (guess this is just a problem on my part since I hate namespaces and packages so I often just name them badly, if it's important to change them, I can do it)

The plan was to use this method to send a string to the service and just have a switch over predefined strings to call a correct method ( could also just implement three different methods if it improves the usage).

Anyway... I can't get the aidl to connect, I get error "Unable to start service intent

{act=foo.testapp.IScript } : not found

I would this guess has something to do with my misunderstandings ie. packagenames or so)

this is the implementation in my test activity app

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;
     }
 };

Then in OnCreate() method I'll do this:

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

In service class I have this;

@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";
    }
};

And finally the manifest files;

well actually, I've no idea if I have to add something into manifest files when dealing with the aidl. In the one example I saw this;

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

and

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

I would guess that the errors could be anywhere. I've been trying to set this up with chewing gum and band-aids. Guess I've just misunderstood some basic concept of this.

Anyway, any help is welcome.

Thanks in advance!

Answer

Marko J&#228;rvenp&#228;&#228; picture Marko Järvenpää · Jan 18, 2011

I decided to answer my own question since I found an exact solution.

My Life With Android

Everything worked just by copy pasting the source and changing the package names and function names correctly (assuming you're implementing this into your own project)

Source from client folder goes to the client activity and serviceimpl goes to service. I didn't need the 'Service activity', so I left it out ( and it doesn't really seem to be invoked anyway).

I don't have enough reputation to post multiple links, so you can get the source from the top of the page.

"Update: please check out the updated example program for Android SDK 1.5."