java跨进程通信_Android AIDL实现两个APP间的跨进程通信实例

本文详细介绍了如何使用Android的AIDL(接口定义语言)实现两个不同APP间的跨进程通信。首先展示了在Service端创建AIDL文件、实现Binder的Stub类,接着讲解了如何创建Parcelable的Book类来传递数据。接着,在Service中创建并绑定实现AIDL接口的Binder。最后,阐述了Client端如何绑定Service并进行调用,实现对远程Service的操作。
摘要由CSDN通过智能技术生成

本文为大家分享了Android AIDL实现两个APP间的跨进程通信实例,供大家参考,具体内容如下

1 Service端创建

首先需要创建一个Android工程然后创建AIDL文件,创建AIDL文件主要为了生成继承了Binder的Stub类,以便应用Binder进行进程间通信

servier端结构如下

6a4de149e6ee66447238898b370bc195.png

AIDL代码如下

// IBookManager.aidl

package com.example.bookserver.aidl;

// Declare any non-default types here with import statements

import com.example.bookserver.aidl.Book;

interface IBookManager {

/**

* Demonstrates some basic types that you can use as parameters

* and return values in AIDL.

*/

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,

double aDouble, String aString);

List getBook();

boolean addBook(in Book book);

}

package com.example.bookserver.aidl;

parcelable Book;

之后创建一个实现了Parcelable的Book.java类用来传递数据

package com.example.bookserver.aidl;

import android.os.Parcel;

import android.os.Parcelable;

/**

* Created by SAMSUNG on 2016-09-07.

*/

public class Book implements Parcelable {

private int id;

private String name ;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Book{" +

"id=" + id +

", name='" + name + '\'' +

'}';

}

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeInt(this.id);

dest.writeString(this.name);

}

public Book() {

}

protected Book(Parcel in) {

this.id = in.readInt();

this.name = in.readString();

}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

@Override

public Book createFromParcel(Parcel source) {

return new Book(source);

}

@Override

public Book[] newArray(int size) {

return new Book[size];

}

};

}

最后我们来写一个Service用于客户端绑定

package com.example.bookserver.service;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.IBinder;

import android.os.RemoteException;

import com.example.bookserver.aidl.Book;

import com.example.bookserver.aidl.IBookManager;

import java.util.List;

import java.util.concurrent.CopyOnWriteArrayList;

public class BookService extends Service {

private CopyOnWriteArrayList boookList = new CopyOnWriteArrayList();

public BookService() {

}

Binder binder = new IBookManager.Stub(){

@Override

public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

}

@Override

public List getBook() throws RemoteException {

return boookList;

}

@Override

public boolean addBook(Book book) throws RemoteException {

return boookList.add(book);

}

};

@Override

public IBinder onBind(Intent intent) {

return binder;

}

@Override

public void onCreate() {

super.onCreate();

Book book = new Book();

book.setId(12345);

book.setName("Book 1");

boookList.add(book);

}

}

这样Server端就搞定了,接下来就该进行Client端的代码编写了

2 Client端

Client端结构如下

def1c802ebfe679456d7ecc02b807b01.png

首先我们要讲AndroidStudio 通过AIDL生成的Binder导入到Client中并将Book.java也导入到Client中

然后写进行Service的绑定

package com.example.bookclient;

import android.app.Service;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.content.pm.PackageManager;

import android.content.pm.ResolveInfo;

import android.os.IBinder;

import android.util.Log;

import com.example.bookserver.aidl.IBookManager;

import java.util.List;

/**

* Created by SAMSUNG on 2016-09-07.

*/

public class BookServiceManager {

Context mContext = null;

IBookManager mService = null;

private static BookServiceManager bsm ;

public static BookServiceManager getInstance(Context context){

if(bsm==null){

bsm = new BookServiceManager(context);

}

return bsm;

}

public IBookManager getBookServie(){

while (mService==null){

Log.d("BookServiceManager", "getBookServie: ");

this.connectService();

}

return mService;

}

public BookServiceManager(Context mContext) {

this.mContext = mContext;

}

ServiceConnection scc = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

Log.d("BookServiceManager", "getBookServie: 2 ==> Bind ");

mService = IBookManager.Stub.asInterface(service);

}

@Override

public void onServiceDisconnected(ComponentName name) {

mService = null;

}

};

public boolean connectService(){

if(mService == null){

Log.d("BookServiceManager", "getBookServie: 2");

Intent intent = new Intent("com.example.bookserver.service.BookService");

final Intent eintent = new Intent(createExplicitFromImplicitIntent(mContext,intent));

mContext.bindService(eintent,scc, Service.BIND_AUTO_CREATE);

}

return true;

}

public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {

// Retrieve all services that can match the given intent

PackageManager pm = context.getPackageManager();

List resolveInfo = pm.queryIntentServices(implicitIntent, 0);

// Make sure only one match was found

if (resolveInfo == null || resolveInfo.size() != 1) {

return null;

}

// Get component info and create ComponentName

ResolveInfo serviceInfo = resolveInfo.get(0);

String packageName = serviceInfo.serviceInfo.packageName;

String className = serviceInfo.serviceInfo.name;

ComponentName component = new ComponentName(packageName, className);

// Create a new intent. Use the old one for extras and such reuse

Intent explicitIntent = new Intent(implicitIntent);

// Set the component to be explicit

explicitIntent.setComponent(component);

return explicitIntent;

}

}

最后对设置Button进行调用

package com.example.bookclient;

import android.os.Bundle;

import android.os.RemoteException;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import com.example.bookserver.aidl.Book;

import com.example.bookserver.aidl.IBookManager;

public class MainActivity extends AppCompatActivity {

IBookManager mBookService ;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button button = (Button) findViewById(R.id.button);

Button addButton = (Button) findViewById(R.id.button3);

Button findButton = (Button) findViewById(R.id.button2);

BookServiceManager.getInstance(getApplication()).connectService();

button.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v) {

mBookService = BookServiceManager.getInstance(getApplication()).getBookServie();

}

});

addButton.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v) {

Book book = new Book();

book.setId(2345);

book.setName("add book!!");

try {

mBookService.addBook(book);

} catch (RemoteException e) {

e.printStackTrace();

}

}

});

findButton.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v) {

try {

Log.d("MainActivity", mBookService.getBook().toString());

} catch (RemoteException e) {

e.printStackTrace();

}

}

});

}

}

这样我们就实现了AIDL的不同APP的调用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值