详解androidwebView独立进程通讯方式-创新互联
为什么需要将webView放在独立进程

- webView 加载网页的时候可能占用大量内存,导致应用程序OOM。
- webView 在访问结束的时候可以直接杀死该进程,防止内存泄漏。
- webView 在崩溃的时候不影响主进程。
webView独立进程需要注意什么
- 由于进程之间内存是独立的,所以导致了Appcation, 静态类需要在新的进程重新创建。
- 内存中的数据不共享,需要跨进程通讯。
如何声明一个独立进程
在默认情况下,同一应用的所有组件都在相同的进程中运行。
在Manifest中可以设置各组件 (
跨进程的方式
在android当中提供了2种方式实现。
一种是Messenger, 另一种是Aidl.
- Messenger:实现相对简单,将所有请求放到消息队列中,不适合做并发处理,在大多数的场景用Messenger就可以实现了。
- AIDL: 适合并发操作。直接方法调用,结构更清晰。
Messenger
由于Messenger是采用消息队列的方式实现,所有接受和发送的时候都需要Handler协助。
服务端
public class MessengerService extends Service {
public static final int GET_DATA = 1;
public static final int SET_DATA = 2;
Messenger messenger = new Messenger(new ServiceHandler());
Messenger replyMessenger; //向客服端返回信息
public MessengerService() {
}
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
class ServiceHandler extends Handler {
@Override
public void handleMessage(Message msg) {
replyMessenger = msg.replyTo;
switch (msg.what) {
case GET_DATA:
//客服端向服务端请求数据
if (replyMessenger != null) {
Bundle bundle = new Bundle();
bundle.putString("str", CustomData.getInstance().getData());
Message message = Message.obtain(null, 1);
message.setData(bundle);
try {
replyMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
case SET_DATA:
//客服端向服务端请求更新数据
CustomData.getInstance().setData(msg.getData().getString("str"));
break;
}
}
}
}
本文名称:详解androidwebView独立进程通讯方式-创新互联
文章源于:http://www.lzwzjz.cn/article/ejdeo.html


咨询
建站咨询
