@Override
public UserInfoBean getInfo(String name) {
return map.get(name);
}
}
;
}
@Override
public void onCreate() {
super.onCreate();
Log.e("MyService", "onCreate: success");
}
}
**`客户端`核心代码 :**
public class ClientActivity extends AppCompatActivity {
private TextView resultView;
private String TAG = “clientLog”;
private int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
resultView = findViewById(R.id.resultView);
findViewById(R.id.connect).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bindService();
}
}
);
findViewById(R.id.disconnect).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
unbindService(connection);
resultView.setText(“尝试释放”);
}
catch (IllegalArgumentException e) {
resultView.setText(“已经释放了”);
}
}
}
);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (iUserInfo != null) {
try {
((Button) v).setText(“查找name为:name” + ((i++) + 1) + “的UserInfoBean”);
UserInfoBean bean = iUserInfo.getInfo(“name” + i);
if (bean != null)
resultView.setText(bean.toString()); else
resultView.setText(“没找到呀”);
}
catch (RemoteException e) {
e.printStackTrace();
}
} else {
resultView.setText(“没有连接上service”);
}
}
}
);
}
//作为IPC的客户端,我们需要 建立起和Service的连接
private IUserInfo iUserInfo;
//操作句柄,可以通过它向service发送数据
private void bindService() {
if (iUserInfo == null) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(
“study.hank.com.aidl_service”,
“study.hank.com.aidl_service.MyService”));
bindService(intent, connection, Context.BIND_AUTO_CREATE);
resultView.setText(“尝试连接”);
} else {
resultView.setText(“已经连接上service” + iUserInfo);
}
}
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iUserInfo = IUserInfo.Stub.asInterface(service);
resultView.setText(“连接成功”);
Log.d(TAG, “connection:” + “连接成功”);
}
@Override
public void onServiceDisconnected(ComponentName name) {
iUserInfo = null;
resultView.setText(“连接 已经断开”);
Log.d(TAG, “connection:” + “已经断开”);
}
}
;
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}
很容易发现,服务端的代码量尚可,不是很复杂,但是客户端这边,要处理 `connection`,要手动去绑定以及解绑 `Service`,所有参与通信的 `javabean`还必须实现序列化接口 `parcelable Demo`中只有一个客户端,还不是很明显,但是如果有 `N`个客户端 `Activity`都需要与 `service`发生通信,意味着每一个 `Activity`都必须写类似的代码. 不但 `累赘`,而且 `丑陋`.
##### **前方高能**
**不使用RPC框架时,CS两端的代码的结构,已经有了大致的印象,下面是** **`使用IPC框架时` 客户端、服务端 的核心代码**
##### **客户端**
![](https://img-blog.csdnimg.cn/img_convert/ee0a34a04583c0917b7dd1eb334cf1f4.png)
> 之前的 `bindService`呢?没了。客户端使用此框架来进行 进程通信,不用去关心 `AIDL`怎么写了,不用关注 `bindService,ServiceConnection`,省了很多事。
##### **服务端**
![](https://img-blog.csdnimg.cn/img_convert/3f11f52a31a82c70c7def6b6572c21e4.png)
##### **对比 使用框架前后,我们的核心代码的变化**
> **有什么变化?显而易见,极大缩减了 `客户端`的编码量,而且,一劳永逸,除非需求大改,不然这个框架,一次编写,终身使用。除此之外,使用框架还可以极大地节省 `客户端`代码量,减少人为编码时产生的可能疏漏(比如忘记释放连接造成泄漏等). 试想一下,如果你是一个团队 `leader`,团队成员的水平很有可能 `参差不齐`,那么如何保证项目开发中 `出错概率最小` ------- `使用框架`, 用框架来简化团队成员的 `编码量`和 `编码难度`,让他们 `傻瓜式`地写代码.**
## **三、Demo展示**
**github地址**:https://github.com/18598925736/MyRpc
![](https://img-blog.csdnimg.cn/img_convert/2f112eba2d29611b153781380c32e70c.gif)
> 以上Demo,模拟的场景是:
>
> **服务端**:开启一个 `登录服务`,启动服务之后,保存一个 `可以登录`的用户名和密码
>
> **客户端1**:`RPC`调用 `登录服务`,用户名和密码 和服务端的 `一样`,可以登录成功
>
> **客户端2**:`RPC`调用 `登录服务`,用户名和密码 和服务端的 `不一样`,登录失败
##### `Demo`**工程代码结构图**
![](https://img-blog.csdnimg.cn/img_convert/0262dd9a814a3c8289918f7ae01a3067.png)
![](https://img-blog.csdnimg.cn/img_convert/11e44f7064203426f77a7a2d72e88e77.png)
![](https://img-blog.csdnimg.cn/img_convert/66e513b113453ca65610cf89b505c7f2.png)
**注**:**客户端和服务端必须同时依赖框架层module** **`implementation project(":ipc")`**
(未完待续......)
# **学习分享,共勉**
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,**囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!**
> **资料都是免费提供的,整理不易,有需要的朋友可以转发分享下,同时可以关注我,定期分享学习资源还会更新一些技术分享!**
**[资料免费领取:点击这里即可免费获取!](https://gitee.com/vip204888/java-p7)**
**整理不易,有需要的朋友转发支持下,感谢感谢!**
**Java核心知识体系笔记.pdf**
![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/1c2829bb4fa84c1ef8a491819b0cbae5.png)
**中高级Java开发面试高频考点题笔记300道.pdf**
![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/56448f56233178ca7d21ed882241abf3.png)
**架构进阶面试专题及架构学习笔记脑图**
![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/8bb586e7340b8150568aae912dbbcbb9.png)
**Java架构进阶学习视频分享**
![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/f070c132982b4d1ca8a5523fc821203c.png)
[外链图片转存中...(img-I8dsKt9k-1628289483323)]
**架构进阶面试专题及架构学习笔记脑图**
[外链图片转存中...(img-4QvkSFDx-1628289483323)]
**Java架构进阶学习视频分享**
[外链图片转存中...(img-0ljHRIr9-1628289483324)]