Android HAL 开发 (5)
2012-06-13 16:36
204 查看
/article/4442082.html
上一章介绍了直接调用Service来操作硬件的方法,如果我们再优化一下结构,通过一个Manager来调用这个Service的方法,可能会更好。这样Service就可以跑在后台,由于这时候service和manager是两个进程,所以只能通过IPC来进行通信。我们在上一篇看到
public final class LedService extends ILedService.Stub { },
ILedService.Stub就是
ILedService.aidl由aidl工具自动生成的类。
我们现在看看manager是如何实现的:
frameworks/base/core/java/mokoid/hardware/ILedService.aidl
[/code]
该aidl文件最后能被aidl工具自动生成ILedService.java文件,提供了remotable的LedService可用的接口setOn和setOff.
frameworks/base/core/java/mokoid/hardware/LedManager.java
[/code]
首先调用 mLedService = ILedService.Stub.asInterface(ServiceManager.getService("led")); 得到远端的led service, 然后通过mLedService.setOn和mLedService.setOff来调用service的接口,从而操作硬件。
最后我们看看使用这种方法对应的应用程序代码:
apps/LedTest/src/com/mokoid/LedTest/LedSystemServer.java
[/code]
上面的代码实现了android的一个后台service,通过ServiceManager.addService把LedService加入到service中,这样就可以通过远程调用该service。
apps/LedTest/src/com/mokoid/LedTest/LedTest.java
[/code]
上面代码首先启动了上面的service,然后当用户点击按钮时,会得到ledManager的实例,然后通过ledManager的接口LedOn点亮led。
本文出自 “Mobile and Linux Deve..” 博客,请务必保留此出处/article/4442082.html
上一章介绍了直接调用Service来操作硬件的方法,如果我们再优化一下结构,通过一个Manager来调用这个Service的方法,可能会更好。这样Service就可以跑在后台,由于这时候service和manager是两个进程,所以只能通过IPC来进行通信。我们在上一篇看到
public final class LedService extends ILedService.Stub { },
ILedService.Stub就是
ILedService.aidl由aidl工具自动生成的类。
我们现在看看manager是如何实现的:
frameworks/base/core/java/mokoid/hardware/ILedService.aidl
package mokoid.hardware; interface ILedService { boolean setOn(int led); boolean setOff(int led); }
[/code]
该aidl文件最后能被aidl工具自动生成ILedService.java文件,提供了remotable的LedService可用的接口setOn和setOff.
frameworks/base/core/java/mokoid/hardware/LedManager.java
public class LedManager { private static final String TAG = "LedManager"; private ILedService mLedService; public LedManager() { mLedService = ILedService.Stub.asInterface( ServiceManager.getService("led")); if (mLedService != null) { Log.i(TAG, "The LedManager object is ready."); } } public boolean LedOn(int n) { boolean result = false; try { result = mLedService.setOn(n); } catch (RemoteException e) { Log.e(TAG, "RemoteException in LedManager.LedOn:", e); } return result; } public boolean LedOff(int n) { boolean result = false; try { result = mLedService.setOff(n); } catch (RemoteException e) { Log.e(TAG, "RemoteException in LedManager.LedOff:", e); } return result; } }
[/code]
首先调用 mLedService = ILedService.Stub.asInterface(ServiceManager.getService("led")); 得到远端的led service, 然后通过mLedService.setOn和mLedService.setOff来调用service的接口,从而操作硬件。
最后我们看看使用这种方法对应的应用程序代码:
apps/LedTest/src/com/mokoid/LedTest/LedSystemServer.java
public class LedSystemServer extends Service { @Override public IBinder onBind(Intent intent) { return null; } public void onStart(Intent intent, int startId) { Log.i("LedSystemServer", "Start LedService..."); /* Please also see SystemServer.java for your interests. */ LedService ls = new LedService(); try { ServiceManager.addService("led", ls); } catch (RuntimeException e) { Log.e("LedSystemServer", "Start LedService failed."); } } }
[/code]
上面的代码实现了android的一个后台service,通过ServiceManager.addService把LedService加入到service中,这样就可以通过远程调用该service。
apps/LedTest/src/com/mokoid/LedTest/LedTest.java
public class LedTest extends Activity implements View.OnClickListener { private LedManager mLedManager = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Start LedService in a seperated process. startService(new Intent("com.mokoid.systemserver")); Button btn = new Button(this); btn.setText("Click to turn LED 1 On"); btn.setOnClickListener(this); setContentView(btn); } public void onClick(View v) { // Get LedManager. if (mLedManager == null) { Log.i("LedTest", "Creat a new LedManager object."); mLedManager = new LedManager(); } if (mLedManager != null) { Log.i("LedTest", "Got LedManager object."); } /** Call methods in LedService via proxy object * which is provided by LedManager. */ mLedManager.LedOn(1); TextView tv = new TextView(this); tv.setText("LED 1 is On."); setContentView(tv); } }
[/code]
上面代码首先启动了上面的service,然后当用户点击按钮时,会得到ledManager的实例,然后通过ledManager的接口LedOn点亮led。
本文出自 “Mobile and Linux Deve..” 博客,请务必保留此出处/article/4442082.html
相关文章推荐
- 深入浅出 - Android系统移植与平台开发(七)- 初识HAL【转】
- Android HAL 开发 (4)
- Android HAL 开发 (1)
- Android HAL 开发 (1)
- 深入浅出 - Android系统移植与平台开发(七)- 初识HAL
- Android HAL 开发 (4)
- Android HAL 开发 (4)
- Android HAL开发详解
- Android HAL 开发 (1)
- Android开发入门之五—Android HAL
- Android HAL 开发 (5)
- Android HAL 开发 (2)
- Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&Browser架构设计与实战开发
- 【视频课程】Android底层开发关键技术—Android系统移植与HAL框架开发
- Android深度探索:HAL与驱动开发学习笔记--并发控制之互斥锁
- Android深度探索:HAL与驱动开发学习笔记--并发控制之自旋锁
- 深入浅出 - Android系统移植与平台开发(七)- 初识HAL
- Android深度探索:HAL与驱动开发学习笔记--工作队列
- Android HAL 开发 (5)
- Android深度探索:HAL与驱动开发学习笔记--内存管理(学习重点)