[Android]使用AIDL进行进程间通信
来源:互联网 发布:男烟女烟区别知乎 编辑:程序博客网 时间:2024/06/10 02:13
本文介绍IPC通信机制中的AIDL方式的实现。
Binder是Android中的一个类,它是Android中虚拟的一个硬件设备,驱动是/dev/binder。我们可以理解为Android中专有的用于进程间通信的设备。
下面实现一个基于AIDL进程间通信的实例。
代码结构如下:
其中:
MainActivity.java是我们的测试界面;
User.java是user类;
User.aidl和IUserManager.aidl是按照AIDL规范定义的接口;
IBinderService.java是service类。
代码实现的功能就是要实现一个用户的注册和登陆功能。
这里直接贴出代码了:
//MainActivity.javapackage string.pub;import java.util.Date;import string.pub.binder.IUserManager;import string.pub.binder.User;import android.app.Activity;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.view.View;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends Activity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll=new LinearLayout(this); tv=new TextView(this); final StringBuilder sb=new StringBuilder(); Button addUser=new Button(this); addUser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub User temp=new User(); temp.userName="U123"; temp.pwd="123"; temp.sex=1; temp.name="temp"+(new Date()).getSeconds(); try { if(userBinder.register(temp)){ tv.append(temp.toString()+"add user success\n"); } } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); addUser.setText("addUser"); Button loginUser=new Button(this); loginUser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub User temp=new User(); temp.userName="U123"; try { if(userBinder.login(temp)){ tv.append(temp.toString()+"login user success\n"); } } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); loginUser.setText("loginUser"); ll.addView(loginUser); ll.addView(addUser); ll.addView(tv); setContentView(ll); bindService(new Intent("string.pub.action.Binder"), conn, Context.BIND_AUTO_CREATE); } IUserManager userBinder; ServiceConnection conn=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub userBinder=IUserManager.Stub.asInterface(service); } };}
//User.javapackage string.pub.binder;import android.os.Parcel;import android.os.Parcelable;public class User implements Parcelable{ public String userName; public String pwd; public int sex; public String name; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeString(userName); dest.writeString(pwd); dest.writeInt(sex); dest.writeString(name); }public static final Parcelable.Creator<User> CREATOR=new Creator<User>() { @Override public User[] newArray(int size) { // TODO Auto-generated method stub return new User[size]; } @Override public User createFromParcel(Parcel source) { // TODO Auto-generated method stub User result=new User(); result.userName=source.readString(); result.pwd=source.readString(); result.sex=source.readInt(); result.name=source.readString(); return result; } }; @Override public String toString() { return "UserBean [userName=" + userName + ", pwd=" + pwd + ", sex=" + sex + ", name=" + name + "]"; }}
// IUserManager.aidl package string.pub.binder; import string.pub.binder.User; interface IUserManager{ boolean register(in User u); boolean login(in User u); boolean modified(in User u); }
//User.aidlpackage string.pub.binder;parcelable User;
//IBinderService.java package string.pub.service; import java.util.ArrayList; import string.pub.binder.IUserManager; import string.pub.binder.User; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; public class IBinderService extends Service { ArrayList<User> listUser=new ArrayList<User>(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return userBinder; } IBinder userBinder=new IUserManager.Stub(){ @Override public boolean register(User u) throws RemoteException { // TODO Auto-generated method stub return listUser.add(u); } @Override public boolean login(User u) throws RemoteException { // TODO Auto-generated method stub for(int i=0;i<listUser.size();i++){ if((listUser.get(i)).userName.equals(u.userName)){ return true; } } return false; } @Override public boolean modified(User u) throws RemoteException { // TODO Auto-generated method stub for(int i=0;i<listUser.size();i++){ User temp=new User(); if((temp=listUser.get(i)).userName.equals(u.userName)){ listUser.remove(temp); listUser.add(u); return true; } } return false; } }; }
//AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="string.pub" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="string.pub.service.IBinderService" android:process=":remote"> <intent-filter > <action android:name="string.pub.action.Binder"/> </intent-filter> </service> </application> </manifest>
实现效果如下所示:
可以看到,实进程间通信功能。
0 0
- [Android]使用AIDL进行进程间通信
- Android Studio中使用AIDL进行进程间通信
- Android studio 使用aidl和service进行进程间通信
- android进程间通信:使用AIDL
- android进程间通信:使用AIDL
- android进程间通信:使用AIDL
- android进程间通信:使用AIDL
- android进程间通信:使用AIDL
- android进程间通信:使用AIDL
- **android进程间通信:使用AIDL .**
- android进程间通信:使用AIDL .
- android进程间通信:使用AIDL
- android 使用AIDL实现进程间通信
- android进程间通信:使用AIDL
- android进程间通信:使用AIDL
- Android-使用AIDL进程间通信
- android进程间通信:使用AIDL
- AIDL在Android进程间通信使用
- 队列中的Queue与Deque
- 安卓中进行基于Http协议的网络访问基础总结-1
- bzoj2152 聪聪可可
- POJ 1080 DP
- Java中线程同步锁和互斥锁(锁机制)-多线程编程
- [Android]使用AIDL进行进程间通信
- GridView-网格布局案例
- The Definitive Antlr 4 第5章学习笔记
- bzoj1468 Tree
- 初学Java三大框架集成需要掌握的基本配置[Spring,MyBatis,Struts]
- bzoj2599【IOI2011】Race
- javascript跳跃式前进(4) - 对象基础理论
- WEbView打开网页错误
- ActionScript开发细节及注意事项