1.demo结构图

2.ipcclient

  Book类。

package com.mu.guoxw.ipcclient;

import android.os.Parcel;
import android.os.Parcelable; /**
* Created by guoxw on 2018/3/21.
*/ public class Book implements Parcelable {
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getPrice() {
return price;
} public void setPrice(int price) {
this.price = price;
} private String name; private int price; public Book(){} public Book(Parcel in) {
name = in.readString();
price = in.readInt();
} public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
} @Override
public Book[] newArray(int size) {
return new Book[size];
}
}; @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(price);
} /**
* 参数是一个Parcel,用它来存储与传输数据
* @param dest
*/
public void readFromParcel(Parcel dest) {
//注意,此处的读值顺序应当是和writeToParcel()方法中一致的
name = dest.readString();
price = dest.readInt();
} //方便打印数据
@Override
public String toString() {
return "name : " + name + " , price : " + price;
}
}

 Book.aidl

// Book.aidl
package com.mu.guoxw.ipcclient; // Declare any non-default types here with import statements
parcelable Book;

  BookManager.aidl

package com.mu.guoxw.ipcclient;
import com.mu.guoxw.ipcclient.Book;
// Declare any non-default types here with import statements interface BookManager {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
List<Book>getBooks();
void addBook(inout Book book);
Book getBook();
}

gradle

android {

    sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/aidl']
}
} }

  

MainActivity

package com.mu.guoxw.ipcclient;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; import java.util.List; public class MainActivity extends AppCompatActivity { private BookManager mBookManager = null; private boolean mBound = false; //包含Book对象的list
private List<Book> mBooks; Button btn_add;
TextView text; private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mBookManager = BookManager.Stub.asInterface(service);
mBound = true;
if (mBookManager != null) {
try {
mBooks = mBookManager.getBooks();
} catch (RemoteException e) {
e.printStackTrace();
}
}
} @Override
public void onServiceDisconnected(ComponentName name) {
Log.e(getLocalClassName(), "service disconnected");
mBound = false;
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_add=findViewById(R.id.btn_add);
text=findViewById(R.id.text); btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { addBook();
}
}); } /**
* 按钮的点击事件,点击之后调用服务端的addBookIn方法
*
*/
public void addBook() {
if (!mBound) {
attemptToBindService();
Toast.makeText(this, "当前与服务端处于未连接状态,正在尝试重连,请稍后再试", Toast.LENGTH_SHORT).show();
return;
}
if (mBookManager == null) return; Book book = new Book();
book.setName("测试app_A");
book.setPrice(30);
try {
mBookManager.addBook(book);
Log.e("aidl:","client端_添加数据"+ book.toString()); List<Book> mbooks=mBookManager.getBooks();
for (int i=0;i<mbooks.size();i++){
if(mbooks.get(i)!=null){
Log.e("aidl:", "addBook: cleint端_打印:"+mbooks.get(i).toString() );
}
}
} catch (RemoteException e) {
e.printStackTrace();
}
} /**
* 尝试与服务端建立连接
*/
private void attemptToBindService() {
Intent intent = new Intent();
intent.setAction("com.multak.guoxw.ipcservertest.service.aidl");
intent.setPackage("com.multak.guoxw.ipcservertest");
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
} @Override
protected void onStart() {
super.onStart();
if (!mBound) {
attemptToBindService();
}
} @Override
protected void onDestroy() {
super.onDestroy();
super.onStop();
if (mBound) {
unbindService(mServiceConnection);
mBound = false;
}
}
}

 3:ipcServerTest

Book.aidl

package com.mu.guoxw.ipcclient;
import com.mu.guoxw.ipcclien.Book;
// Declare any non-default types here with import statements
parcelable Book;

  BookManager.aidl

// BookManager.aidl
package com.mu.guoxw.ipcclient;
import com.mu.guoxw.ipcclient.Book; interface BookManager { List<Book> getBooks();
void addBook(inout Book book);
Book getBook();
}

  

  AIDLService

package com.mu.guoxw.ipcservertest.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log; import com.mu.guoxw.ipcclient.Book;
import com.mu.guoxw.ipcclient.BookManager; import java.util.ArrayList;
import java.util.List; public class AIDLService extends Service { private List<Book> mBooks=new ArrayList<>(); public AIDLService() {
} private final BookManager.Stub bookManager=new BookManager.Stub() {
@Override
public List<Book> getBooks() throws RemoteException {
synchronized (this){
if (mBooks != null) {
return mBooks;
}
return new ArrayList<>();
}
} @Override
public void addBook(Book book) throws RemoteException {
synchronized (this){
if (mBooks == null) {
mBooks = new ArrayList<>();
}
if (book == null) {
book = new Book();
}
book.setPrice(2333);
Log.e("aidl:", " service端_修改数据 "+book.toString());
if (!mBooks.contains(book)) {
mBooks.add(book);
}
}
} @Override
public Book getBook() throws RemoteException {
return null;
} }; @Override
public void onCreate() {
Book book = new Book();
book.setName("Android开发艺术探索");
book.setPrice(28);
mBooks.add(book);
super.onCreate();
} @Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(getClass().getSimpleName(), String.format("on bind,intent = %s", intent.toString()));
return bookManager;
}
}

  

MessengerService[没用]
package com.mu.guoxw.ipcservertest.service;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.support.annotation.Nullable; public class MessengerService extends Service {
private static final int SAY_HOLLE = 0; static class ServiceHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SAY_HOLLE:
break;
default:
super.handleMessage(msg);
break;
}
}
} final Messenger mMessenger = new Messenger(new ServiceHandler()); @Nullable
@Override
public IBinder onBind(Intent intent) {
System.out.println("binding");
return mMessenger.getBinder();
}
}

  Book

