Android IPC进程间通信之AIDL双向通信

Posted zhangphil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android IPC进程间通信之AIDL双向通信相关的知识,希望对你有一定的参考价值。

android IPC进程间通信之AIDL双向通信

假设现在有两个App,一个是作为服务器端的App称之为:Server。另一个是作为客户端端的App称之为:Client。
Server对外提供计算服务,为连接上的客户端端App:Client提供计算服务,Server这个App接受客户端App:Client传递过来的两个整数,然后服务器端App:Server负责计算求和,然后Server把计算结果传回给客户端App:Client。

先实现服务器端App:Server的代码:

先定义aidl代码文件中的接口ServerAIDLInterface.aidl:

// ServerAIDLInterface.aidl
package zhangphil.book.server;

interface ServerAIDLInterface 
    int add(int a,int b);

函数add()即为服务器端App打算公开暴露、提供给客户端App跨进程访问和使用的函数接口。

 

ServerStub继承自ServerAIDLInterface中的Stub,ServerStub.java:

package zhangphil.book.server;

import android.os.RemoteException;

public class ServerStub extends ServerAIDLInterface.Stub 
    @Override
    public int add(int a, int b) throws RemoteException 
        return a + b;
    

ServerStub真正实现了服务器端要暴露给客户端跨进程访问的函数接口实现。

 

服务器端需要再写一个服务常驻提供对外服务,ServerService.java:

package zhangphil.book.server;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;

public class ServerService extends Service 
    private ServerStub mServerStub = new ServerStub();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) 
        return mServerStub;
    

需要在Androidmanifest.xml定义、声明这个服务:

        <service android:name="zhangphil.book.server.ServerService">
            <intent-filter>
                <action android:name="start_zhangphil_book_server_service_action" />
            </intent-filter>
        </service>

 

整个服务器端代码组织结构如图:

以上服务器端App:Server代码完成。

####################################################################

####################################################################

以下是客户端App:Client的代码:

客户端要完成的代码比较轻量级。首先需要把服务器端App:Server自动生产的ServerAIDLInterface.java备份到Client的代码文件中。

然后直接连接服务器端App:Server,传递两个随机生产的整数,让服务器端App:Server计算,计算完毕输出即可:

package zhangphil.book.client;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import zhangphil.book.server.ServerAIDLInterface;

public class MainActivity extends AppCompatActivity 

    private ServiceConnection mServiceConnection = new ServiceConnection() 
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) 
            ServerAIDLInterface mServerAIDLInterface = ServerAIDLInterface.Stub.asInterface(service);

            try 
                int a = (int) (Math.random() * 10);
                int b = (int) (Math.random() * 10);

                //客户端进程请求服务器端进程计算两个数a和b的结果。
                Log.d("计算", a + " + " + b);
                int result = mServerAIDLInterface.add(a, b);

                //来自服务器端进程的计算结果
                Log.d("计算", "服务端端计算结果:" + result);
             catch (Exception e) 
                e.printStackTrace();
            
        

        @Override
        public void onServiceDisconnected(ComponentName name) 

        
    ;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        Intent intent = new Intent();
        intent.setPackage("zhangphil.book.server");
        intent.setAction("start_zhangphil_book_server_service_action");
        bindService(intent, mServiceConnection, Service.BIND_AUTO_CREATE);
    

客户端App:Client的代码组织结构:

以上是关于Android IPC进程间通信之AIDL双向通信的主要内容,如果未能解决你的问题,请参考以下文章

Android 进程间通信之Messenger

Android之IPC(aidl)

Android中AIDL实现进程通信(附源码下载)

Android IPC 之 AIDL 使用

Android IPC 之 AIDL 使用

Android进程通信之Messenger&AIDL使用详解