android studio 编译aidl以及示例demo

来源:互联网 发布:python exit 返回值 编辑:程序博客网 时间:2024/05/29 12:42

使用android studio 编译aidl跟eclipse还是有一定的区别的。之前写过一篇eclipse 版本aidl博客Android aidl通信详解。那么这里主要是把那个demo转换成android studio的版本,以及一些注意事项或者配置。

本篇博客源码下载:http://download.csdn.net/detail/qq_16064871/9779991

1 实现的图片



主要是两个程序i,一个客户端(输入两个数),服务端(是加法计算这两个值)。客户端显示计算结果来的。所以是调用了服务端的服务实现加法计算。


2 部分代码

aidl的接口

package com.example.server;import android.os.Bundle;/*** * System private API for talking with the caculate service. * * {@hide} */interface IBoardADDInterface{     int add(int nValue1,int nValue2);}


客户端的服务计算管理类

package com.example.clientdemo;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.os.IBinder;import com.example.server.IBoardADDInterface;import java.util.List;/** * 客户端的服务计算管理类 * @author mmsx * */public class CaculateManager {//加法计算的服务final String CACULATE_ADD = "COM.CACULATE.ADD";//aidi接口服务IBoardADDInterface mService = null;    /***     * 服务绑定     */    public void bindService(Context context) {    mContext = context;if(mContext != null && isAppInstalled(mContext,"com.example.serverdemo")){Intent intent = new Intent("com.example.serverdemo");intent.setAction(CACULATE_ADD);//Service能够匹配的Actionintent.setPackage("com.example.serverdemo");//应用的包名context.bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);//       context.bindService(getExplicitIntent(mContext,new Intent(CACULATE_ADD)),//       serviceConnection, Context.BIND_AUTO_CREATE);}    }//判断应用是否安装public boolean isAppInstalled(Context context, String packageName) {final PackageManager packageManager = context.getPackageManager();List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);if (pinfo != null) {for (int i = 0; i < pinfo.size(); i++) {if (pinfo.get(i).packageName.contains(packageName)) {return true;}}}return false;}//将隐式启动转换为显式启动,兼容编译sdk5.0以后版本public Intent getExplicitIntent(Context context,Intent implicitIntent){PackageManager pm = context.getPackageManager();List<ResolveInfo> resolveInfos = pm.queryIntentServices(implicitIntent, 0);if (resolveInfos == null || resolveInfos.size()!= 1) {return null;}Intent explicitIntent = null;ResolveInfo info = resolveInfos.get(0);String packageName = info.serviceInfo.packageName;String className = info.serviceInfo.name;ComponentName component = new ComponentName(packageName,className);explicitIntent = new Intent(implicitIntent);explicitIntent.setComponent(component);return explicitIntent;}    Context mContext = null;        /***    * 解除服务绑定    */    public void unbindService()    {    if (mContext != null) {    mContext.unbindService(serviceConnection);}    }        /**     * 加法计算     * @param nValue1     * @param nValue2     * @return 结果     */    public int caculateAdd(int nValue1,int nValue2)    {if (mService == null)return 0;try {return mService.add(nValue1, nValue2);} catch (Exception e) {return 0;}    }        //服务和aidl接口绑定    private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {mService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mService = IBoardADDInterface.Stub.asInterface(service);}};}

在这上面的代码可以看到注释,需要注意的android 5.0以上不能隐式启动服务。解决办法:

1,以把隐式转为显示启动;

2,使用包名和服务名称来启动:

Intent intent = new Intent("com.example.serverdemo");intent.setAction(CACULATE_ADD);//Service能够匹配的Actionintent.setPackage("com.example.serverdemo");//应用的包名context.bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);

服务端的服务怎么写

服务端的计算加法实现类

package com.example.server;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;/** * 服务端的计算加法实现类 * @author mmsx * */public class CaculateAddService extends Service {//加法计算的服务final String CACULATE_ADD = "COM.CACULATE.ADD";//找到自定义服务@Overridepublic IBinder onBind(Intent intent) {if(intent.getAction().equals(CACULATE_ADD)){return mIBinder_CACULATE_ADD;}return null;}@Overridepublic boolean onUnbind(Intent intent) {return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic void onCreate() {super.onCreate();}//aidl的接口实现private final IBinder mIBinder_CACULATE_ADD = new IBoardADDInterface.Stub() {@Overridepublic int add(int nValue1, int nValue2) throws RemoteException {Log.i("Show", String.valueOf(nValue1) + ",,," +String.valueOf(nValue2));return nValue1 + nValue2;}};}

就是这样啦。

记得注册服务

        <service android:name="com.example.server.CaculateAddService" >            <intent-filter>                <action android:name="COM.CACULATE.ADD" >                </action>            </intent-filter>        </service>

3 注意事项或者配置

服务端和客户端的aidl文件都是一样的。

还有需要在build.gradle加上下面内容

    sourceSets.main {        manifest.srcFile 'src/main/AndroidManifest.xml'        java.srcDirs = ['src/main/java', 'src/main/aidl']        resources.srcDirs = ['src/main/java', 'src/main/aidl']        aidl.srcDirs = ['src/main/aidl']        res.srcDirs = ['src/main/res']    }

客户端和服务端aidl包名一定是一样的。如下图:



本篇博客源码下载:http://download.csdn.net/detail/qq_16064871/9779991

1 0
原创粉丝点击