zoukankan      html  css  js  c++  java
  • 如何在Android中添加系统服务

    一,在frameworks/base/core/java/android/content/Context.java中添加

           public static final String RADIO_SERVICE = "radioservice"(自己定义的);

    二,在frameworks/base/core/java/com/auto/radioservice文件中添加IRadioPlayer.aidl

    三,在framework/base/Android.mk中添加LOCAL_SRC_FILES中添加一行

           core/java/com/auto/radioservice/IRadioPlay.aidl      

    四,在framework/base/services/java/com/auto中添加自己的服务

           比喻 新建文件radioservice,在文件下RadioService.java.

      并继承aidl生成的文件 public class RadioService extends IRadioPlayer.Stub

    五,在framework/base/services/java/com/android/server/SystemServer.java中添加

      RadioService radioService = null;

      private void registerHCNService(Context context){

      Slog.i(TAG, "RadioService");

      radioService = RadioService.getInstance();

      if(!radioService.init()){

        Slog.e(TAG, "RadioService init failed");  

      }

      ServiceManager.addService(Context.RADIO_SERVICE, radioService);

      }

      在startOtherServices(){

      .

      .

      .

      registerHCNService(context);

      }

    六,在/home/mxy/code/v1/frameworks/base/core/java/com/autohcn/auto中创建IRadioManager,RadioManager

           用于管理RadioService

    说明:本次说的系统服务,是指捆绑在system_process进程中的服务。

      仔细阅读源码可以发现,在frameworks/base/services/java/com/android/server/SystemServer.java中添加了很多服务,什么熵信息、电量、wife等等服务,这些服务启动都在launcher之前,一般要继承Binder或者继承一个AIDL。下面试着来添加一个简单系统服务

    一。在frameworks/base/core/java/android/os/ 增加一个aidl文件,最后用aidl工具生产一个Java文件,这样可以方便后面:

    [html] view plaincopy
     
    1. package android.os;  
    [html] view plaincopy
     
    1. /**  
    2.  * Interface that allows controlling and querying YtTts connectivity.  
    3.  *  
    4.  * {@hide}  
    5.  */  
    6. interface IYtTtsService{  
    7.     /**  
    8.      * 播放Text文字  
    9.      */  
    10.     int speak(String text);  
    11. }  

    然后在修改/frameworks/base/Android.mk,在LOCAL_SRC_FILES里添加一行:core/java/android/os/IYtTtsService.aidl

    不确定补充:把AIDL文件写在这个地方似乎可以避免加@hide


    二 。在frameworks/base/services/java/com/android/server/ 新建要增加的service,继承上面aidl生产的java:

    [html] view plaincopy
     
    1. package com.android.server;  
    2. import android.content.Context;  
    3. import android.os.IYtTtsService;  
    4. import android.os.RemoteException;  
    5. import android.util.Log;  
    [html] view plaincopy
     
    1. public class YtTtsService  extends IYtTtsService.Stub {  
    2.     private WorkerThread mWorker;  
    3.     public YtTtsService(Context context) {    
    4.         super();    
    5.         mWorker = new WorkerThread("YtTtsServiceWorker");    
    6.         mWorker.start();    
    7.         Log.i("[YT]", "In YtTtsService-->"+context);    
    8.       }       
    9.     @Override  
    10.     public int speak(String text) throws RemoteException {  
    11.         Log.i("[YT]", "In YtTtsService-->"+text);  
    12.         return 0;  
    13.     }  
    14.     private class WorkerThread extends Thread{    
    15.         int i = 0;  
    16.         public WorkerThread(String name) {    
    17.           super(name);    
    18.         }       
    19.         public void run() {    
    20.             while(true){  
    21.                 i++;  
    22.                 Log.i("[YT]", "In YtTtsService-->WorkerThread running "+i);  
    23.                 try {  
    24.                     Thread.sleep(3000);  
    25.                 } catch (InterruptedException e) {  
    26.                     e.printStackTrace();  
    27.                 }  
    28.             }  
    29.         }    
    30.     }  
    31. }  


    三。在frameworks/base/services/java/com/android/server/SystemServer.java, ServerThread中run()方法中增加代码:

    [html] view plaincopy
     
    1. try {  
    2.     Log.i("[YT]", "In SystemServer, YtTts add..");  
    3.     ServiceManager.addService("yttts", new YtTtsService(context));  
    4. } catch (Throwable e) {  
    5.     Log.i("[YT]", "In SystemServer, YtTts add err..");  
    6. }  


    5.在/frameworks/base/core/java/cn/youngtone/tts建一个YtTtsManager类,用于管理YtTtsService:

    [html] view plaincopy
     
    1. package cn.youngtone.tts;  
    2.   
    3. import android.content.Context;  
    4. import android.os.IYtTtsService;  
    5. import android.os.RemoteException;  
    6. import android.util.Log;  
    7.   
    8. public class YtTtsManager {  
    9.     IYtTtsService service;    
    10.       
    11.     public YtTtsManager(Context context ,IYtTtsService service) {    
    12.          this.service = service;    
    13.     }    
    14.     public void speak(String text) {    
    15.         try {  
    16.             Log.e("[YT]" , "In YtTtsManage-->speak():"+text);   
    17.             service.speak(text);  
    18.         } catch (RemoteException e) {    
    19.             Log.e("[YT]" , "In YtTtsManage-->E:RemoteException");    
    20.             e.printStackTrace();    
    21.         }    
    22.     }    
    23. }  

    四。 在ContextImpl getSystemService中添加代码:

    [java] view plaincopy
     
    1. if ("yttts".equals(name)) {   
    [java] view plaincopy
     
    1.     if (mYtTtsManager == null) {    
    2.        IBinder b = ServiceManager.getService("yttts");    
    3.        IYtTtsService service = IYtTtsService.Stub.asInterface(b);    
    4.        mYtTtsManager = new YtTtsManager(this, service);    
    5.      }    
    6.      return mYtTtsManager;  
    7. }  



    五。测试代码

    [java] view plaincopy
     
    1. YtTtsManager mManager = (YtTtsManager)getSystemService("yttts");  
    2. mManager.speak("这是一个简单的系统服务!");  

    END.

    参考:http://blog.csdn.net/aiai373824745/article/details/7439896

  • 相关阅读:
    Fy's dota2
    Black Rock Shooter
    树上的颜色
    8.spring:事务管理(上):Spring的数据库编程、编程式事务管理
    7.spring:SpringAOP(配置文件)
    6.spring:AOP(注解)
    5.spring:注解配置 Bean
    4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean
    3.spring:自动装配/Bean之间的关系/作用域/外部文件/spel/
    2.spring:集合属性
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/5007369.html
Copyright © 2011-2022 走看看