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
- android studio 编译aidl以及示例demo
- Android AIDL demo (Android Studio)
- Android Studio中使用AIDL简单示例
- Android Studio 创建AIDL以及Binder 原理
- Android studio AIDL 编译问题处理
- Android studio AIDL 编译问题处理
- android studio编译aidl文件出现问题
- Android Studio下简单编译AIDL方法
- 学习使用Android Studio编写AIDL的Demo
- Android——AIDL基础实现demo以及原理探究
- 在Android studio环境下的AIDL示例
- android aidl demo
- Android AIDL demo
- Android AIDL示例
- android studio AIDL 编译时 错误:找不到符号
- Android Studio编写AIDL文件后如何自动编译生成
- Android 源码编译AIDL 使用实例讲解及Android Studio AIDL的调用详解
- Android studio import aidl
- 正则表达式总结
- jsp之javaBean初理解
- 重温数据结构三——LinkedList
- 获取当前应用程序所在目录
- 概率图模型1:隐马尔科夫(1)
- android studio 编译aidl以及示例demo
- 对双大括号初始化的理解
- 数字二进制位的奇偶位互换
- eclipse在程序修改后,点击运行可以自动保存,如何设置
- css清除浮动
- Android插件化架构设计之加载资源文件
- TP url重写规则及wamp配置
- 学习总结,持续更新
- 20170314 睡一觉起来,解决了昨晚好几个bug