2024年最全底层学习---Android-IPC机制(四)Messenger,2024年最新大学生android开发项目实例

最后

感谢您的阅读,在文末给大家准备一个福利。本人从事Android开发已经有十余年,算是一名资深的移动开发架构师了吧。根据我的观察发现,对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

所以在此将我十年载,从萌新小白一步步成长为Android移动开发架构师的学习笔记,从Android四大组件到手写实现一个架构设计,我都有一一的对应笔记为你讲解。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

最后,赠与大家一句诗,共勉!

不驰于空想,不骛于虚声。不忘初心,方得始终。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

public MessengerService() {

}

@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}

}

三、客户端

客户端首先要绑定服务端的 Service,绑定成功后通过 ServiceConnection 对象的 onServiceConnected 方法的参数 IBinder 来构造一个 Messenger 对象,之后通过 Messenger 对象即可向服务端发送消息了

/**

  • 作者:叶应是叶
  • 时间:2018/3/22 20:13
  • 描述:https://github.com/leavesC
    */
    public class MainActivity extends AppCompatActivity {

private static final String TAG = “MainActivity”;

private static final int CODE_MESSAGE = 1;

private Messenger messenger;

private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger = new Messenger(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
messenger = null;
}
};

private EditText et_message;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService();
initView();
}

@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
}

private void bindService() {
Intent intent = new Intent();
intent.setClassName(“com.czy.messenger_server”, “com.czy.messenger_server.MessengerService”);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}

private void initView() {
et_message = findViewById(R.id.et_message);
Button btn_sendMessage = findViewById(R.id.btn_sendMessage);
btn_sendMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (messenger == null) {
return;
}
String content = et_message.getText().toString();
if (TextUtils.isEmpty(content)) {
return;
}
int arg1 = Integer.valueOf(content);
Message message = new Message();
message.what = CODE_MESSAGE;
message.arg1 = arg1;
try {
messenger.send(message);
Log.e(TAG, “消息发送成功”);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}

}

运行结果如下所示

在上面的示例代码中我是用 Message 来承载需要发送的消息的,因为 Messenger 和 Message 都实现了 Parcelable 接口,所以可以跨进程传输。Message 中能用来承载数据的载体有 what、arg1、arg2、obj、Bundle、replyTo。当中,obj 字段在跨进程通信中只能用来承载系统提供的实现了 Parcelable 接口的对象,例如 Bundle 和 Intent。如果承载了非法数据(例如 String),则会发生运行时异常

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、双向通信

以上的例子只是实现了单向通信,还要考虑下如何实现双向通信,即服务端如何向客户端反馈数据?这就需要客户端也需要通过 Handler 创建一个 Messenger 对象,并将该 Messenger 对象通过 Message 的 replyTo 参数传递给服务端,服务端取得该参数就可以回应客户端了

这里就直接修改上述 IPC 流程,将客户端发给服务端的 arg1 参数乘以 2 后再返回给客户端

首先修改服务端代码

private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_MESSAGE: {
Log.e(TAG, “服务端收到了消息:” + msg.arg1 + " " + ((Intent) msg.obj).getAction());
//取得客户端的 Messenger 对象
Messenger messenger = msg.replyTo;
Message message = new Message();
message.what = CODE_MESSAGE;
message.arg1 = 2 * msg.arg1;
try {
messenger.send(message);
Log.e(TAG, “服务端回复消息成功”);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
}
}

为了接收服务端的回复,客户端也需要通过 Handler 创建一个 Messenger 对象,并将该 Messenger 对象通过 Message 的 replyTo 参数传递给服务端

private Messenger replyMessenger;

private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_MESSAGE: {
Log.e(TAG, “客户端收到了服务端回复的消息:” + msg.arg1);
break;
}

文末

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的相关的几十套腾讯、头条、阿里、美团等公司21年的面试专题,其中把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【延伸Android必备知识点】

这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值