安卓原生与JS交互的四种方式详解Python编写安卓APP可行性如何?

安卓原生和js交互的4种方式 java和js交互 安卓JsBridge原理解析 用 Python 写一个安卓 APP

本文目录:

JsBridge:安卓和javascript最流行的交互方式,有以下4种方式可以实现交互传值

  • 1,addJavascriptInterface:针对Android 4.2(API 17)及以上,只有标有@JavascriptInterface注解的public方法才能从js调用。而对targetSdkVersion为API Level 16及以下的app,js可以调用Java所有的public方法。
  • 通过public void addJavascriptInterface (Object object, String name)方法把对象传递给js,
  • 2, loadUrl:可以实现安卓调用js,通过webview.loadUrl("javascript:jsMethod()");字符串里的javascript: 是固定写法,后面的jsMethod可以替换成你js代码里的方法。也可以通过"javascript:jsMethod(" jsonParams ")";传递数据给js。这个缺点:如果js方法返回数据,这里会发生重定向。解决办法是用evaluateJavascript
  • 3,evaluateJavascript:安卓4.4以后可以实现安卓调用js,安卓可以传数据给js,并且可以获取js方法的返回值。
  • 缺点:必须大于api19(4.4)才可以使用
  • 4,shouldOverrideUrlLoading:通过这个方法拦截url,并解析url携带的参数,如:qiushi://setH5Info?params={"title":"商品详情"}
js调用安卓
  • webView.addJavascriptInterface()
  • WebViewClient.shouldOverrideUrlLoading()
安卓调用js
  • webView.loadUrl();
  • webView.evaluateJavascript()
下面我门结合代码具体讲解下这4中方式的具体代码实现
  • 首先我们要在androidstudio的assets文件夹下面定义下面html。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Untitled Document</title></head><body><div ></div><script type="text/javascript">function getAndroidValue(){ document.getElementById("div").innerHTML=window.androidObject.androidMethod();}</script></body>

在js里我们使用window.androidObject.androidMethod();调用安卓的方法,进而获取到安卓传递过来的数据。

如下图

手机运行效果

log日志

同时看日志,我们能看到js成功的调用了安卓的方法,并获取到了安卓native传递过来的数据。

@JavascriptInterface public String androidMethod() { Log.i("qcl0228", "js调用了安卓的方法"); return "我是js调用安卓获取的数据"; }
二,shouldOverrideUrlLoading 实现js调用安卓

js通过重定向出发安卓拦截,重定向的url被shouldoverrideurlloading拦截到。分发拦截到的信息指挥安卓做事情。

简单的重定向的代码如下

