您的位置:首页 > 移动开发 > Android开发

Android HAL实现的三种方式(3) - 基于Manager的HAL设计

2012-04-10 12:58 756 查看
在上文中我们实现了利用Service来设计HAL,但是根据Android的框架,一般应用程序都不直接和Service打交到,中间需要经过一个Manager层。

我们在这里也按照Android的框架,进一步优化HAL的设计。结构如下:

HAL stub <-> JNI 库 <-> J***A Service <-> Manager <-> J***A 应用程序。

由于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的控制。

本文出自 “Mobile and Linux Deve..” 博客,请务必保留此出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: