安卓原生与JS交互的四种方式详解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":"商品详情"}
- webView.addJavascriptInterface()
- WebViewClient.shouldOverrideUrlLoading()
- webView.loadUrl();
- webView.evaluateJavascript()
- 首先我们要在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的原理可以总结为以下三点:JSBridge:是一座用JavaScript搭建起来的桥,替代了WebView的自带的JavascriptInterface的接口,使得我们的开发更加灵活和安全。一端是web,一端是native,他可以根据web和native约定好的规则来通知native要做什么,从而实现Android和Javascript之间的交互
- 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