Android可以通过Binder的onTrensact方法来完成通信,下面就来简单试下下,还是前面那个根据 序号查询名字的例子:

服务端实现:

/** * Created by Jay on 2015/8/18 0018. */public class IPCService extends Service {    private static final String DESCRIPTOR = "IPCService";    private final String[] names = { "B神", "艹神", "基神", "J神", "翔神" };    private MyBinder mBinder = new MyBinder();    private class MyBinder extends Binder {        @Override        protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {            switch (code) {            case 0x001: {                data.enforceInterface(DESCRIPTOR);                int num = data.readInt();                reply.writeNoException();                reply.writeString(names[num]);                return true;            }            }            return super.onTransact(code, data, reply, flags);        }    }    @Override    public IBinder onBind(Intent intent) {        return mBinder;    }}

可以看到onTransact有四个参数
code , data ,replay , flags

  • code 是一个整形的唯一标识,用于区分执行哪个方法,客户端会传递此参数,告诉服务端执行哪个方法;
  • data客户端传递过来的参数;
  • replay服务器返回回去的值;
  • flags标明是否有返回值,0为有(双向),1为没有(单向)。

客户端实现:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private EditText edit_num;    private Button btn_query;    private TextView txt_result;    private IBinder mIBinder;    private ServiceConnection PersonConnection = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName name) {            mIBinder = null;        }        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            mIBinder = service;        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bindViews();        // 绑定远程Service        Intent service = new Intent("android.intent.action.IPCService");        service.setPackage("com.jay.ipcserver");        bindService(service, PersonConnection, BIND_AUTO_CREATE);        btn_query.setOnClickListener(this);    }    private void bindViews() {        edit_num = (EditText) findViewById(R.id.edit_num);        btn_query = (Button) findViewById(R.id.btn_query);        txt_result = (TextView) findViewById(R.id.txt_result);    }    @Override    public void onClick(View v) {        int num = Integer.parseInt(edit_num.getText().toString());        if (mIBinder == null) {            Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show();        } else {            android.os.Parcel _data = android.os.Parcel.obtain();            android.os.Parcel _reply = android.os.Parcel.obtain();            String _result = null;            try {                _data.writeInterfaceToken("IPCService");                _data.writeInt(num);                mIBinder.transact(0x001, _data, _reply, 0);                _reply.readException();                _result = _reply.readString();                txt_result.setText(_result);                edit_num.setText("");            } catch (RemoteException e) {                e.printStackTrace();            } finally {                _reply.recycle();                _data.recycle();            }        }    }}

更多相关文章

  1. Android中Activity之间访问互传参数
  2. Android仿优酷客户端图片左右滑动(自动滑动)
  3. Flutter 与 Android 相互调用、传递参数
  4. android客户端加密代码
  5. Android中Message参数传递
  6. Android中一个APP启动另一个APP并传递参数
  7. android之sharedpreference读取参数
  8. Android作为CXF客户端调用服务端。
  9. android中软件参数保存

随机推荐

  1. Android(安卓)2.1 中 JNI 层 camera 的应
  2. android软件中自定义设置字体
  3. Android中的MVP模式使用
  4. Android(安卓)View学习示例
  5. 浅入浅出 Android(安卓)安全:第四章 Andro
  6. Android:Looper类,Looper.prepare()和Loope
  7. Android滑动菜单
  8. Jack 服务编译问题 Android(安卓)7.0
  9. Android的BUG(五)- Android跨进程使用Graph
  10. Android基于Ffmpeg 的软编软解的可视对讲