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. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. Python技巧匿名函数、回调函数和高阶函数
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)中数据库查询方法 query() 中的 select
  5. android中SqLite query中用selectionArgs处理字符传值
  6. android web services6
  7. 解决Android编辑框在全屏模式下无法检测布局变化的问题
  8. 如何去除launcher 上默认的 google search bar.
  9. Android中Activity之间访问互传参数

随机推荐

  1. Android安卓 PopupWindow工具类
  2. 站在大神的肩膀上 - 简述Android应用启动
  3. HelloWorld及Android项目结构介绍-JavaGG
  4. Zipalign:一个简单的优化
  5. 在Android设备上搭建Web服务器的方法
  6. Android升级联盟再次失败
  7. Android(安卓)Web应用高级编程
  8. Android中的矩阵(Matrix)变换
  9. Android 4.0硬件加速及绘制技巧
  10. 详解 Android 是如何启动的