详解androidwebView独立进程通讯方式-创新互联
为什么需要将webView放在独立进程
发展壮大离不开广大客户长期以来的信赖与支持,我们将始终秉承“诚信为本、服务至上”的服务理念,坚持“二合一”的优良服务模式,真诚服务每家企业,认真做好每个细节,不断完善自我,成就企业,实现共赢。行业涉及除甲醛等,在网站建设、网络营销推广、WAP手机网站、VI设计、软件开发等项目上具有丰富的设计经验。- 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://scyanting.com/article/ejdeo.html