AndroidStudio跨进程通信AIDL应用

在不同的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….会写的更好…..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走到无路可退

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值