深入Android架构(从线程到AIDL)_21 IPC的Proxy-Stub计划模式03 ...

打印 上一主题 下一主题

主题 1045|帖子 1045|积分 3135

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
3、包裝IBinder接口  -- 使用Proxy-Stub计划模式
EIT造型的双层组合 
4、 谁来写Proxy及Stub类呢?     -- 地头蛇(App开发者)自己写
范例
界说一个新接口: IPlayer
 撰写一个Stub类: PlayerStub
撰写mp3Binder类
撰写mp3RemoteService类


3、包裝IBinder接口  -- 使用Proxy-Stub计划模式



  • 采用Proxy-Stub计划模式将IBinder接口包装起来,让App与IBinder接口不再产生高度相依性。

  • 其将IBinder接口包装起来,转换出更好用的新接口:

  • Proxy类提供较好用的IA接口给Client使用。
  • Stub类别则是屏蔽了Binder基类的onTransact()函数,然后将IA接口里的f1()和f2()函数界说为抽象函数。于是简化了App开发的负担:

EIT造型的双层组合 


4、 谁来写Proxy及Stub类呢?     -- 地头蛇(App开发者)自己写

范例



  • 兹写一个App范例, 程序实行时出现画面如下:



  • 在这个范例里,界说了一个IPlayer接口,然后规划了PlayerProxy和PlayerStub两的类,如下图:

界说一个新接口: IPlayer

  1. // IPlayer.java
  2. package com.misoo.pkgx;
  3. public interface IPlayer {
  4.     void play();
  5.     void stop();
  6.     String getStatus();
  7. }
复制代码
 撰写一个Stub类: PlayerStub

  1. // PlayerStub.java
  2. package com.misoo.pkgx;
  3. import android.os.Binder;
  4. import android.os.Parcel;
  5. public abstract class PlayerStub extends Binder implements IPlayer{
  6.     @Override
  7.     public boolean onTransact(int code, Parcel data,Parcel reply, int flags) throws android.os.RemoteException {
  8.         reply.writeString(data.readString()+ " mp3");
  9.         if(code == 1) this.play();
  10.         else if(code == 2) this.stop();
  11.         return true;
  12.     }
  13.     public abstract void play();
  14.     public abstract void stop();
  15.     public abstract String getStatus();
  16. }
复制代码
撰写一个Proxy类: PlayerProxy
  1. // PlayProxy.java
  2. private class PlayerProxy implements IPlayer{
  3.     private IBinder ib;
  4.     private String mStatus;
  5.     PlayerProxy(IBinder ibinder)
  6.          { ib = ibinder; }
  7.     public void play(){
  8.         Parcel data = Parcel.obtain();
  9.         Parcel reply = Parcel.obtain();
  10.         data.writeString("playing");
  11.         try { ib.transact(1, data, reply, 0);
  12.             mStatus = reply.readString();
  13.         } catch (Exception e) { e.printStackTrace(); }
  14.     }
  15.     public void stop(){
  16.         Parcel data = Parcel.obtain();
  17.         Parcel reply = Parcel.obtain();
  18.         data.writeString("stop");
  19.         try { ib.transact(2, data, reply, 0);
  20.             mStatus = reply.readString();
  21.         } catch (Exception e) { e.printStackTrace(); }
  22.     }
  23.     public String getStatus() { return mStatus; }
  24. }
复制代码
APP的代码
撰写mp3Binder类
 


  1. // mp3Binder.java
  2. // ……..
  3. public class mp3Binder extends PlayerStub{
  4.     private MediaPlayer mPlayer = null;
  5.     private Context ctx;
  6.     public mp3Binder(Context cx){ ctx= cx; }
  7.     public void play(){
  8.         if(mPlayer != null) return;
  9.         mPlayer = MediaPlayer.create(ctx, R.raw.test_cbr);
  10.         try { mPlayer.start();
  11.         } catch (Exception e) {
  12.             Log.e("StartPlay", "error: " + e.getMessage(), e); }}
  13.     public void stop(){
  14.         if (mPlayer != null)
  15.             { mPlayer.stop(); mPlayer.release(); mPlayer = null; }
  16.     }
  17.     public String getStatus() { return null; }
  18. }
复制代码
撰写mp3RemoteService类
 


  1. // mp3RemoteService.java
  2. package com.misoo.pkgx;
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.IBinder;
  6. public class mp3RemoteService extends Service {
  7.     private IBinder mBinder = null;
  8.     @Override public void onCreate() {
  9.         mBinder = new mp3Binder(getApplicationContext());
  10.     }
  11.     @Override
  12.     public IBinder onBind(Intent intent) { return mBinder; }
  13. }
  14. // ac01.java
  15. // ………
  16. public class ac01 extends Activity implements OnClickListener {
  17.     //……….
  18.     private PlayerProxy pProxy = null;
  19.     public void onCreate(Bundle icicle) {
  20.         // ………
  21.         startService(new Intent("com.misoo.pkgx.REMOTE_SERVICE"));
  22.         bindService(new Intent("com.misoo.pkgx.REMOTE_SERVICE"),
  23.         mConnection, Context.BIND_AUTO_CREATE); }
  24.         private ServiceConnection mConnection = new ServiceConnection() {
  25.             public void onServiceConnected(ComponentName className,IBinder ibinder)
  26.                 { pProxy = new PlayerProxy(ibinder); }
  27.             public void onServiceDisconnected(ComponentName classNa){}
  28.         };
  29.     public void onClick(View v) {
  30.         switch (v.getId()) {
  31.             case 101: pProxy.play(); tv.setText(pProxy.getStatus());
  32.                 break;
  33.             case 102: pProxy.stop(); tv.setText(pProxy.getStatus());
  34.                 break;
  35.             case 103:
  36.                 unbindService(mConnection);
  37.                 stopService(new Intent("com.misoo.pkgx.REMOTE_SERVICE"));
  38.                 finish(); break;
  39.         }
  40.     }
  41. }
复制代码


  • PlayerStub类将onTransact()函数潜伏起来,提供一个更具有美感、更密切的新接口给mp3Binder类使用。
  • 潜伏了onTransact()函数之后,mp3Binder类的开发者就不必费心去相识onTransact()函数了。于是, PlayerProxy与PlayerStub两个类遥遥相对,并且将IPC细节知识(例如transact()和onTransact()函数之参数等)包夹起来。
 
 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表