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 ...
随机推荐
- Akka学习——术语和概念
(大部分为翻译) Concurrency vs. Parallelism 并发 vs 并行 并发并不一定同时运行,比如使用时间片,使得两个任务交替执行.而并行是执两个任务真正的同时执行. ...
- 其实,前面倒腾那么多,只是为了想玩SPRING BOOT
嘿嘿,,曲线达到.. 看来看来很多国内的速成,都不爽. 官方教程最体贴~~~:) http://docs.spring.io/spring-boot/docs/current/reference/ht ...
- Ubuntu Server 中resolv.conf重启时被覆盖的问题
/etc/resolv.conf中设置dns之后每次重启Ubuntu Server时该文件会被覆盖,针对这种情况找了一些个解决方法 防止/etc/resolv.conf被覆盖的方法 方法一 1.需要创 ...
- xcode 把cocos2d-x 以源码的形式包含进自己的项目适合, 性能分析问题的错误
性能分析:出现如下错误: xcode profile Variable has incomplete type class “CC_DLL” 解决办法:在 xcode的Build Setting ...
- 从iPhone4、iPhone5、iPhone6看手机外壳加工工艺进化史
从iPhone4.iPhone5到iPhone6,苹果为我们推出了一代又一代新产品,让我们享受到最新的科技产品.每次不只是配置上的改变,苹果在工艺上也不断改变.下面就阐述一下我对这几款手机在设计和制造 ...
- 92. Reverse Linked List II
题目: Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1- ...
- ogg实现oracle到sql server 2005的同步
一.源端(oracle)配置1.创建同步测试表create table gg_user.t01(name varchar(20) primary key);create table gg_user.t ...
- 使用net start mysql的时候出现服务名无效的原因及解决办法
原因:mysql服务没有安装 解决办法:使用管理员权限,执行mysqld -install命令 然后以管理员身份net start mysql开启mysql服务 卸载mysql服务的方法 1.管理员权 ...
- poj3308Paratroopers(dinic)
http://poj.org/problem?id=3308 给两个定义 最小割:对于图中的两个点(一般为源点和汇点)来说,如果把图中的一些边去掉,如果它们之间无法连通的话,则这些边组成的集合就叫为割 ...
- The Impact of Garbage Collection on Application Performance
As we’ve seen, the performance of the garbage collector is not determined by the number of dead obje ...