zoukankan      html  css  js  c++  java
  • 【Quote】 Android-Adding SystemService

    From http://processors.wiki.ti.com/index.php/Android-Adding_SystemService

    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/
    /*TestService.java */
    package com.android.server;
    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) {
            super();
            mContext = context;
            mWorker = new TestWorkerThread("TestServiceWorker");
            mWorker.start();
            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;
            mHandler.sendMessage(msg);
        }
     
        private class TestWorkerThread extends Thread {
            public TestWorkerThread(String name) {
                super(name);
            }
            public void run() {
                Looper.prepare();
                mHandler = new TestWorkerHandler();
                Looper.loop();
            }
        }
     
        private class TestWorkerHandler extends Handler {
            private static final int MESSAGE_SET = 0;
            @Override
            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);
                }
            }
        }
    }

    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

    Support

    For community support join http://groups.google.com/group/rowboat 
    For IRC #rowboat on irc.freenode.net

  • 相关阅读:
    ASP.NET的三层架构(DAL,BLL,UI)
    页面开发辅助类—HtmlHelper初步了解
    ASP MVC之参数传递
    ASP.NET MVC学习之母版页和自定义控件的使用
    ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法
    UITableView动态改变Cell高度
    UITableView动态改变Cell高度
    nodejs豆瓣爬虫
    nodejs豆瓣爬虫
    苹果系统OSX中Automator批量重命名
  • 原文地址:https://www.cnblogs.com/lake-of-embedded-system/p/4153749.html
Copyright © 2011-2022 走看看