package com.mu.guoxw.ipcclient;

import android.os.Parcel;
import android.os.Parcelable; /**
* Created by guoxw on 2018/3/21.
*/ public class Book implements Parcelable { public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getPrice() {
return price;
} public void setPrice(int price) {
this.price = price;
} private String name;
private int price; public Book() {
}
protected Book(Parcel in) {
name = in.readString();
price = in.readInt(); } public static Creator<Book> getCREATOR() {
return CREATOR;
} public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
} @Override
public Book[] newArray(int size) {
return new Book[size];
}
}; @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(price);
} public void readFromParcel(Parcel dest) {
name = dest.readString();
price = dest.readInt(); } //方便打印数据
@Override
public String toString() {
return "name : " + name + " , price : " + price;
}
}

  4.注册

  <service
android:name=".service.AIDLService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="com.multak.guoxw.ipcservertest.service.aidl"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service> <service
android:name=".service.MessengerService"
android:exported="true">
<intent-filter>
<action android:name="com.lypeer.messenger"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>

 

5.code:AIDL_demo

链接: https://pan.baidu.com/s/1ExGhr3U9MAgqR_kpBeGqCQ 

  

  

链接:https://pan.baidu.com/s/1h6sKauYDr-Kbl4ay2DnRzQ
  提取码:q37o

  

 

android AIDL示例代码(mark下)的更多相关文章

  1. 【转】微信Android SDK示例代码及运行方法

    原文网址:http://blog.csdn.net/icyfox_bupt/article/details/23742217 最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一 ...

  2. 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用

    1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...

  3. Android中悬浮窗口的实现原理和示例代码

    用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutPar ...

  4. IDEA插件(Android Studio插件)开发示例代码及bug解决

    IDEA插件(Android Studio插件)开发示例代码及bug解决 代码在actionPerformed方法中,有个AnActionEvent e 插件开发就是要求我们复写上述的这个方法即可,在 ...

  5. Android判断当前网络是否可用--示例代码

    Android判断当前网络是否可用--示例代码 分类: *07 Android 2011-05-24 13:46 7814人阅读 评论(4) 收藏 举报 网络androiddialogmanagern ...

  6. 【译】用Fragment创建动态的界面布局(附Android示例代码)

    原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...

  7. 关于下拉刷新你是否真的非常理解还是只会搬砖?附 Android 实例子源代码文件下载地址380个合集

    1,推荐几篇非常有用的博文 原创写的真的非常好 主要讲解原理,整体布局三部分组成以及设置padding等等作用, 下拉的具体实现 滑动到底部具体加载以及判断手势事件,再次推荐作者的 详细讲解 建议先看 ...

  8. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  9. SkylineGlobe Android 开发 面积计算示例代码

    SkylineGlobe Android 开发 面积计算示例代码: 如果之前熟悉SkylineGlobe桌面端的二次开发,看这些代码应该不难理解. package com.skyline.terrae ...

随机推荐

  1. Swoole 源码分析——Server模块之Worker事件循环

    swManager_loop 函数 manager 进程管理 manager 进程开启的时候,首先要调用 onManagerStart 回调 添加信号处理函数 swSignal_add,SIGTERM ...

  2. 如何应对SHA-1加密算法升级为SHA-256

    经过权威机构证实,sha1加密算法的不安全性越来越高,sha指纹造假成本越来越低,随即微软.谷歌等IT巨头相继发布弃用sha1加密算法声明,第三方认证机构自2016年1月1日起,将全面停止签发SHA1 ...

  3. 【codeforces 801A】Vicious Keyboard

    [题目链接]:http://codeforces.com/contest/801/problem/A [题意] 一个字符串只由VK组成; 让你修改一个字符; 使得剩下的字符串里面子串VK的个数最大; ...

  4. hdu 4280

    题意:求XY平面上最左边的点到最右边的点的最大流. 分析:数据量大,EK算法TLE,要用SAP算法.SAP算法用的是 http://www.cnblogs.com/kuangbin/archive/2 ...

  5. 20180629利用powerdesigner生成数据字典

    原创作品,如有错误,请批评指正 第一步新建一个PDM模型 第二步 点击“FILE”--->"RESERVER ENGINEER"--->"DATABASE&q ...

  6. linux服务器中不支持soap及bcmul函数的结局方法

    新的程序里用了webserice接口,部到服务器,先是提示:bcmul() 函数不可用,网上搜索一番,得知这是php的高精度函数,需要在编译php的时候加入此模块,于是在编译脚本里增添 “–enabl ...

  7. 这书真的不错--Spring MVC Beginner's Guide

    五百多页,我干到三百多页了. 每个知识点都有说明,操作,解释. 学SPRING MVC,有它就够了. 遗憾的是,这个PDF的文档格式太稀松啦,且,无中文版~~~ 我都想作汉化翻译工作了...算了,忍住 ...

  8. Spring MVC-表单(Form)标签-单选按钮集合(RadioButtons)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_radiobuttons.htm 说明:示例基于Spring MVC 4.1.6. ...

  9. Linux Container测试之block IO

      简介 Linux Container是OS级别的虚拟化方案,它相比于一般的虚拟机没有了硬件模拟以及指令模拟,相比传统虚拟机具有更低的开销,因此可以应用到私有云之中.LXC目前的版本支持对memor ...

  10. IOS_OC_Category

    1.Category概述 那的Category的使用场景有那些呢: 1.类包括了非常多个方法实现,而这些方法须要不同团队的成员来实现 2.当你在使用基础类库中的类时,你不想继承这些类而仅仅想加入一些方 ...