在不同的APP中
服务器端我是用eclipse开发的,因为AndroidStudio因为包结构的问题本人一直无法解决,就是客户端aidl的包目录结构要与服务端的包结构一致才能调用,服务端不是我写的,没有源码,不可以改,他有多个包结构与多个aidl,所以本人用eclipse开发一个将所有aidl接口统一的一个aidl接口适配as,eclipse就没有as那种包结构了,所以看图:
这是我自己写的服务端接口,用eclipse写的
woyou.aidlservice.jiuiv5 与com.sunmi.trans
是别人写的服务端调用接口.
而com.yg.yunguo是我写来兼容Androidstudio的
package com.yg.yunguo;
//中间转发数据
interface DayinAidl{
void d1(String A1, String A2, String A3);
void d2(String A4, String A5, String A6, String A7, String A8,String A9, String A10, String A11);
void d3(String A12, String A13, String A14, String A15, String A16);
}
aidl写好需要用到的接口,绑定服务.
package com.yg.main;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.yg.yunguo.DayinAidl;
public class DyServer extends Service{
private DayinSer dayinSer;
@Override
public IBinder onBind(Intent i) {
return dayinSer;
}
public class DayinSer extends DayinAidl.Stub{
@Override
public void d3(String A12, String A13, String A14, String A15, String A16)
throws RemoteException {
Log.e("@@@@DyServer","d3");
Contant.dayin.d3(A12, A13, A14, A15, A16);
}
@Override
public void d2(String A4, String A5, String A6, String A7, String A8,
String A9, String A10, String A11) throws RemoteException {
Log.e("@@@@DyServer","d2");
Contant.dayin.d2(A4, A5, A6, A7, A8, A9, A10, A11);
}
@Override
public void d1(String A1, String A2, String A3) throws RemoteException {
Log.e("@@@@DyServer","d1");
Contant.dayin.d1(A1, A2, A3);
}
}
@Override
public void onCreate() {
super.onCreate();
dayinSer = new DayinSer();
}
}
服务里面的接口会调用本地的实体方法,我的本地方法时在调用另一个aidl…
package com.yg.main;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(Contant.dayin.connService);
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yg.main"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:name="com.yg.main.App"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.yg.main.MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoDisplay" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
</intent-filter>
</activity>
<service
android:name="com.yg.main.DyServer"
android:enabled="true"
android:exported="true">
<!--用于客户端调用-->
<intent-filter>
<action android:name="android.intent.action.DyServer"/>
</intent-filter>
</service>
</application>
</manifest>
在manifest里面我这样配置是没有桌面入口的,因为这里只需要作为一个服务调用.
客户端
新建AIDL目录
将服务端AIDL文件复制过来
注意这里的包目录需要与服务端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', 'src/main/aidl/']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
}
}
最后绑定服务代码:
Contant.dayin = new Dayin();
Intent intent = new Intent();
intent.setAction("android.intent.action.DyServer");
intent.setPackage("com.yg.main");
startService(intent);// 启动打印服务
bindService(intent,Contant.dayin.connection, Context.BIND_AUTO_CREATE);
这样就绑定了另一个进程中的aidl服务
调用在Contant.dayin中,就是下面这个类.我是在别的地方初始化的.
package com.yg.yunguo.tools;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.yg.yunguo.DayinAidl;
public class Dayin {
private DayinAidl dayinAidl;
public ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("@@@Dayin ","onServiceDisconnected");
dayinAidl = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
Log.e("@@@Dayin ","onServiceConnected");
dayinAidl = DayinAidl.Stub.asInterface(iBinder);
}
};
public void d1(String A1,String A2,String A3){
try {
dayinAidl.d1(A1, A2, A3);
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void d2(String A4, String A5, String A6, String A7, String A8,
String A9, String A10, String A11) {
try {
dayinAidl.d2(A4, A5, A6, A7, A8, A9, A10, A11);
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void d3(String A12, String A13, String A14, String A15, String A16) {
try {
dayinAidl.d3(A12, A13, A14, A15, A16);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
写的不好…..努力ing….会写的更好…..