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

近来我们的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实例。那咱们拿到实例了,对里面数据进行获取不就是soeasy了嘛。

优缺点分析:

这种方法简单实用,扩展性强,但其也有一些缺点,比如需要延迟一些再开始获取Server端的数据,从而无法完全实现从零开始同步更新。综其所述,通过自定义接口实现Activity与Service交互的方法还是比较实用的。适用於同进程中通信,不能进行跨进程通信。

3、Messenger交互(信使交互) Handler

Messenger翻译过来指的是信使,它引用了一个Handler对象,别人能够向它发送消息(使用mMessenger.send(Messagemsg)方法)。该类允许跨进程间基于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

你可能感兴趣的:(分享磨砺营马剑威老师讲解Android通信中的几种交互方式)