• Android-Adding SystemService


    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 http://developer.android.com/guide/topics/fundamentals/services.html

    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

    Customservice.png

    Create service

    • Add your code to frameworks/base/services/java/com/android/server/
     
     1 /*TestService.java */
     2 package com.android.server;
     3 import android.content.Context;
     4 import android.os.Handler;
     5 import android.os.ITestService;
     6 import android.os.Looper;
     7 import android.os.Message;
     8 import android.os.Process;
     9 import android.util.Log;
    10 public class TestService extends ITestService.Stub {
    11     private static final String TAG = "TestService";
    12     private TestWorkerThread mWorker;
    13     private TestWorkerHandler mHandler;
    14     private Context mContext;
    15     public TestService(Context context) {
    16         super();
    17         mContext = context;
    18         mWorker = new TestWorkerThread("TestServiceWorker");
    19         mWorker.start();
    20         Log.i(TAG, "Spawned worker thread");
    21     }
    22  
    23     public void setValue(int val) {
    24         Log.i(TAG, "setValue " + val);
    25         Message msg = Message.obtain();
    26         msg.what = TestWorkerHandler.MESSAGE_SET;
    27         msg.arg1 = val;
    28         mHandler.sendMessage(msg);
    29     }
    30  
    31     private class TestWorkerThread extends Thread {
    32         public TestWorkerThread(String name) {
    33             super(name);
    34         }
    35         public void run() {
    36             Looper.prepare();
    37             mHandler = new TestWorkerHandler();
    38             Looper.loop();
    39         }
    40     }
    41  
    42     private class TestWorkerHandler extends Handler {
    43         private static final int MESSAGE_SET = 0;
    44         @Override
    45         public void handleMessage(Message msg) {
    46             try {
    47                 if (msg.what == MESSAGE_SET) {
    48                     Log.i(TAG, "set message received: " + msg.arg1);
    49                 }
    50             } catch (Exception e) {
    51                 // Log, don't crash!
    52                 Log.e(TAG, "Exception in TestWorkerHandler.handleMessage:", e);
    53             }
    54         }
    55     }
    56 }

    Register service

    • Register service in SystemServer.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);
    }
     

    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

    frameworks/base/core/java/android/os/[server].aidl

    /*
    * 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/Android.mk 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.

    /*
     * HelloServer.java
     */
    package com.Test.helloserver;
    import android.app.Activity;
    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. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            ITestService om = ITestService.Stub.asInterface(ServiceManager.getService("Test"));
            try {
                Log.d(DTAG, "Going to call service");
                om.setValue(20);
                Log.d(DTAG, "Service called succesfully");
            }
            catch (Exception e) {
                Log.d(DTAG, "FAILED to call service");
                e.printStackTrace();
            }
        }
    }
     

    References

    (from:http://processors.wiki.ti.com/index.php/Android-Adding_SystemService)

  • 相关阅读:
    OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?
    MLIR算子量化Quantization
    最大限度地减少块输出中间结果的计算和存储
    Echarts(一)
    Oracle部署安装
    JS使用
    sqlplus导入sql,dmp导入导出
    一款强大的Visual Studio插件!CodeRush v19.1.9全新来袭
    Web界面开发必看!Kendo UI for jQuery编辑功能指南第二弹
    报表开发神器!DevExpress Reporting v19.1全平台新功能解析
  • 原文地址:https://www.cnblogs.com/ikaka/p/3878621.html
Copyright © 2020-2023  润新知