Android HAL 开发 (5)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。 http://buaadallas.blog.51cto.com/399160/371594

上一章介绍了直接调用Service来操作硬件的方法,如果我们再优化一下结构,通过一个Manager来调用这个Service的方法,可能会更好。这样Service就可以跑在后台,由于这时候service和manager是两个进程,所以只能通过IPC来进行通信。我们在上一篇看到

publicfinalclassLedServiceextendsILedService.Stub{}, ILedService.Stub就是

ILedService.aidl由aidl工具自动生成的类。

我们现在看看manager是如何实现的:

frameworks/base/core/java/mokoid/hardware/ILedService.aidl

 
 
  1. packagemokoid.hardware;
  2. interfaceILedService
  3. {
  4. booleansetOn(intled);
  5. booleansetOff(intled);
  6. }

该aidl文件最后能被aidl工具自动生成ILedService.java文件,提供了remotable的LedService可用的接口setOn和setOff.

frameworks/base/core/java/mokoid/hardware/LedManager.java

 
 
  1. publicclassLedManager
  2. {
  3. privatestaticfinalStringTAG="LedManager";
  4. privateILedServicemLedService;
  5. publicLedManager(){
  6. mLedService=ILedService.Stub.asInterface(
  7. ServiceManager.getService("led"));
  8. if(mLedService!=null){
  9. Log.i(TAG,"TheLedManagerobjectisready.");
  10. }
  11. }
  12. publicbooleanLedOn(intn){
  13. booleanresult=false;
  14. try{
  15. result=mLedService.setOn(n);
  16. }catch(RemoteExceptione){
  17. Log.e(TAG,"RemoteExceptioninLedManager.LedOn:",e);
  18. }
  19. returnresult;
  20. }
  21. publicbooleanLedOff(intn){
  22. booleanresult=false;
  23. try{
  24. result=mLedService.setOff(n);
  25. }catch(RemoteExceptione){
  26. Log.e(TAG,"RemoteExceptioninLedManager.LedOff:",e);
  27. }
  28. returnresult;
  29. }
  30. }

首先调用mLedService = ILedService.Stub.asInterface(ServiceManager.getService("led")); 得到远端的led service, 然后通过mLedService.setOn和mLedService.setOff来调用service的接口,从而操作硬件。

最后我们看看使用这种方法对应的应用程序代码:

apps/LedTest/src/com/mokoid/LedTest/LedSystemServer.java

 
 
  1. publicclassLedSystemServerextendsService{
  2. @Override
  3. publicIBinderonBind(Intentintent){
  4. returnnull;
  5. }
  6. publicvoidonStart(Intentintent,intstartId){
  7. Log.i("LedSystemServer","StartLedService...");
  8. /*PleasealsoseeSystemServer.javaforyourinterests.*/
  9. LedServicels=newLedService();
  10. try{
  11. ServiceManager.addService("led",ls);
  12. }catch(RuntimeExceptione){
  13. Log.e("LedSystemServer","StartLedServicefailed.");
  14. }
  15. }
  16. }

上面的代码实现了android的一个后台service,通过ServiceManager.addService把LedService加入到service中,这样就可以通过远程调用该service。

apps/LedTest/src/com/mokoid/LedTest/LedTest.java

 
 
  1. publicclassLedTestextendsActivityimplementsView.OnClickListener{
  2. privateLedManagermLedManager=null;
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. //StartLedServiceinaseperatedprocess.
  7. startService(newIntent("com.mokoid.systemserver"));
  8. Buttonbtn=newButton(this);
  9. btn.setText("ClicktoturnLED1On");
  10. btn.setOnClickListener(this);
  11. setContentView(btn);
  12. }
  13. publicvoidonClick(Viewv){
  14. //GetLedManager.
  15. if(mLedManager==null){
  16. Log.i("LedTest","CreatanewLedManagerobject.");
  17. mLedManager=newLedManager();
  18. }
  19. if(mLedManager!=null){
  20. Log.i("LedTest","GotLedManagerobject.");
  21. }
  22. /**CallmethodsinLedServiceviaproxyobject
  23. *whichisprovidedbyLedManager.
  24. */
  25. mLedManager.LedOn(1);
  26. TextViewtv=newTextView(this);
  27. tv.setText("LED1isOn.");
  28. setContentView(tv);
  29. }
  30. }

上面代码首先启动了上面的service,然后当用户点击按钮时,会得到ledManager的实例,然后通过ledManager的接口LedOn点亮led。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值