qidao123.com技术社区-IT企服评测·应用市场

标题: 深入Android架构(从线程到AIDL)_21 IPC的Proxy-Stub计划模式03 [打印本页]

作者: 美食家大橙子    时间: 2025-1-11 19:55
标题: 深入Android架构(从线程到AIDL)_21 IPC的Proxy-Stub计划模式03
目次
3、包裝IBinder接口  -- 使用Proxy-Stub计划模式
EIT造型的双层组合 
4、 谁来写Proxy及Stub类呢?     -- 地头蛇(App开发者)自己写
范例
界说一个新接口: IPlayer
 撰写一个Stub类: PlayerStub
撰写mp3Binder类
撰写mp3RemoteService类


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


EIT造型的双层组合 


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

范例




界说一个新接口: 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. }
复制代码

 
 


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




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4