首页 文章 精选 留言 我的

精选列表

搜索[物理交互],共10005篇文章
优秀的个人博客,低调大师

Android与Js交互之JSBridge的使用

什么是JsBridge JsBridge是js与Native之间进行通信的桥梁。 为什么要使用JsBridge Android4.2以下的addJavascriptInterface存在安全漏洞,虽然在Android4.2之后用@JavascriptInterface代替了addJavascriptInterface但是由于兼容性和安全性问题,基本上我们不会再利用Android系统为我们提供的addJavascriptInterface方法或者@JavascriptInterface注解来实现,所以我们只能另辟蹊径,去寻找既安全,又能实现兼容Android各个版本的方案。 如何使用JsBridge 在Android中我们使用JsBridge开源项目来实现,实现JSBridge分为以下几个步骤。 步骤一:导入依赖 在项目gradle文件中添加 repositories { ... maven { url "https://jitpack.io" } } 在module的gradle中添加 dependencies { ... implementation 'com.github.lzyzsd:jsbridge:1.0.4' } 步骤二:布局文件中用BridgeWebView代替WebView <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:layout_width="match_parent" android:id="@+id/et" android:layout_height="wrap_content" /> <Button android:layout_width="match_parent" android:text="调用js方法" android:id="@+id/bt" android:layout_height="wrap_content" /> <com.github.lzyzsd.jsbridge.BridgeWebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"> </com.github.lzyzsd.jsbridge.BridgeWebView> </LinearLayout> 步骤三:在Activity中对BridgeWebView进行配置 public class MainActivity extends AppCompatActivity { private EditText et; private Button bt; private BridgeWebView webview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et = (EditText) findViewById(R.id.et); bt = (Button) findViewById(R.id.bt); webview = (BridgeWebView) findViewById(R.id.webview); webview.setDefaultHandler(new DefaultHandler()); webview.setWebChromeClient(new WebChromeClient()); webview.loadUrl("file:///android_asset/test.html"); // 注册监听方法当js中调用callHandler方法时会调用此方法(handlerName必须和js中相同) webview.registerHandler("submitFromWeb", new BridgeHandler() { @Override public void handler(String data, CallBackFunction function) { Log.e("TAG", "js返回:" + data); //显示js传递给Android的消息 Toast.makeText(MainActivity.this, "js返回:" + data, Toast.LENGTH_LONG).show(); //Android返回给JS的消息 function.onCallBack("我是js调用Android返回数据:" + et.getText().toString()); } }); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 调用js中的方法(必须和js中的handlerName想同) webview.callHandler("functionInJs", "Android调用js66", new CallBackFunction() { @Override public void onCallBack(String data) { Log.e("TAG", "onCallBack:" + data); Toast.makeText(MainActivity.this, data, Toast.LENGTH_LONG).show(); } }); } }); } } 步骤四:编写html文件并对应Activity中的参数 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <!-- Compiled and minified CSS --> <link rel="stylesheet" href="./materialize.min.css"> <!-- Compiled and minified JavaScript --> <script src="./materialize.min.js"></script> <title>Test</title> </head> <body> <div class="input-field col s6"> <input placeholder="请输入数据" id="text1" type="text" class="validate"> </div> <a class="waves-effect waves-light btn" onclick="testClick();">button</a> </body> <script> //js调用Android方法:接收Android传递过来的数据,并做处理 function testClick() { //参数一:调用java中的方法 submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一致 //参数二:返回给Android端的数据,可以为字符串,json等信息 //参数三:js接收到Android传递过来的数据之后的相应处理逻辑 window.WebViewJavascriptBridge.callHandler( 'submitFromWeb' , {'param': "JS成功接收到数据---"} , function(responseData) { alert(responseData) } ); } //JS注册事件监听 function connectWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBridge) { callback(WebViewJavascriptBridge) } else { document.addEventListener( 'WebViewJavascriptBridgeReady' , function() { callback(WebViewJavascriptBridge) }, false ); } } //注册回调函数,第一次连接时调用 初始化函数 connectWebViewJavascriptBridge(function(bridge) { //初始化 bridge.init(function(message, responseCallback) { var data = { 'Javascript Responds': 'Wee!' }; alert("jasdashjd"); responseCallback(data); }); //Android调用js方法:functionInJs方法名称需要保持一致 ,并返回给Android通知 bridge.registerHandler("functionInJs", function(data, responseCallback) { alert(data); var data2 = document.getElementById("text1").value; var responseData = "我是Android调用js方法返回的数据---"+ data2; responseCallback(responseData); }); }) </script> </html> 步骤五:将html文件放入assets文件夹中 效果展示: 补充: jsbridge调用默认的方法 ●Activity代码 // 重写handler方法接收js的消息 webview.setDefaultHandler(new DefaultHandler(){ @Override public void handler(String data, CallBackFunction function) { Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); function.onCallBack("Android收到了默认的消息"); } }); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 发送信息给js,此处不需要配置handlerName webview.send(et.getText().toString().trim(), new CallBackFunction() { @Override public void onCallBack(String data) { // 接收js的回调数据 Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); } }); } }); ●html代码 //初始化 bridge.init(function(message, responseCallback) { var data = { 'Javascript Responds': 'Wee!' }; //添加代码用来弹出Activity发送的默认消息 alert(message); responseCallback(data); }); // 加入如下方法用于发送消息给Activity function testClick2() { var data2 = document.getElementById("text1").value; //参数一:调用java中的方法 submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一致 //参数二:返回给Android端的数据,可以为字符串,json等信息 //参数三:js接收到Android传递过来的数据之后的相应处理逻辑 window.WebViewJavascriptBridge.send( data2, function(responseData){ //java中DefaultHandler所实现的方法中callback所定义的入参 alert(responseData); } ); } 案例源码

