文档章节

分享磨砺营马剑威老师讲解Android通信中几种交互方式

磨砺营
 磨砺营
发布于 2016/07/17 10:16
字数 1246
阅读 12
收藏 0

近来我们的Android课程学习到了一个可以完成一个小项目的阶段了。Android的路一步一个脚印,很可观,也很明朗,每一个成品的完善都是我们成功路上的一个鼓励。

    这周我们完成了一个小型音乐播放器的项目,大家也可以自己去写了试试,这个对Android的四大组件应用的可以说是比较到位的。在这里我们更新SeekBar进度的时候,涉及到Activity和Service的交互,今天在这里给大家整理整理。

那么,通信方式这里主要总结出了5中交互方式:广播,Messenger交互(信使交互) Handler, Service中自定义接口交互,AIDL交互。 这里我们给大家主要介绍一下广播和Service中自定义接口交互。

1、广播交互

首先我们在Activity中定义一个广播接收器:

public class PlayerReceiver extends BroadcastReceiver {

@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals( Config.MUSIC_CURRENT)) { currentTime = intent .getIntExtra("currentTime", -1); music_progressBar .setProgress(currentTime); } else if (action.equals( Config.MUSIC_DURATION)) { duration = intent .getIntExtra("duration", -1); music_progressBar.setMax(duration); } }

}

然后在onResume()方法中注册广播,并添加相对应的action

//注册广播 IntentFilter filter = new IntentFilter(); filter.addAction(Config.UPDATE_ACTION); filter.addAction(Config.MUSIC_CURRENT); filter.addAction(Config.MUSIC_DURATION); registerReceiver(playerReceiver, filter);

完成之后,不要忘记在onStop()方法中解除注册哦。 那么这样之后我们在对应的service中发出对应action的broadcast,这边activity中就会执行对应的操作了。如下,我们发送一个进度条最大值的广播:

Intent intent = new Intent(); intent.setAction(Config.MUSIC_DURATION); duration = mediaPlayer.getDuration(); //通过Intent来传递歌曲的总长度 intent.putExtra("duration", duration);
sendBroadcast(intent);

这边一发送这个广播的话,那边Receiver中就会收到对应的action去执行相应的更新操作了。 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用。但缺点也十分明显,发送广播受到系统制约。系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟。同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应 2、 Server中自定义接口交互

这种方式其实就是通过在service中自定义Binder类,然后在Binder中返回一个当前service的实例,在activity中获取到当前service的实例,即可进行操作了。

public class MsgBinder extends Binder {

public PlayService getService(){ return PlayService.this; } }

在activity中首先我们帮顶一下service。

Intent intent = new Intent( this,PlayService.class); intent.setAction( "com.moliying.media.MUSIC_SERVICE"); bindService(intent, conn, Context.BIND_AUTO_CREATE);

绑定过程中需要一个链接对象: //连接后获取service实例 ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected( ComponentName name) { }

@Override public void onServiceConnected( ComponentName name, IBinder service) { //返回一个MsgService对象 playservice = ((PlayService. MsgBinder)service).getService(); } };

在连接对象的onServiceConnected回调方法中,我们可以获取到绑定的service实例。那咱们拿到实例了,对里面数据进行获取不就是so easy了嘛。

优缺点分析:

这种方法简单实用,扩展性强,但其也有一些缺点,比如需要延迟一些再开始获取Server端的数据,从而无法完全实现从零开始同步更新。综其所述,通过自定义接口实现Activity与Service交互的方法还是比较实用的。适用於同进程中通信,不能进行跨进程通信。 3、Messenger交互(信使交互) Handler Messenger翻译过来指的是信使,它引用了一个Handler对象,别人能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message通信,在服务端使用Handler创建一个 Messenger,客户端只要获得这个服务端的Messenger对象就可以与服务端通信了。也就是说我们可以把Messenger当做Client端与Server端的传话筒,这样就可以沟通交流了

优缺点分析:
通过Messenger来实现Activity和Service的交互,稍微深入一点我们就可以知道,其实Messenger也是通过AIDL来实现的。对於前两种实现方式,Messenger方式总体上来讲也是比较容易理解的,这就和平时使用Handler和Thread通信一个道理。 4. AIDL交互 原理: AIDL属于Android的IPC机制,常用于跨进程通信,主要实现原理基于底层Binder机制,区别于Binder的就是他为业务方法提供了一层封装,我们如果是面向业务接口进行编程的话,就选择AIDL。 优缺点分析:
AIDL在Android中是进程间通信常用的方式,可能使用较為复杂,但效率高,扩展性好。同时很多系统服务就是以这种方式完成与应用程序通信的。 本文出自微信公众号mjw-java

© 著作权归作者所有

磨砺营
粉丝 6
博文 80
码字总数 97977
作品 0
昌平
私信 提问
如何编写一个够逼格的标题栏(磨砺营马剑威Android)

然后是代码的实现: public class ToolBarActivity extends AppCompatActivity { 这里设置notitle主题 这里获取toolbar后,对其进行一系列的设置,颜色,字体等等。 这里是设置toolbar右侧的...

磨砺营
2016/08/18
38
0
Android做好项目,再去面试(磨砺营马剑威Android)

【威哥说】磨砺营靠什么比别人优秀?不仅仅是教学靠谱,老师靠谱,更重要的是咱们在磨砺营做的都是真实的商业项目,由磨砺营自主研发的项目,今天我们就来了解一下咱们磨砺营IT教育的实训项目...

磨砺营
2016/09/01
29
0
来吧,我要让你们看到不一样的我!

当一个人不满足现状的时候,就会想着去改变。因为每一个梦想都应该被支持,因为我们不相信注定平庸,因为我们还有更多的事情要去做。 (开班现场,我和小白老师和大家做了分享,听到大家宣誓...

磨砺营
2016/09/27
14
0
Fragment(九)——Fragment与Fragmnet之间的交互

前言 fragment 和 activity 间的交互之前已经讲过了,这篇文章我们来讲讲 Fragment 和 fragment 间传值的问题。 今天的内容有: 概述Fragment与Fragment之间传值的几种方式 Fragment通过bun...

奔跑的佩恩
07/23
0
0
volley浅析(磨砺营马剑威Android)

【威哥说】Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。Volley特别适合数据量不大但是通信频繁的场景。在listView显示图片这方面,使用volley也是比较好的,不必担...

磨砺营
2016/09/02
40
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
5
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
15
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部