当前位置: 首页 > news >正文

一个外国人做汉字网站手机快速建站

一个外国人做汉字网站,手机快速建站,退役军人事务部网站建设,昆明营销型网站制作设计前言 对于Android来说#xff0c;Binder的重要性怎么说都不为过。不管是我们的四大组件Activity、Service、BroadcastReceiver、ContentProvider#xff0c;还是经常在应用中使用到的各种ServiceManager#xff0c;其背后都是Binder在支撑。然而Binder机制又不是三言两语能够… 前言 对于Android来说Binder的重要性怎么说都不为过。不管是我们的四大组件Activity、Service、BroadcastReceiver、ContentProvider还是经常在应用中使用到的各种ServiceManager其背后都是Binder在支撑。然而Binder机制又不是三言两语能够描述得清楚的因此本文通过对一个简单的AIDL Demo进行分析让读者对Binder有个初步的认识要想深入了解Binder背后的原理可以参考最后的延伸阅读。 Demo 首先我们通过AIDL新建一个跨进程通信的Demo然后在代码中简单分析Binder的运行过程。 Server Module 我们先新建一个提供接口的AIDL服务端module服务端主要提供AddBook和getBookList两个功能其目录如下 p2.png IBookManager.AIDL// IAIDLServer.aidl package com.nancyyihao.aidlserver; import com.nancyyihao.aidlserver.Book;// Declare any non-default types here with import statementsinterface IBookManager {ListBook getBookList();void addBook(in Book book); }Book.javapackage com.nancyyihao.aidlserver;import android.os.Parcel; import android.os.Parcelable;/*** Created by jumper on 2016/9/7.*/ public class Book implements Parcelable {private String bookName;private int bookId;public Book(){}public Book(int bookId, String bookName){this.bookId bookId ;this.bookName bookName ;}public Book(Parcel parcel){bookName parcel.readString();bookId parcel.readInt();}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName bookName;}public int getBookId() {return bookId;}public void setBookId(int bookId) {this.bookId bookId;}Overridepublic int describeContents() {return 0;}Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(bookName);dest.writeInt(bookId);}public static final Parcelable.CreatorBook CREATOR new CreatorBook(){Overridepublic Book createFromParcel(Parcel source) {return new Book(source);}Overridepublic Book[] newArray(int size) {return new Book[size];}}; }Book.AIDLpackage com.nancyyihao.aidlserver; parcelable Book;BookManagerServicepackage com.nancyyihao.aidlserver;import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException;import java.util.List; import java.util.concurrent.CopyOnWriteArrayList;/*** Created by jumper on 2016/9/7.*/ public class BookManagerService extends Service {private static final String TAG BMS;private CopyOnWriteArrayListBook mBookList new CopyOnWriteArrayList();Overridepublic IBinder onBind(Intent intent) {return mBinder;}Overridepublic void onCreate() {super.onCreate();// to distinguish with client module, we set the book id different from client modulemBookList.add(new Book(3,Android));mBookList.add(new Book(4,iOS));}private Binder mBinder new IBookManager.Stub() {Overridepublic ListBook getBookList() throws RemoteException {return mBookList;}Overridepublic void addBook(Book book) throws RemoteException {mBookList.add(book);}} ; }Client Module 把Server module的代码拷贝一份(AIDL包名不能变)然后新建一个MainActivity即可 MainActivitypackage com.nancyyihao.aidlserver;import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.support.v7.app.AppCompatActivity; import android.util.Log;import com.nancyyihao.R;import java.util.List;public class MainActivity extends AppCompatActivity {private static final String TAG MainActivity;private ServiceConnection mConnection new ServiceConnection() {Overridepublic void onServiceConnected(ComponentName name, IBinder service) {IBookManager bookManager IBookManager.Stub.asInterface(service);Log.e(trace, onServiceConnected);try {ListBook bookList bookManager.getBookList();Log.e(TAG, query book list, list type: bookList.getClass().getCanonicalName());Log.e(TAG, query book list: bookList.toString());} catch (Exception e) {e.printStackTrace();}}Overridepublic void onServiceDisconnected(ComponentName name) {}};Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final Intent intent new Intent();intent.setAction(com.nancyyihao.startservice);intent.setPackage(com.nancyyihao.aidlserver); // servers package nameLog.e(trace, bindService);bindService(intent, mConnection, BIND_AUTO_CREATE);}Overrideprotected void onDestroy() {super.onDestroy();unbindService(mConnection);} }分析 把代码写好后build一下就能看到自动生成了一个IBookManager.Java文件 IBookManager.Javap3.png package com.nancyyihao.aidlserver; // Declare any non-default types here with import statementspublic interface IBookManager extends android.os.IInterface {/*** Local-side IPC implementation stub class.*/public static abstract class Stub extends android.os.Binder implements com.nancyyihao.aidlserver.IBookManager {private static final java.lang.String DESCRIPTOR com.nancyyihao.aidlserver.IBookManager; // Binder Indentifierpublic Stub() {this.attachInterface(this, DESCRIPTOR);}/*** Cast an IBinder object into an com.nancyyihao.aidlserver.IBookManager interface,* generating a proxy if needed.*/public static com.nancyyihao.aidlserver.IBookManager asInterface(android.os.IBinder obj) {if ((obj null)) {return null;}android.os.IInterface iin obj.queryLocalInterface(DESCRIPTOR);if (((iin ! null) (iin instanceof com.nancyyihao.aidlserver.IBookManager))) {return ((com.nancyyihao.aidlserver.IBookManager) iin); // local Binder}return new com.nancyyihao.aidlserver.IBookManager.Stub.Proxy(obj); // remote Binder}Overridepublic android.os.IBinder asBinder() {return this;}Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_getBookList: {data.enforceInterface(DESCRIPTOR);java.util.Listcom.nancyyihao.aidlserver.Book _result this.getBookList();reply.writeNoException();reply.writeTypedList(_result);return true;}case TRANSACTION_addBook: {data.enforceInterface(DESCRIPTOR);com.nancyyihao.aidlserver.Book _arg0;if ((0 ! data.readInt())) {_arg0 com.nancyyihao.aidlserver.Book.CREATOR.createFromParcel(data);} else {_arg0 null;}this.addBook(_arg0);reply.writeNoException();return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.nancyyihao.aidlserver.IBookManager {private android.os.IBinder mRemote;Proxy(android.os.IBinder remote) {mRemote remote;}Overridepublic android.os.IBinder asBinder() {return mRemote;}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}Overridepublic java.util.Listcom.nancyyihao.aidlserver.Book getBookList() throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();java.util.Listcom.nancyyihao.aidlserver.Book _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);_reply.readException();_result _reply.createTypedArrayList(com.nancyyihao.aidlserver.Book.CREATOR);} finally {_reply.recycle();_data.recycle();}return _result;}Overridepublic void addBook(com.nancyyihao.aidlserver.Book book) throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);if ((book ! null)) {_data.writeInt(1);book.writeToParcel(_data, 0);} else {_data.writeInt(0);}mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}}static final int TRANSACTION_getBookList (android.os.IBinder.FIRST_CALL_TRANSACTION 0);static final int TRANSACTION_addBook (android.os.IBinder.FIRST_CALL_TRANSACTION 1);}public java.util.Listcom.nancyyihao.aidlserver.Book getBookList() throws android.os.RemoteException;public void addBook(com.nancyyihao.aidlserver.Book book) throws android.os.RemoteException; } Client先调用bindService启动服务会调用BookManagerService的onCreate方法接着调用onBind方法该方法会返回远程的Binder---mBinder该Binder包含getBookList和AddBook两个方法的具体实现。 Overridepublic IBinder onBind(Intent intent) {return mBinder;}private Binder mBinder new IBookManager.Stub() {Overridepublic ListBook getBookList() throws RemoteException {return mBookList;}Overridepublic void addBook(Book book) throws RemoteException {mBookList.add(book);}} ;当Client和server成功建立连接时就会调用Client的onServiceConnected(name, service)方法把远程的mBinder回调给Client此时的service就是远程的mBinder对象 private ServiceConnection mConnection new ServiceConnection() {Overridepublic void onServiceConnected(ComponentName name, IBinder service) {IBookManager bookManager IBookManager.Stub.asInterface(service);Log.e(trace, onServiceConnected);try {ListBook bookList bookManager.getBookList();} catch (Exception e) {e.printStackTrace();}}Client端通过asInterface方法把mBinder转成AIDL接口如果是本进程内的Binder就直接返回否则返回内部代理类proxy public static com.nancyyihao.aidlserver.IBookManager asInterface(android.os.IBinder obj) {if ((obj null)) {return null;}android.os.IInterface iin obj.queryLocalInterface(DESCRIPTOR);if (((iin ! null) (iin instanceof com.nancyyihao.aidlserver.IBookManager))) {return ((com.nancyyihao.aidlserver.IBookManager) iin); // local Binder}return new com.nancyyihao.aidlserver.IBookManager.Stub.Proxy(obj); // remote Binder}接着执行 try {ListBook bookList bookManager.getBookList();} catch (Exception e) {e.printStackTrace();}此时的bookManager通过asInterface方法转换后返回的实际上是本地的proxy类 private static class Proxy implements com.nancyyihao.aidlserver.IBookManager {private android.os.IBinder mRemote;Proxy(android.os.IBinder remote) {mRemote remote;}Overridepublic android.os.IBinder asBinder() {return mRemote;}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}Overridepublic java.util.Listcom.nancyyihao.aidlserver.Book getBookList() throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();java.util.Listcom.nancyyihao.aidlserver.Book _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);_reply.readException();_result _reply.createTypedArrayList(com.nancyyihao.aidlserver.Book.CREATOR);} finally {_reply.recycle();_data.recycle();}return _result;}Overridepublic void addBook(com.nancyyihao.aidlserver.Book book) throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);if ((book ! null)) {_data.writeInt(1);book.writeToParcel(_data, 0);} else {_data.writeInt(0);}mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}}static final int TRANSACTION_getBookList (android.os.IBinder.FIRST_CALL_TRANSACTION 0);static final int TRANSACTION_addBook (android.os.IBinder.FIRST_CALL_TRANSACTION 1);}通过代码我们可以看到proxy类其实也是一个IBookManager接口调用bookManager.getBookList()其实是调用Proxy.getBookList。 Overridepublic java.util.Listcom.nancyyihao.aidlserver.Book getBookList() throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();java.util.Listcom.nancyyihao.aidlserver.Book _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);_reply.readException();_result _reply.createTypedArrayList(com.nancyyihao.aidlserver.Book.CREATOR);} finally {_reply.recycle();_data.recycle();}return _result;}在Proxy.getBookList方法中调用了mRemote.trasact() public final boolean transact(int code, Parcel data, Parcel reply,int flags) throws RemoteException {if (false) Log.v(Binder, Transact: code to this);if (data ! null) {data.setDataPosition(0);}boolean r onTransact(code, data, reply, flags);if (reply ! null) {reply.setDataPosition(0);}return r;}Client就是在这里和Server进行远程通信的把需要的参数放data中服务端执行完后把接口写到result里。从代码中可以看到transact方法中调用了onTransact方法。我们再看看onTransact方法有啥东西。 Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {......case TRANSACTION_getBookList: {data.enforceInterface(DESCRIPTOR);java.util.Listcom.nancyyihao.aidlserver.Book _result this.getBookList();reply.writeNoException();reply.writeTypedList(_result);return true;}......}直接调用了this.getBookList方法返回结果这个this到底是哪个对象前面提到mRemote其实是远程中的Binder对象其代码如下 private Binder mBinder new IBookManager.Stub() {Overridepublic ListBook getBookList() throws RemoteException {return mBookList;}Overridepublic void addBook(Book book) throws RemoteException {mBookList.add(book);}} ;this.getBookList其实就是mRemote.getBookList就是上面代码中的mBinder.getBookList然后把返回结果放到result中即可。至此整个通信过程分析完毕。 总结 Client是通过本地的Proxy类像Server发起通信Client通过ServerConnection接口回调收到Server远程Binder对象IPC过程发生在transact方法中该方法会挂起直到服务端返回结果因此不能在主线程调用远程服务。p1.jpg 图片和文中Demo来自《Android开发技术探索》 源码下载 Android-AIDL-Demo延伸阅读 Binder学习指南Android Bander设计与实现 - 设计篇Android进程间通信IPC机制Binder简要介绍和学习计划 转载于:https://www.cnblogs.com/jasonkent27/p/5860680.html
http://www.zqtcl.cn/news/52129/

