栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android跨进程通信,rxjava面试题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android跨进程通信,rxjava面试题

  • StreamSocket:基于TCP协议的封装,以流的方式提供数据交互服务,提供了稳定的双向通信,通过“三次握手”建立连接,传输数据具有较高的稳定性。
    Java中客户端使用Socket类,服务器端使用ServerSocket类。
  • DatagramSocket:基于UDP协议的封装,以数据报文的方式提供数据交互服务,提供了不稳定的单向通信,具有更好的执行效率,由于基于无连接的方式,传输数据不稳定,不保证数据的完整性。
    Java中使用DatagramPacket类,表示数据报包;DatagramSocket类,进行端到端通信。
Messager

底层也是通过封装AIDL来实现的,所以使用的方式和AIDL基本类似。

1.在服务端进程Service中创建Messenger对象,用来接收客户端发来的Message数据,和获取客户端Messenger对象,并给客户端发Message数据。
2.创建客户端Messenger对象,用来接收服务端数据。
3.客户端绑定服务端服务,并获取服务端Messenger对象,用来给服务端发Message数据。
4.通过服务端Messenger发消息,将客户端Messenger对象,添加到Message.replyTo。

public class MsgerService extends Service {
private Messenger mServerMessenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);

// 接收客户端发过来的消息
switch (msg.what) {
case 1000:

Toast.makeText(getbaseContext(), “” + msg.arg1, Toast.LENGTH_SHORT).show();

Message cMsg = Message.obtain();
cMsg.what = msg.what;
Bundle bundle = new Bundle();
bundle.putString(“name”, “Jim”);
cMsg.obj = bundle;

// 获取客户端的Messenger对象,需要客户端在发送消息时设置
Messenger cMsger = msg.replyTo;
try {
// 给客户端发送消息
cMsger.send(cMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
});
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mServerMessenger.getBinder();
}
}

public class ClientActivity extends Activity {
private TextView mNameTxt;


private Messenger mClientMessenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1000:
// 接收服务端数据
Bundle bundle = (Bundle) msg.obj;
mNameTxt.setText(bundle.getString(“name”));
break;
}
}
});


private Messenger mServerMessenger;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 获取服务端Messenger对象
mServerMessenger = new Messenger(service);
}

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

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_common);

mNameTxt = (TextView) findViewById(R.id.name);

// 绑定远端服务
Intent intent = new Intent(this, MsgerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE);

findViewById(R.id.bind).setonClickListener(new View.onClickListener() {
@Override
public void onClick(View v) {

int number = (int) (Math.random() * 100);
Message msg = Message.obtain();
msg.what = 1000;
msg.arg1 = number;
msg.replyTo = mClientMessenger;

// 给服务端发送消息
if (mServer

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

开源分享完整内容戳这里

Messenger != null) {
try {
mServerMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
}

AIDL

AIDL(Android Interface Definition Language)指的就是接口定义语言,通过它可以让客户端与服务端在进程间使用共同认可的编程接口来进行通信AIDL使用的步骤相对较多,主要总结为三个基本步骤:

  • 创建AIDL接口

  • 根据AIDL创建远程Service服务

  • 绑定远程Service服务

(1)创建AIDL接口
定义aidl接口文件
在Android Studio中已经集成好了这个文件的创建方式,直接右击工程,点击New -> AIDL -> AIDL File,然后输入接口的名称就好,将会在src/main目录下创建一个与java目录平级,且里面的包名与java目录里的包名一致,后缀为.aidl的文件

// Declare any non-default types here with import statements

interface IMyAidlTest {

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}

上面这个文件是Android Studio自动创建的模版文件,里面的basicTypes方法不需要使用到可以删掉。
AIDL对数据类型的支持包括Java中的所有基本数据类型,还有String、CharSequence、List、Map。

自定义AIDL的数据类型

在AIDL提供的默认数据类型无法满足需求的情况下,就需要自定义数据类型了,比如我们有个Product类,需要用来传递数据,那么这个类必须要实现Parcelable接口,并在AIDL中新建一个相同类名的aidl文件进行声明,并且这个aidl文件所在的路径必须要和java文件里的实体类路径保持一致,如以下文件Product.aidl

package demo.csdn.zhuwentao.bean;

parcelable Product;

然后在IMyAidlTest.aidl中使用import导入进来,除了AIDL默认支持的数据类型外,其它自定义的类型都需要通过此方法导入进来,包名路径需要精确到类名。

interface IMyAidlTest {
void addProduct(in Product person);
List getProductList();
}

这里的方法只作为接口声明的作用,以上定义的接口最终会在Service服务里实现具体的操作逻辑。

根据aidl文件生成java接口文件

这个步骤Android Studio已经帮我们集成好了,只需要点击 Build -> Make Project,或者点击AS上的那个小锤子图标就可以,构建完后将会自动根据我们定义的IMyAidlTest.aidl文件生成IMyAidlTest.java接口类,可以在build/generated/source/aidl/debug/路径下找到这个类。

(2)根据AIDL创建远程Service服务

上一步中创建好的IMyAidlTest.java接口文件,需要使用Service来进行绑定,这里就需要我们新建一个Service服务。


public class MyAidlService extends Service {

private List mProducts;
public MyAidlService() {
}

private IBinder mIBinder = new IMyAidlTest.Stub() {

@Override
public void addProduct(Product product) throws RemoteException {
mProducts.add(product);
}

@Override
public List getProductList() throws RemoteException {
return mProducts;
}
};

@Nullable
@Override
public IBinder onBind(Intent intent) {
mProducts = new ArrayList<>();
return mIBinder;
}
}

mIBinder对象实例化了IMyAidlTest.Stub,并在回调接口中实现了最终的处理逻辑
当与客户端绑定时,会触发onBind()方法,并返回一个Binder对象给客户端使用,客户端就可以通过这个类调用服务里实现好的接口方法
记得要在配置文件中加入声明,并使用android:process属性指定其运行在新的进程中。

配置好以上步骤后,跨进程通信的服务端就配置好了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531890.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号