您的位置:首页 > 移动开发 > Android开发

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

2016-07-17 00:00 531 查看
近来我们的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
3ff0

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: