android AIDL示例代码(mark下)
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下)的更多相关文章
- 【转】微信Android SDK示例代码及运行方法
		原文网址:http://blog.csdn.net/icyfox_bupt/article/details/23742217 最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一 ... 
- 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
		1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ... 
- Android中悬浮窗口的实现原理和示例代码
		用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutPar ... 
- IDEA插件(Android Studio插件)开发示例代码及bug解决
		IDEA插件(Android Studio插件)开发示例代码及bug解决 代码在actionPerformed方法中,有个AnActionEvent e 插件开发就是要求我们复写上述的这个方法即可,在 ... 
- Android判断当前网络是否可用--示例代码
		Android判断当前网络是否可用--示例代码 分类: *07 Android 2011-05-24 13:46 7814人阅读 评论(4) 收藏 举报 网络androiddialogmanagern ... 
- 【译】用Fragment创建动态的界面布局(附Android示例代码)
		原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ... 
- 关于下拉刷新你是否真的非常理解还是只会搬砖?附 Android 实例子源代码文件下载地址380个合集
		1,推荐几篇非常有用的博文 原创写的真的非常好 主要讲解原理,整体布局三部分组成以及设置padding等等作用, 下拉的具体实现 滑动到底部具体加载以及判断手势事件,再次推荐作者的 详细讲解 建议先看 ... 
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
		作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ... 
- SkylineGlobe Android 开发 面积计算示例代码
		SkylineGlobe Android 开发 面积计算示例代码: 如果之前熟悉SkylineGlobe桌面端的二次开发,看这些代码应该不难理解. package com.skyline.terrae ... 
随机推荐
- Linux:文本处理工具
			闲话少说,列出工具: ========================这些是查看文本用的=========================== 1,cat 用法:cat >f1 直接创建或覆盖 ... 
- raspberry 重新烧录后的设置
			raspberry初学者在使用的时候经常遇到各种问题,常常重新烧录系统,现在把新系统的常用配置和安装内容整理一下,避免自己忘记 1.安装常用软件包: sudo apt-get gedit sudo a ... 
- webstorm下ES6转ES5
			ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0. ES6的目标,是使得Java ... 
- python爬虫10 | 网站维护人员:真的求求你们了,不要再来爬取了!!
			今天 小帅b想给大家讲一个小明的小故事 ... 话说 在很久很久以前 小明不小心发现了一个叫做 学习python的正确姿势 的公众号 从此一发不可收拾 看到什么网站都想爬取 有一天 小明发现了一个小黄 ... 
- git 的简单使用(4)
			多人协作的工作模式通常是这样: 首先,可以试图用git push origin <branch-name>推送自己的修改: 如果推送失败,则因为远程分支比你的本地更新,需要先用git pu ... 
- 【Codeforces 225C】Barcode
			[链接] 我是链接,点我呀:) [题意] 让你把每一列都染成一样的颜色 要求连续相同颜色的列的长度都大于等于x小于等于y 问你最少的染色次数 [题解] 先求出每一列染成#或者.需要染色多少次 设f[0 ... 
- Java基础学习总结(73)——Java最新面试题汇总
			1.super()与this()的区别? this():当前类的对象,super父类对象. super():在子类访问父类的成员和行为,必须受类继承规则的约束 而this他代表当前对象,当然所有的资源 ... 
- UCloud 的安全秘钥
			UCloud 的安全秘钥(困难) 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因 ... 
- 高三感想+跨年感想+OI回忆录
			2017.12.29晚 高三感慨 与OI分别很久了,发现自己已经不会敲代码了…… 高三国庆前大概比较正常,只是某只人影响有点大(现在好多了)…… 感觉国庆以后状态就没好过. 先感冒两个星期,然后某个周 ... 
- 清北学堂模拟赛d3t2 b
			分析:一道比较让人头疼的数学题. 先考虑怎么让分出来的三角形相似,先不考虑每个三角形的具体边长,设每个三角形的周长为li,则可知必然有一个数g = gcd{li},每一个三角形的周长都是g的倍数,这样 ... 
