Please note as of Wednesday, August 15th, 2018 this wiki has been set to read only. If you are a TI Employee and require Edit ability please contact x0211426 from the company directory.

Android-Adding SystemService

From Texas Instruments Wiki
Jump to: navigation, search

Content is no longer maintained and is being kept for reference only!

This wiki page will demonstrate - "How to add system service to android framework". Example - "Adding a Bluetooth HID service" - taken as reference of understanding.This will also help to add support for more bluetooth profiles into android framework.

What is service?

As per the definition given at

A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service might handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.

Service layer


Create service

  • Add your code to frameworks/base/services/java/com/android/server/

<syntaxhighlight lang='java'> /* */ package; import android.content.Context; import android.os.Handler; import android.os.ITestService; import android.os.Looper; import android.os.Message; import android.os.Process; import android.util.Log; public class TestService extends ITestService.Stub {

   private static final String TAG = "TestService";
   private TestWorkerThread mWorker;
   private TestWorkerHandler mHandler;
   private Context mContext;
   public TestService(Context context) {
       mContext = context;
       mWorker = new TestWorkerThread("TestServiceWorker");
       Log.i(TAG, "Spawned worker thread");
   public void setValue(int val) {
       Log.i(TAG, "setValue " + val);
       Message msg = Message.obtain();
       msg.what = TestWorkerHandler.MESSAGE_SET;
       msg.arg1 = val;
   private class TestWorkerThread extends Thread {
       public TestWorkerThread(String name) {
       public void run() {
           mHandler = new TestWorkerHandler();
   private class TestWorkerHandler extends Handler {
       private static final int MESSAGE_SET = 0;
       public void handleMessage(Message msg) {
           try {
               if (msg.what == MESSAGE_SET) {
                   Log.i(TAG, "set message received: " + msg.arg1);
           } catch (Exception e) {
               // Log, don't crash!
               Log.e(TAG, "Exception in TestWorkerHandler.handleMessage:", e);

} </syntaxhighlight>

Register service

  • Register service in

<syntaxhighlight lang='java'>


* go to function "@Override public void run()"
* ........
* Add following block after line "if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {"

try {

   Slog.i(TAG, "Test Service");
   ServiceManager.addService(“Test”, new TestService(context));

} catch (Throwable e) {

   Slog.e(TAG, "Failure starting TestService Service", e);

} </syntaxhighlight>

Expose service

  • A service can expose set of functions that can be access by other process/application. Exposed functions are required to be declared in .aidl file at following location


* aidl file : frameworks/base/core/java/android/os/ITestService.aidl
* This file contains definitions of functions which are exposed by service
package android.os;
interface ITestService {
* {@hide}
	void setValue(int val);

Add [service].aidl for build

 * open frameworks/base/ and add following line
core/java/android/os/IPowerManager.aidl \
core/java/android/os/ITestService.aidl \
core/java/android/os/IRemoteCallback.aidl \
  • Rebuild the framework/base or android system.Service is now ready to use by other application/process.

Using service

To use service

  • first get service handle using "ServiceManager.getService()" api
  • use service handle to call set of functions exposed by service

Below is the sample code to use service.

<syntaxhighlight lang='java'> /*


package com.Test.helloserver; import; import android.os.Bundle; import android.os.ServiceManager; import android.os.ITestService; import android.util.Log; public class HelloServer extends Activity {

   private static final String DTAG = "HelloServer";
   /** Called when the activity is first created. */
   public void onCreate(Bundle savedInstanceState) {
       ITestService om = ITestService.Stub.asInterface(ServiceManager.getService("Test"));
       try {
           Log.d(DTAG, "Going to call service");
           Log.d(DTAG, "Service called succesfully");
       catch (Exception e) {
           Log.d(DTAG, "FAILED to call service");

} </syntaxhighlight>



For community support join
For IRC #rowboat on