详解androidwebView独立进程通讯方式-创新互联

为什么需要将webView放在独立进程

发展壮大离不开广大客户长期以来的信赖与支持,我们将始终秉承“诚信为本、服务至上”的服务理念,坚持“二合一”的优良服务模式,真诚服务每家企业,认真做好每个细节,不断完善自我,成就企业,实现共赢。行业涉及除甲醛等,在网站建设网络营销推广、WAP手机网站、VI设计、软件开发等项目上具有丰富的设计经验。
  • webView 加载网页的时候可能占用大量内存,导致应用程序OOM。
  • webView 在访问结束的时候可以直接杀死该进程,防止内存泄漏。
  • webView 在崩溃的时候不影响主进程。

webView独立进程需要注意什么

  • 由于进程之间内存是独立的,所以导致了Appcation, 静态类需要在新的进程重新创建。
  • 内存中的数据不共享,需要跨进程通讯。

如何声明一个独立进程

在默认情况下,同一应用的所有组件都在相同的进程中运行。
在Manifest中可以设置各组件 ()的 android:process 属性来指定相应的进程。

跨进程的方式

在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://ybzwz.com/article/ejdeo.html