AIDL实例
转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5658372.html
什么是AIDL
建立AIDL服务的步骤
AIDL实例
服务器端
1.建立JavaBean--Model book.java 继承 Parceable 实现序列化。
package testaidl.x.com.testaidl.aidl; import android.os.Parcel;
import android.os.Parcelable; /**
* Created by Administrator on 2016/7/10.
*/
public class Book implements Parcelable { public int id;
public String name; public Book(int id, String name) {
this.id = id;
this.name = name;
} private Book(Parcel in) {
id = in.readInt();
name = in.readString();
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(id);
out.writeString(name);
} 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];
}
};
}
2.(Android Studio) 在src/main/下 建立 aidl 包(与java同级),在aidl下建立JavaBean相同目录的包
建立JavaBean相同名称的.aidl文件 --> Book.aidl
建立服务接口的.aidl文件 --> IBookManager.aidl (必须 import testaidl.x.com.testaidl.aidl.Book;)
// IBook.aidl
package testaidl.x.com.testaidl.aidl; parcelable Book;
// IBookManager.aidl
package testaidl.x.com.testaidl.aidl; import testaidl.x.com.testaidl.aidl.Book; interface IBookManager { List<Book> getAllBook();
void addBook(in Book book); }
目录:
3.此时,进行编译 如果aidl文件的内容是正确的,IDE会自动生成在根目录下一个Java接口文件(*.java)。-->IBookManager.java
4.建立一个服务类(Service的子类)。-->RemoteService.java
package testaidl.x.com.testaidl.aidl; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException; import java.util.LinkedList;
import java.util.List; /**
* Created by Administrator on 2016/7/10.
*/
public class RemoteService extends Service { private List<Book> mBooks = new LinkedList<>(); @Override
public IBinder onBind(Intent intent) {
return mBinder;
} private final IBookManager.Stub mBinder = new IBookManager.Stub() {
@Override
public List<Book> getAllBook() throws RemoteException {
return mBooks;
} @Override
public void addBook(Book book) throws RemoteException {
if(book!=null){
mBooks.add(book);
}
}
};
}
5.在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
另外,要设置service的process属性为":remote"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="testaidl.x.com.testaidl" > <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<!--<activity android:name=".MainActivity" >-->
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.MAIN" />--> <!--<category android:name="android.intent.category.LAUNCHER" />-->
<!--</intent-filter>-->
<!--</activity>-->
<service android:name=".aidl.RemoteService"
android:process=":remote">
<intent-filter>
<action android:name="testaidl.x.com.testaidl.aidl.RemoteService"/>
</intent-filter>
</service>
</application> </manifest>
客户端
1.(Android Studio) 在src/main/下 建立 aidl 包和(与服务端包名一致)JavaBean相同目录的包,并将JavaBean和 JavaBean、服务的AIDL文件全部复制(与服务端包名一致)
2.建立Activity界面-->MainActivity.java
package testaidl.x.com.testaidl.aidl; 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.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast; import java.util.ArrayList;
import java.util.List; import testaidl.x.com.testaidl.R; public class MainActivity extends AppCompatActivity { private ListView mListView;
private EditText mEditText;
private List<Book> mBooks = new ArrayList<>(); private IBookManager mService;
private static boolean mIsRemoteBound = false; private ServiceConnection conn = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IBookManager.Stub.asInterface(service);
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list);
mEditText = (EditText) findViewById(R.id.input_name);
if(mIsRemoteBound){
unbindService(conn);
}else{
Intent intent=new Intent("testaidl.x.com.testaidl.aidl.RemoteService");//这里的action应与服务端的Service的<action>名称相同
bindService(intent, conn, BIND_AUTO_CREATE);
}
mIsRemoteBound = !mIsRemoteBound;
} static int id = 0; public void addBook(View v) {
String name = mEditText.getText().toString();
if(name.equals("")){
Toast.makeText(getApplicationContext(),"名字不能为空",Toast.LENGTH_SHORT).show();
}else{
Book book = new Book(id++,name);
try {
mService.addBook(book);
Toast.makeText(getApplicationContext(),"添加书籍成功",Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),"添加书籍失败:" + e.toString(),Toast.LENGTH_SHORT).show();
}
} } public void getBooks(View v){
try {
mBooks = mService.getAllBook();
} catch (RemoteException e) {
e.printStackTrace();
}
mListView.setAdapter(new MBookAdapter(getApplicationContext(),mBooks,R.layout.item_book));
} class MBookAdapter extends CommonAdapter<Book> {
public MBookAdapter(Context context, List<Book> mDatas, int itemLayoutId) {
super(context, mDatas, itemLayoutId);
} @Override
public void convert(ViewHolder helper, Book item, int position) {
helper.setText(R.id.book_id,item.id + "");
helper.setText(R.id.book_name,item.name + "");
}
}
}
AIDL实例的更多相关文章
- Android AIDL实例解析
AIDL这项技术在我们的开发中一般来说并不是很常用,虽然自己也使用新浪微博的SSO登录,其原理就是使用AIDL,但是自己一直没有动手完整的写过AIDL的例子,所以就有了这篇简单的文章. AIDL(An ...
- Android AIDL 实例
为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface Def ...
- Android探索之旅 | AIDL原理和实例讲解
轉載自http://www.jianshu.com/p/ef86f682a8f9 -- 作者 谢恩铭 转载请注明出处 前言 为使应用程序之间能够彼此通信,Android提供了IPC (Inter Pr ...
- android AIDL 语言用法
跨进程通信可以用AIDL语言 这里讲述下如何使用AIDL语言进行跨进程通信 文章参考 <设计模式>一书 demo结构参考 主要的文件类有:IBankAidl.aidl java文件:Aid ...
- Binder or AIDL的最简单实践
1.前言: 在Android开发中多进程的合理使用+进程间通信的IPC是一个比较难的点.特别是Android特有的Binder机制,非常复杂,对于应用层开发的初级开发工程师强求深入理解Binder机制 ...
- Android 进阶7:进程通信之 AIDL 的使用
读完本文你将了解: AIDL 是什么 AIDL 支持的数据类型 AIDL 如何编写 AIDL 实例 创建 AIDL 编写服务端代码 编写客户端代码 运行结果 总结 代码地址 Thanks 记得 201 ...
- 1.4 Service
用于在后台完成用户指定的操作,为其他组件提供后台服务或监控其他组件的运行状态. 开发人员需要在应用程序配置文件中声明全部的service,使用<service></service&g ...
- android ipc通信机制之二序列化接口和Binder
IPC的一些基本概念,Serializable接口,Parcelable接口,以及Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelab ...
- android service总结
1.通过startservice方法启动一个服务.service不能自己启动自己.若在一个服务中启动一个activity则,必须是申明一个全新的activity任务TASK.通过startservic ...
随机推荐
- 如何优化 Java 性能?
对于 Java 性能比较关心的同学大概都知道<Java Performance>这本书,一般而言,很多同学在日常写 Java Code 的时候很少去关心性能问题,但是在我们写 Code 的 ...
- how to make form:checkboxes in JSP
retransmitTable.jsp file: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix=&qu ...
- WAF SSI
http://www.2cto.com/Article/201405/299154.html
- POJ1905Expanding Rods(二分)
http://poj.org/problem?id=1905 题意 :在两堵实心墙中间有一根杆,长度为L,然后给它加热,温度是n,则两墙之间的杆会弯曲,长度会变为L'=(1+n*C)*L,求前后两个状 ...
- UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法
首先,视图控制器必须得实现协议UIAlertViewDelegate中的方法,并指定delegate为self,才能使弹出的Alert窗口响应点击事件. 具体代码如下: ViewController. ...
- [itint5]下一个排列
http://www.itint5.com/oj/#6 首先,试验的时候要拿5个来试,3,4个都太少了.好久没做所以方法也忘了,是先从后往前找到第一个不合顺序的,然后在后面找到比这个大的最小的来交换, ...
- c# 可访问性级别
使用访问修饰符 public.protected.internal 或 private 可以为成员指定以下声明的访问级别之一. 声明的可访问性 含义 public 访问不受限制. protecte ...
- Nginx+uWSGI或fastcgi部署Django项目
nginx+uWSGI ubuntu下先安装下C编译器和Python环境: sudo apt-get install build-essential python-dev 使用pip安装uWSGI: ...
- python 中@property的使用
从14年下半年开始接触到python,自学了一段时间,后又跟别人学习了下,把基础知识基本上学过了.忽然感觉python不可能这么简单吧,就这么点东西?后来看了下书,发现还有很多的高级部分.连续看了两天 ...
- ExecutorService.execute(Runnable x) 判断是否完成,得到返回值
public class RunnableTestMain { public static void main(String[] args) { ExecutorService pool = Exec ...