Bulk Emailing

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Monday, 1 November 2010

Android Remote Service

Posted on 01:31 by Unknown

This tutorial is to demonstrate usage of AIDL Interface and interacting 2 Android applications through Service. You can get the complete example source code- RemoteService Example and RemoteService Calling Example 

As we all know Android Service concept is good for tasks running in the background. Based on scope of accessibility services are of 2 types- Local and Remote. As the name indicates, Local Service can be accessed only within the process or application which it is part of. On the other hand, Remote Services can be accessed from different process/application and thus it posses inter-application communication use cases e.g. you are running one service to provide Geo Location for Cell ID. So, any application can read the Cell-ID and access your service to get Geo Co-ordinates. 

As the usability increases so as the building blocks for creating Remote Service. The first challenge is to do inter-process communication so that one application running on one process can access services running on another process. To achieve this IPC (Inter Process Communication) Android has provided a concept of AIDL Interface which acts as the communication interface between 2 processes.  

Following section explains steps to create a Remote Service and an Application to call that service- 

Steps to create a Remote Service
1.     Create an AIDL Interface. Define methods which you are planning to expose to client applications. AIDL interface syntax is similar to Java. It supports most of the Java primitive data types and does not need explicit import statements. Though for custom classes you need to add specific import statements.
a)     Create the interface file, PrasRemote.aidl under pras.service.aidl package. I have defined one method sayHello(String name) which I’ll access from client application and pass some name and it will return “Hello [Name]”
         package pras.service.aidl;
         interface PrasRemote {
String sayHello(String name);
}  
b)    If there is no syntax error, it will generate a Java file under gen folder pras.service.aidl.PrasRemote.java

2.     Define the implementation of the methods defined in Step 1.
package pras.service;

import android.os.RemoteException;
import pras.service.aidl.PrasRemote;

/**
 * Implementation of AIDL interface method
 *
 * @author prasanta
 */
public class MethodImpl extends PrasRemote.Stub {

      public String sayHello(String name) throws RemoteException {
            return "Hello "+ name;
      }
}

3.     Define the Service.
package pras.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

/**
 * The actual Service class which will receive remote calls from Clients
 *
 * @author prasanta
 */
public class PrasService extends Service {

      String TAG = "PrasService";
      @Override
      public IBinder onBind(Intent intent) {
            Log.i(TAG, "onBind_________________________");
            //Return Instance of MethodImpl.java which implements AIDL Interface
            return new MethodImpl();
      }
}

4.     Add entries into Manifest for the service defined in Step 3
[service android:name=".PrasService"]
[intent-filter]
            [action android:name="com.my.service.REMOTE_SERVICE"/]
      [/intent-filter]
[/service]
An intent action having value com.my.service.REMOTE_SERVICE need to be used to call this Service from Client Application

Steps to Call the Remote Service-
1.     Create a new Android project. 


2.     Copy the AIDL file i.e. PrasRemote.aidl file into this new Application Project. Please make sure you are keeping the .aidl file in the same package name as you define in RemoteService application i.e. pras.service.aidl Otherwise it might cause java.lang.SecurityException : Binder invocation to an incorrect interface…  
3.     Create a Listener class which implements ServiceConnection Interface and handle call backs when connected to Remote Service. ServiceConnection interface has 2 methods- onServiceConnected(ComponentName cmp, IBinder binder) which will get invoked when client is connected to RemoteService and onServiceDisconnected(ComponentName cmp) if unexpectedly it gets disconnected.
onServiceConnected will provide a IBinder instance which will be casted to get instance of the Interface i.e. PrasRemote. Now you can call the method i.e. sayHello() using this instance.


PrasRemote remoteIntf = PrasRemote.Stub.asInterface(binder);
try{
   String remoteMsg = remoteIntf.sayHello("Prasanta");
}catch(RemoteException ex){}  


4.     Define an UI to Bind and Unbind RemoteService. Execute following when user click on “Bind_Remote_Service” button-
RemoteServiceCon serCon = new RemoteServiceCon(this);
Intent intent = new Intent("com.my.service.REMOTE_SERVICE");
bindService(intent, serCon, Context.BIND_AUTO_CREATE);

To unbind-
unbindService(serCon);

Kindly note: bindService() and unbindService() are methods of Context.java

  
Email ThisBlogThis!Share to XShare to Facebook
Posted in | No comments
Newer Post Older Post Home

0 comments:

Post a Comment

Subscribe to: Post Comments (Atom)

Popular Posts

  • Weekend at Yeouido (Han River Cruise)
    Yeouido is one of the Han River Cruise boarding points. It has a wonderful river side park (Yeouido P...
  • CityWeather
    Update: Release 1.1 has been uploaded. It will now provide weekly forecast of your selected cities. Download   CityWeather is an Android...
  • Few Multi-Threading Implementations
    Sequential Producer & Consumer In my first example, I will demonstrate an implementation to solve ...
  • Accessing Yahoo Finance API
    Since last few days I was wondering the right set of Web Service to read Country wise Stock Exchange index information . I found a bunch of ...
  • Regular Expression in JavaScript
    I was struggling to get familiar with JavaScript's Regular expression handling and thought my learning might help others. Here I'll...
  • Alphanumeric Random Number
    Sometime basic things becomes tricky :-) Was trying to find out ways to generate some alphanumeric random number whose size (i.e. number of ...
  • Binary Search Tree in Java
    This post is a part of my continuous effort to just implement few of the important data structures in ...
  • QuickSort in Java
    This post is a part of my continuous effort to just implement few of the important data structures in Java. Please find my previous post on ...
  • InDroid- Access to Android's Hidden API
    I have started one project " InDroid " to expose and share Hidden and Internal methods and variables of Android platform which are...
  • Image Geo Tagging for Android
    " onMap " is an Image Geo Tagging application, which can read EXIF header of images stored in your Android device and Map them ov...

Blog Archive

  • ►  2013 (6)
    • ►  September (2)
    • ►  May (1)
    • ►  April (1)
    • ►  February (1)
    • ►  January (1)
  • ►  2012 (4)
    • ►  July (2)
    • ►  March (1)
    • ►  January (1)
  • ►  2011 (11)
    • ►  November (1)
    • ►  October (2)
    • ►  August (1)
    • ►  June (1)
    • ►  April (2)
    • ►  March (3)
    • ►  January (1)
  • ▼  2010 (27)
    • ►  December (2)
    • ▼  November (3)
      • NoSuchMethodError in Android AIDL
      • Certificate Exception in Google Data API Authentic...
      • Android Remote Service
    • ►  September (2)
    • ►  August (4)
    • ►  July (4)
    • ►  June (7)
    • ►  May (5)
Powered by Blogger.

About Me

Unknown
View my complete profile