当前位置: 首页 > news >正文

Webview独立进程并通过AIDL实现数据通信

前言:简单写下,目前代码也很粗糙

思路

步骤

实现独立进程

在AndroidManifest.xml文件中添加process属性就行,如下:

<activity
    android:name=".WebviewActivity"
    android:process=":webview" />
复制代码

创建IWebviewBinder,在主进程中处理JS调用Java的方法

/**
 * 主进程
 */
interface IWebviewBinder {

    /**
     * 处理JS调用Java的方法
     */
    void handleJsFunc(String methodName, String params, IWebviewBinderCallback callback);

}
复制代码

创建IWebviewBinderCallback,在主进程中处理JS调用Java的方法完成之后,在子进程中将数据回调给JS

/**
 * 子进程
 */
interface IWebviewBinderCallback {

    /**
     * 处理JS调用Java的方法之后,将数据回调给JS
     */
    void callJs(String params);

}
复制代码

创建MainRemoteService,创建IBinder对象,并在主进程中实现JS需要调用的Java方法。最后通过回调,在子进程中实现回调

/**
 * 主进程中的Service
 */
public class MainRemoteService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return serviceBinder;
    }

    private IWebviewBinder.Stub serviceBinder = new IWebviewBinder.Stub() {

        @Override
        public void handleJsFunc(String methodName, String params, IWebviewBinderCallback callback) throws RemoteException { //方法执行在子线程中
            new Handler().post(new Runnable() {
                @Override
                public void run() { //在主线程中执行下面代码
                    //操作主进程UI
                    //Toast.makeText(Utils.appContext, "processName = " + Utils.getCurrentProcessName() + ", params = " + params, Toast.LENGTH_SHORT).show();
                    //回调给子进程调用js
                    if (callback != null) {
                        try {
                            callback.callJs("javascript:alert('testJsonCallBack');");
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
        }

    };

}
复制代码

在子进程中绑定MainRemoteService,获得Service中创建的IBinder对象,并在连接成功后loadUrl

bindService(
        new Intent(this, MainRemoteService.class),
        connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //方法执行在主线程中
                iWebviewBinder = IWebviewBinder.Stub.asInterface(iBinder);
                if (webView != null) {
                    webView.loadUrl(url);
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {

            }
        },
        Context.BIND_AUTO_CREATE);
复制代码

使用Service中创建的IBinder对象,并实现回调

jsInterface.setCallback(new JsInterface.JsFuncCallback() {
    @Override
    public void execute(String methodName, String params) {
        if (iWebviewBinder != null) {
            try {
                iWebviewBinder.handleJsFunc(methodName, params, new IWebviewBinderCallback.Stub() {
                    @Override
                    public void callJs(String params) throws RemoteException { //方法执行在子线程中
                        new Handler().post(new Runnable() {
                            @Override
                            public void run() { //在主线程中执行下面代码
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                                    webView.evaluateJavascript(params, null);
                                } else {
                                    webView.loadUrl(params);
                                }
                            }
                        });
                    }
                });
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }
});
复制代码

以上就简单实现了进程间的数据通信,JS调用Java需要这样,但是对于Java调用JS只需要在子进程中实现就行了。

源码-您的Issues是我前进的动力,您的Star是我最大的鼓励,谢谢

WebviewComponent

相关文章:

  • axios执行原理了解一下!
  • MySQL语句执行分析(二)
  • 大数据争论:批处理与流处理的C位之战
  • 汉诺(hanio)塔问题
  • docker 系列 - Docker CheatSheet | Docker 配置与实践清单 (转载)
  • CentOS下rpm指令和yum指令详解
  • 微软产品大升级:Surface Pro 6、Studio 2、Laptop 2 重磅来袭
  • mysql8.0 Authentication plugin 'caching_sha2_password' cannot be loaded
  • PostgreSQL 函数式索引使用注意 - 暨非immutable函数不适合索引的原因
  • 零基础兴趣或者转行学习Python,我们应该如何入门呢?
  • bartender 9.4 错误消息6670 无法链接到数据库的解决办法
  • JVM G1笔记
  • Linux下切换用户出现su: Authentication failure的解决办法
  • [MicroPython]TPYBoard v102 CAN总线通信
  • Java多线程——AQS框架源码阅读
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2017 年终总结 —— 在路上
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java反射-动态类加载和重新加载
  • js递归,无限分级树形折叠菜单
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • text-decoration与color属性
  • vue-cli在webpack的配置文件探究
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从零开始在ubuntu上搭建node开发环境
  • 构建工具 - 收藏集 - 掘金
  • 基于遗传算法的优化问题求解
  • 设计模式走一遍---观察者模式
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ​第20课 在Android Native开发中加入新的C++类
  • (003)SlickEdit Unity的补全
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (四)Controller接口控制器详解(三)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET Core 中的路径问题
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @31省区市高考时间表来了,祝考试成功
  • @RunWith注解作用
  • @SuppressWarnings注解
  • [<事务专题>]
  • [20150321]索引空块的问题.txt
  • [20160807][系统设计的三次迭代]
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [C++]C++基础知识概述
  • [ccc3.0][数字钥匙] UWB配置和使用(二)
  • [codeforces] 25E Test || hash
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [HackMyVM]靶场Boxing
  • [hive小技巧]同一份数据多种处理