• 添加service到SystemService硬件服务


    添加service到SystemService: 添加硬件服务。
    创建时间:2015年3月9日(星期一) 晚上11:07 | 分类:硬件驱动Android | 天气: 
    修改时间:2015年3月10日(星期二) 中午11:37
    <note_content>

    .添加service到SystemService

    测试的service类是InnerToolService,表示内置到framework的自定义服务,使用的aidl包括:
    IInnerToolService  定义接口,InnerToolService实现该接口
    IInnerToolCB.aidl  定义回调  不熟悉aidl的话可以先不加
    
    
    1).添加需要的Service的java文件。

    注意:包名也要一样。package com.android.server;然后找到SystemServer,修改如下在ServerThread的run方法里添加

    //add innertool
    try {              
        ServiceManager.addService("innertool", new InnerToolService(context));            
    } catch (Throwable e) {     
    }
    //End 

    注意"innertool"相当于service的标记,在使用getSystemService来获取时需要提供该标记。

    2).frameworksasecorejavaandroidappContextImpl.java  
    这里主要是响应getSystemService,如果service未启动,则启动service。(与manager关联)
    首先添加import语句
                //inner tool
                import com.android.innertool.IInnerToolService;
                //End
    
    然后在内部类ServiceFetcher的static语句块里添加以下代码:
                
                //add innertool 
                registerService("innertool", new ServiceFetcher() {
                    public Object getService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService("innertool");
                IInnerToolService service = IInnerToolService.Stub.asInterface(b);
                Log.e("tool", "fetch innertool service = " + service);
                return  service;
                    }});
                //End
    1. 其次在context/context.java中添加对应函数
    3).aidl相关文件的编译
    framework/base/Android.mk文件,在LOCAL_SRC_FILES下添加相关的aidl文件
            
            LOCAL_SRC_FILES += 
                    innertool/java/com/android/innertool/IInnerToolService.aidl 
                    innertool/java/com/android/innertool/IInnerToolCB.aidl

    到这里基本就添加完成了,可能部分不同的平台或者项目会存在差异,大家需要细心。然后是对于远程service的调用

    假设aidl定义的接口如下

    interface IInnerToolService{
    	void exec(String arg0,String arg1,IInnerToolCB arg2);
    }

    2.通过aidl调用远程service

    上面定义了aidl文件,使用的包名是com.android.innertool,那我们本地应用也需要有这个包名下的aidl文件

    即测试应用需要创建com.android.innertool这个包,并将IInnerToolService.aidl和IInnerToolCB.aidl文件放进去,这样会在gen/生成对应的java文件。

    然后就可以使用该SystemService的接口了。

    private IInnerToolService toolService2;
    toolService2 = (IInnerToolService) getSystemService("innertool");
    try {
        toolService2.exec("aaa", "bbb", new InnerToolCB());
    } catch (RemoteException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    这样基本就走通了简单的调用流程。

    附上相应的代码

    package com.android.server;
    
    import android.content.Context;
    import android.os.RemoteException;
    import android.util.Log;
    
    import com.android.innertool.IInnerToolCB;
    import com.android.innertool.IInnerToolService;
    
    public class InnerToolService extends IInnerToolService.Stub{
    
    	private Context mContext;
    
    	public InnerToolService(Context context) {	
    		mContext = context; 
    	}
    
    	@Override
    	public void exec(String arg0, String arg1, IInnerToolCB arg2)
    			throws RemoteException {
    		// TODO Auto-generated method stub
    		Log.v("InnerToolService", "exec,"+arg0+","+arg1+","+arg2);
    	}
    }
    
    ==========================================
    注意: 如果在Android源码中添加了自定义的包、类、方法或者你修改了android源码中标识为“@hide”的方法、类,你需要这些内容对Application可见并且需要编译进sdk中的Document中的话,需要执行
          make update-api
    ==========================================
  • 相关阅读:
    Tools
    Python
    Python
    Python
    Python
    Python
    linux下搭建SVN服务器完全手册【摘抄】
    XPath学习:轴(14)——总结
    XPath学习:parent,child
    使用Xpath对XML进行模糊查询
  • 原文地址:https://www.cnblogs.com/Ph-one/p/4627627.html
Copyright © 2020-2023  润新知