相关文章:

  • 赣州网站推广地和网站建设
  • 响应网官方网站怎么创建一个html网页
  • 网站开发员的工作内容wordpress授权登录
  • 韶关网站建设公司怎么在阿里云上做网站
  • 个人网站创建与管理360建筑网一级消防
  • 南通网站建设哪家好wordpress中文官网
  • 网站建设优化公司seo数据优化
  • 新乡建网站网站建设哪里最好接单子
  • 企业为何选择网站推广外包?石家庄模板建站代理
  • 网站建设卖给别人可以吗推广竞价
  • 广州哪家做网站价格好义乌网红村
  • 网牛网站建设生物科技公司网站模板下载
  • 网站页面的宽度直播带货系统
  • 凡科网站建设好成都智能建站模板
  • 网站开发详细介绍上海企业建站公司哪家好
  • 推荐一些外国做产品网站毕业室内设计代做网站
  • 国内网页做的好看的网站布吉做棋牌网站建设哪家便宜
  • 创新的成都 网站建设wordpress主题机制
  • 网站开发接单辽宁建设工程信息网上传招标文件方法
  • 企业宣传网站建设说明书佛山网站建设定制
  • 网站模板制作教程视频网站规划的缩略图
  • 怎样维护自己的网站昆明新闻头条最新消息
  • 南京做网站需要多少钱网站建站销售怎么做
  • 石家庄建设银行河北分行招聘网站北京信息化
  • 网站被黑了申请注册一个自媒体平台账号
  • 番禺手机网站制作推广新闻军事最新消息
  • 30个成功的电子商务网站设计硬件开发需求
  • 免费网站后台管理系统html甘肃省建设部网站首页
  • 做网站的公司现在还 赚钱吗视频网站如何做微信营销
  • wordpress整站下载wordpress主题手动安装