优秀的个人博客,低调大师

Python(Django)项目与Apache的管理交互

(开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python)、Apache、Wsgi(必须文件) 首先需要电脑有Python基础下并且安装好Django的环境,下载Apache文件和Wsgi文件。 如果两个文件都未能成功下载,可加QQ群607021567,直接找我要! 接下来开始操作两个文件夹。 (一)Apache文件夹: 1、将下载好的mod_wsgi.so文件放入 apache/modules文件夹下。 2、编辑文件 conf/httpd.conf文件(记事本方式),下载好的这个文件内的所有有关路径指向的都是C盘,所以都修改为你apache文件所放到的文件夹下,基本只修改盘符! 3、在同上文件夹下有一个extra的文件夹,在文件夹下编辑httpd-vhosts.conf文件(记事本方式) httpd-vhosts.conf文件——是控制端口的文件,所有访问的地址需要都是与该文件相配合,包括项目中的静态文件同样是该文件控制 NameVirtualHost *:80——端口号 添加: <VirtualHost *:80> ServerName local.order.my.com WSGIScriptAlias / E:/***/order/wsgi/order.wsgi <Directory "E:/***/order/wsgi"> Order Deny,Allow Allow from all </Directory> Alias /static/ E:/***/oneic-order/static/ Alias /css/ E:/***/oneic-order/css/ Alias /img/ E:/***/oneic-order/img/ Alias /js/ E:/***/oneic-order/js/ </VirtualHost> //***号是你的项目文件夹 **wsgi的文件名字要和他文件夹的上级名字相同。** 修改完之后,Apache的文件就修改完成了! (二)Python文件: 1、在你的电脑中创建好的Django文件夹下,创建wsgi文件夹,就是我们在httpd-vhosts.conf文件所修改的路径对应创建! 2、在该文件夹下创建wsgi文件,order.wsgi文件,修改代码: import os, sys sys.path.append('E:/主文件夹') os.environ['DJANGO_SETTINGS_MODULE'] = '项目名字.settings' os.environ['PYTHON_EGG_CACHE']='/tmp/python-eggs' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() 项目名字是settiings.py文件的上级目录。 3、若本机访问apache所分配的地址,需修改计算机文件C:\Windows\System32\drivers\etc\hosts 文件127.0.0.1local.order.oneic.com 所有的文件修改后 ,接下来就是django的基础项目操作!这里已经完成Apache的管理(Django项目)操作。接下来就实现你自己的网站吧! 实现: Welcome to Python world! I have a contract in this world! How about you?

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册