<div ></div><script type="text/javascript">function jsMethod(jsonParams){ document.getElementById("div").style.backgroundColor='red'; document.getElementById("div").innerHTML=jsonParams; //return '987654321';//如果返回数据,会重定向}</script>

运行结果如下

运行结果

可以看到我们把数据jsonParams传递给了js并显示在了h5页面上。

上js代码里的 //return '987654321';注释如果解开,会发生请求重定向的问题,如下图

这里不能通过安卓调用js代码获取js数据,那该怎么办呢,下面的方法正好可以弥补这个缺陷。

四,evaluateJavascript:安卓调用js
  • 必须大于api19(4.4)才可以使用
  • 可以实现安卓和js的双向传递数据
  • 安卓端的代码如下

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { String jsonParams = "123456"; //String method = "jsMethod()";//不拼接参数,直接调用js的jsMethod函数 String method = "jsMethod(" jsonParams ")";//拼接参数,就可以把数据传递给js webview.evaluateJavascript(method, new ValueCallback() { @Override public void onReceiveValue(String value) { Log.i("qcl0228", "js返回的数据" value); } });}

js的代码如下

<div ></div><script type="text/javascript">function jsMethod(jsonParams){ document.getElementById("div").style.backgroundColor='red'; document.getElementById("div").innerHTML=jsonParams; return '987654321';//如果返回数据,会重定向}</script>

运行结果如下

运行结果

打印日志如下

我们可以看到,通过evaluateJavascript可以实现安卓调用js代码。并且安卓的数据可以传递给js,js的数据也可以传递给安卓。

JSBridge的原理解析

JSBridge:是一座用JavaScript搭建起来的桥,替代了WebView的自带的JavascriptInterface的接口,使得我们的开发更加灵活和安全。一端是web,一端是native,他可以根据web和native约定好的规则来通知native要做什么,从而实现Android和Javascript之间的交互

JSBridge的原理可以总结为以下三点:
  • 1、Android通过loadUrl(url)调用JS对象,可以在URL内传递参数。
  • 2、JS调用Android是通过shouldOverrideUrlLoading拦截uri。
  • 3、JsBridge将数据封装成Message,然后放进Queue,再将Queue通过协议进行传输。
有任何关于编程的问题都可以私信我,我看到后会及时解答。

编程小石头,码农一枚,非著名全栈开发人员。分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑。

编程小石头,为分享干货而生!据说,每个年轻上进,颜值又高的互联网人都关注了编程小石头。

用 Python 写一个安卓 APP

作者:youerning来源:http://youerning.blog.51cto.com/10513771/1733534

前言

用 Python 写安卓 APP 肯定不是最好的选择,目前用Java和 kotlin 写的居多,但是肯定也是一个很偷懒的选择,而且实在不想学习Java,再者,就编程而言已经会的就 Python与Golang(注:Python,Golang水平都一般),那么久Google了一下Python 写安卓的APP 的可能性,还真行。

既然要写个APP,那么总得要有个想法吧。其实想做两个APP来着,一个是自己写着好玩的,一个是关于运维的。关于运维的APP,设计应该如下

可能长这样

然后设计应该是这样。

如果觉得可行的话,评论留言一下你觉得应该写进这个APP的运维常用命令吧^_^,笔者暂时想到的是top,free -m,df–h,uptime,iftop,iotop,如果有什么好的想法就狠狠的砸过来吧,笔者到时应该也会把这个写成一个项目放到github上,大家一起用嘛,开源才是王道,哈哈。

开发安卓APP

我们使用kivy开发安卓APP,Kivy是一套专门用于跨平台快速应用开发的开源框架,使用Python和Cython编写,对于多点触控有着非常良好的支持,不仅能让开发者快速完成简洁的交互原型设计,还支持代码重用和部署,绝对是一款颇让人惊艳的NUI框架。

因为跨平台的,所以只写一遍代码,就可以同时生成安卓及IOS的APP,很酷吧。

本文会带大家写一个Hello world并瞧一瞧 Python 版的2048的代码

kivy安装

环境说明:笔者在用的是Python2.7.10

这里仅介绍windows平台安装

所有平台参考: https://kivy.org/修改buildozer.spec文件

vi buildozer.spec

至少修改下面三项

(str) Package namepackage.name = helloapp (str) Application versioning (method 1)version.filename = %(source.dir)s/main.py下面这行改为非注释version = 1.2.0

最后我们生成我们需要的apk文件

buildozer -v android debug

buildozer.spec更详细的相关参数配置参考:

http://buildozer.readthedocs.org/en/latest/specifications.html

buildozer命令会在当前文件夹创建一个bin,该文件夹里面有我们想要的apk文件

helloapp-1.2.0-debug.apkhelloapp-1.2.0-debug.apk

安装以后是这样:

话说在编译的时候可能出现空间不足的情况,根据虚拟机的不同(vmware或virtualbox)自行扩容吧。

最后我们来瞧瞧简易版Python开发的2048这个游戏的源代码。

代码:

https://github.com/mvasilkov/kb/tree/master/6_2048

先看效果图:

试玩了一下,还是蛮流畅的,有兴趣的可以下载玩一下。

下载地址:http://pan.baidu.com/s/1eQZACDW

这个游戏代码虽然不长,但是还是蛮占篇幅的,所以简要的说明一下流程。

主要由三部分组成,一是素材,图片音频之类的文件,二是Python代码,三是kv文件,这个kv文件有点像 html 中的css。

Python代码的文件名一般命名为 main.py

然后一定有一个叫做 XXXApp 的类,并继承 App。

比如该类叫做GameApp,那么该目录下的kv文件则必须为Game,如上图所示,如果不是,那么kv文件中的一些设定就不会生效。

比如设定一个标签

Label: id: time text: 'xxxx' font_size: 60

id为time,text文本内容为'xxxx',然后字体为60

好吧,点到为止吧,不过似乎什么都没点到。

安卓干货铺-Android命名基本规范

1.包命名,单词全部小写

域名反写 项目名称 模块名称,例如:

activity包: cf.paradoxie.demo.activity

实体包: cf.paradoxie.demo.bean

工具包: cf.paradoxie.demo.utils

2.接口和类命名,单词首字母大写(大驼峰规则)

以下为几种常用类的命名:

公共父类,命名以Base开头,如:BaseActivity, BaseAdapter

activity类,命名以Activity为后缀,如:LoginActivity

fragment类,命名以Fragment为后缀,如:LoginFragment

service类,命名以Service为后缀,如:DownloadService

adapter类,命名以Adapter为后缀,如:MyListAdapter

工具类,命名以Util为后缀,如:StringUtil

接口类,命名以I为前缀(来源于MVP模式),如:IUser

接口实现类,命名以Impl为后缀,如:UserImpl

3.方法命名,除开第一个单词首字母,其余都大写(小驼峰规则)

以下为几种常用方法的命名:

初始化方法,命名以init开头,例:initView

设置方法,命名以set开头,例:setData

储存方法,命名以save开头,例:saveData

具有返回值的获取方法,命名以get开头,例:getData

通过异步加载数据的方法,命名以load开头,例:loadData

布尔型的判断方法,命名以is或has,或具有逻辑意义的单词如equals,例:isEmpty

常用控件id命名缩写

控件命名控件命名

TextViewtvRadioGroupgroup

EditTextetRadioButtonrbtn

ButtonbtnProgressBarprogress

ImageViewivCheckBoxcb

ImageButtonibtnSpinnerspinner

ListViewlvScrollViewsv

LinearLayoutllRelativeLayoutrl

FramLayoutflTableLayouttl

以上缩写为代表控件的缩写,其id全称需根据配合所在布局及其功能意义而定,缩写_{范围_}意义,例如:

登录按钮:btn_login;

相对布局的tab栏:rl_tab;

标题栏文本:tv_head_title

布局 layout命名

类型_{范围_}功能,范围可选,只在有明确定义的范围内才需要加上。

以下为几种常用的组件类型命名:

activity_{范围_}功能,为Activity的命名格式:activity_login

fragment_{范围_}功能,为Fragment的命名格式

dialog_{范围_}功能,为Dialog的命名格式

headerlist\{范围_}功能,为ListView的HeaderView命名格式

footerlist\{范围_}功能,为ListView的FooterView命名格式

strings的命名

类型_{范围_}功能,范围可选。

以下为几种常用的命名:

页面标题,命名格式为:title_页面

按钮文字,命名格式为:btn_按钮事件

标签文字,命名格式为:label_标签文字

选项卡文字,命名格式为:tab_选项卡文字

消息框文字,命名格式为:toast_消息

编辑框的提示文字,命名格式为:hint_提示信息

图片的描述文字,命名格式为:desc_图片文字

对话框的文字,命名格式为:dialog_文字

menu的item文字,命名格式为:action_文字

colors的命名

前缀{_控件}{_范围}{_后缀},控件、范围、后缀可选,但控件和范围至少要有一个:背景颜色,添加bg前缀

文本颜色,添加text前缀

分割线颜色,添加div前缀

区分状态时,默认状态的颜色,添加normal后缀

区分状态时,按下时的颜色,添加pressed后缀

区分状态时,选中时的颜色,添加selected后缀

区分状态时,不可用时的颜色,添加disable后缀

drawable的命名

跟以上colors的命名类似,此处多了选择器

添加selector后缀(一般为ListView的selector或按钮的selector)

动画文件命名

动画类型_动画方向

fade_in,淡入

fade_out,淡出

push_down_in,从下方推入

push_down_out,从下方推出

slide_in_from_top,从头部滑动进入

zoom_enter,变形进入

shrink_to_middle,中间缩小

变量命名

只能包含字母,单词首字母除第一个外,都为大写,其他字母都为小写

普通变量:mXyxy,或userBean

控件变量,类型为前缀,功能在后面:btnLogin

常量命名

全部大写,采用下划线命名法.例如:MAX_VALUE

大家都在看
本文经用户投稿或网站收集转载,如有侵权请联系本站。