Android HAL实现的三种方式(3) - 基于Manager的HAL设计
2010-08-30 01:11
706 查看
在上文中我们实现了利用Service来设计HAL,但是根据Android的框架,一般应用程序都不直接和Service打交到,中间需要经过一个Manager层。
我们在这里也按照Android的框架,进一步优化HAL的设计。结构如下:
HAL stub <-> JNI 库 <-> JAVA Service <-> Manager <-> JAVA 应用程序。
由于LedManager和LedService属于两个进程,他们之间的通信需要通过AIDL来实现,下面是ILedService.aidl
在这个文件中定义了LedService提供给LedManager的接口,经过aidl工具会被编译成ILedService.java文件。
我们再看看LedManager是如何实现的:
这里需要注意的是mLedService = ILedService.Stub.asInterface(nager.getService("led")); 通过这个函数可以得到LedService的实例,从而调用它的方法。
而对于LedService我们需要作一个小小的改变,如下:
该LedService需要继承自ILedService.Stub从而实现AIDL接口与LedManager通信。
最后我们看看应用程序,在应用程序中,我们实现了一个service(注意和上面的service的区别)和一个activity,在service中start了LedService, 而在activity中通过LedManager来使用LedService中提供的接口。
我们首先来看看service的实现:
这里需要注意的是ServiceManager.addService("led", ls); 通过它可以启动恰面创建的LedService。
我们再看看Activity的实现:
当这个activity创建的时候,会通过intent开启上面定义的LedSystemServer,该LedSystemServer会开启前面定义的LedService,当点击button的时候,会new一个LedManager,该LedManager会通过ServiceManager.addService("led", ls)得到LedService的实例,并且提供LedService中的接口给这个activity使用,从而在该activity中实现对Led的控制。
我们在这里也按照Android的框架,进一步优化HAL的设计。结构如下:
HAL stub <-> JNI 库 <-> JAVA Service <-> Manager <-> JAVA 应用程序。
由于LedManager和LedService属于两个进程,他们之间的通信需要通过AIDL来实现,下面是ILedService.aidl
package mokoid.hardware; interface ILedService { boolean setOn(int led); boolean setOff(int led); }
在这个文件中定义了LedService提供给LedManager的接口,经过aidl工具会被编译成ILedService.java文件。
我们再看看LedManager是如何实现的:
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; } }
这里需要注意的是mLedService = ILedService.Stub.asInterface(nager.getService("led")); 通过这个函数可以得到LedService的实例,从而调用它的方法。
而对于LedService我们需要作一个小小的改变,如下:
public final class LedService extends ILedService.Stub { static { System.load("/system/lib/libmokoid_runtime.so"); } public LedService() { Log.i("LedService", "Go to get LED Stub..."); _init(); } /* * Mokoid LED native methods. */ public boolean setOn(int led) { Log.i("MokoidPlatform", "LED On"); return _set_on(led); } public boolean setOff(int led) { Log.i("MokoidPlatform", "LED Off"); return _set_off(led); } private static native boolean _init(); private static native boolean _set_on(int led); private static native boolean _set_off(int led); }
该LedService需要继承自ILedService.Stub从而实现AIDL接口与LedManager通信。
最后我们看看应用程序,在应用程序中,我们实现了一个service(注意和上面的service的区别)和一个activity,在service中start了LedService, 而在activity中通过LedManager来使用LedService中提供的接口。
我们首先来看看service的实现:
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."); } } }
这里需要注意的是ServiceManager.addService("led", ls); 通过它可以启动恰面创建的LedService。
我们再看看Activity的实现:
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); } }
当这个activity创建的时候,会通过intent开启上面定义的LedSystemServer,该LedSystemServer会开启前面定义的LedService,当点击button的时候,会new一个LedManager,该LedManager会通过ServiceManager.addService("led", ls)得到LedService的实例,并且提供LedService中的接口给这个activity使用,从而在该activity中实现对Led的控制。
相关文章推荐
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- 转载.Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计 推荐
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计 推荐
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式- 基于JNI的简单HAL设计
- Android HAL实现3——基于Manager的HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计