生成Java常量
1 | android { |
你可以访问他们 BuildConfig.FOO
生成Android资源
1 | android { |
您可以按照通常的方式访问它们。@string/app_name
或R.string.app_name
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
乱码三千 – 码出一个新世界
1 | android { |
你可以访问他们 BuildConfig.FOO
1 | android { |
您可以按照通常的方式访问它们。@string/app_name
或R.string.app_name
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
在图片上右键上传,自动生成markdown图片链接格式
到剪切板中,任意地方Ctrl+v
均可粘贴
在文件上右键上传,自动生成markdown超链接格式
到剪切板中,任意地方Ctrl+v
均可粘贴
成也萧何败也萧何,由于markdown的纯文本属性,决定了它不可能优雅的存储图片,在实践中有2种图形表示法
markdown标准
1 |  |
这样实际是存放的图片地址,而非图片本身
html转义
1 |  |
以上是base64编码以后的二进制数据
上述2种方法,在书写markdown的过程中,都很不方便
typora
在windows下最好的markdown编辑器,没有之一
拖动图片到文档中,会自动拷贝图片到硬盘的指定位置,算是半自动化解决了问题
但是依然存在问题:分享为博客后,这些图片的路径很难正确处理

或者[filedes](http://****.*****.***/***.zip)
在剪切板中Ctrl+V
即可完成编写对象存储(Cloud Object Storage,COS)
我们需要一个空间,用于存放图片或者文件,这里推荐使用腾讯云或者七牛云
他们提供的免费额度足够普通用户使用了
资源类型 | 资源子类型 | 每月免费额度 |
---|---|---|
存储空间 | 存储空间 | 50 GB |
流量 | 外网下行流量 | 10 GB |
流量 | 腾讯云 CDN 回源流量 | 10 GB |
请求 | 读请求 | 100 万次 |
请求 | 写请求 | 100 万次 |
资源类型 | 免费额度 |
---|---|
标准存储空间 | 0-10 GB |
每月上传流量 | 无上限 |
标准存储每月写请求 Put / Delete | 0-10 万次 |
标准存储每月读请求 Get | 0-100 万次 |
这里以腾讯云接口为例,本地需要nodejs
运行环境
在windows环境变量
中增加一项NODE_PATH
,最好同时指向2处,例如:C:\Users\ZNMLR\node_modules
和C:\Users\ZNMLR\AppData\Roaming\npm\node_modules
前者对应npm的本地安装,后者对应npm的全局安装
目标:在任意格式文件上单击右键,弹出菜单“上传”,然后调用指定bat
打开注册表编辑器
WIN+R
调用运行库,输入regedit
,会打开注册表编辑器
找到计算机\HKEY_CLASSES_ROOT\*\shell
新建项,名字随意
再新建command
子项,并修改右侧默认值
图中的D:\1.bat是我测试用的,其存放于某合理的地方
修改批处理内容,测试是否工作
1 | @echo off |
该批处理暂时只获取输入参数,并打印出来
然后等待用户敲个Enter
就自动退出了
右键点击任意文件
查看运行效果
今天是我用nodejs的第二天,代码可能写不那么符合标准不那么优雅,见谅
如果发现有更好的优化方法,请发邮件通知我,谢谢 yangyunzhao#qq.com
安装nodejs运行环境
这个没什么好说的,双击下一步就好了
安装sdk
1 | C:\Users\ZNMLR>npm i cos-nodejs-sdk-v5 --save -g |
再次安装sdk
不要问我为何有这一步,腾讯云文档这样写的
先下载腾讯云SDK,解压,到指定目录执行命令
1 | C:\Users\ZNMLR>d: |
请到腾讯云注册账号并实名认证,
新建存储桶
获取APPID、SecretId、SecretKey、存储桶名称、所属地域
以上步骤请自行阅读腾讯云文档,这里不做说明
1 | // 引入模块 |
执行js文件
1 | D:\>node 2.js |
上传成功了
敏感信息用*号代替了
但是文件在根目录下
###优化:上传到指定路径
1 | var filepath='D:/135.png'; |
执行脚本
1 | D:\>node 2.js |
查看返回值Location生成路径已经有年月了
略
1 | var picsuffix=new Array(".jpg", ".png", ".bmp", ".jpeg"); |
修改之前的bat批处理文件
1 | @echo off |
修改js脚本
1 | var picsuffix=new Array(".jpg", ".png", ".bmp", ".jpeg"); |
大功告成
本文为转载自:http://blog.znmlr.cn/
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
通俗的讲就是按照某种规则去匹配符合条件的字符串
辅助理解正则表达的在线工具:
正则匹配软件
McTracer
我们利用这个工具辅助理解,正则表达式。语法没懂表着急,后面会有,这里只是学会用工具帮助我们学习。
手机号正则:
1 | /^1[34578][0-9]{9}$/ |
注释:以1开头,第二位为3 4 5 7 9 其中一个,以9位(本身1次加重复8次)0-9数字结尾
单词边界
1 | /\bis\b/ |
注释: is前后都是单词的边界,比较晦涩难懂?感受下两者的区别,\b 会方道语法部分讲解
URL分组替换
1 | /http:(\/\/.+\.jpg)/ |
看不懂的不要慌语法部分后面会有介绍,这里只是展示利用可视化的图形帮助我们理解正则表达式,可以回来再看木有关系
正则表达式中括号用来分组,这个时候我们可以通过用$1来获取 group#1的内容
说下这个正则的意义,如果网站用了https,网站引用静态资源也必须是https,否则报错。如果写成 // 会自动识别 http 或者 https
日期匹配与分组替换
1 | /^\d{4}[/-]\d{2}[/-]\d{2}$/ |
这个正则比较复杂,画符念咒的地方太多了,一一分析:
Start of line 是由^生效的表示以此开头
对应结尾End of line 由$生效表示以此结尾
接着看digit 由 \d 生效表示数字
3times 由{4} 生效表示重复4次,开始的时候有疑问,为什么不是 4times 。后来明白作者的用意,正则表达式是一个规则,用这个规则去从字符串开始匹配到结束(注意计算机读字符串可是不会分行的,都是一个串,我们看到的多行,人家会认为是个 \t )这里设计好像小火车的轨道一直开到末尾。digit 传过一次,3times表示再来三次循环,共4次,后面的once同理。 自己被自己啰嗦到了。
接下来,是 one of 在手机正则里面已经出现了。表示什么都行。只要符合这两个都让通过。
好了这个正则解释完了,接下来用它做什么呢?
我们可以验证日期的合法性
结合URL分组替换所用到的分组特性,我们可以轻松写出日期格式化的方法
改造下这个正则
1 | /^(\d{4})[/-](\d{2})[/-](\d{2})$/ |
轻松的可以拿到 group#1 #2 #3 的内容,对应 $1$2$3
到现在已经能结合图形化工具看懂正则表达式表达式了,如果想自己写,还要在正则语法上下点功夫
1 修饰符 (三个 g i m)
修饰符与其他语法特殊,字面量方法声名的时候放到//后,构造函数声明的时候,作为第二个参数传入。整个正则表达式可以理解为正则表达式规则字符串+修饰符
g:global 执行一个全局匹配
i:ignore case执行一个不区分大小写的匹配
m: multiple lines多行匹配
修饰符可以一起用 const reg =/\bis\b/gim
来说说他们有什么作用
有g和没有g的区别
没有g只替换了第一个,有g 所有的都换了
有i和没有i的区别
有i忽略大小写,没有i严格区分大小写
正则表达式由两种基本字符组成:
原义字符
非打印字符
元字符 (* + ? $ ^ . | \ ( ) { } [ ])
原义字符
这个没什么好解释的,我们一直在举例的 /is/ 匹配字符串’is’
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,n”匹配字符“n”。“\n”匹配一个换行符。序列“\”匹配“\”而“(”则匹配“(”。
非打印字符
字符
描述
1 | \cx |
匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
1 | \f |
匹配一个换页符。等价于 \x0c 和 \cL。
1 | \n |
匹配一个换行符。等价于 \x0a 和 \cJ。
1 | \r |
匹配一个回车符。等价于 \x0d 和 \cM。
1 | \s |
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
1 | \S |
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
1 | \t |
匹配一个制表符。等价于 \x09 和 \cI。
1 | \v |
匹配一个垂直制表符。等价于 \x0b 和 \cK。
非打印字符,以\n为例
其他的在前端引用比较少,应该在后端处理文本文件的时候会用到
字符类 []
在前面的手机号正则例子中,我们已经使用过[] /^1[34578][0-9]{9}$/ : [34578]表示34578任意一个数字即可。在日期匹配与分组替换例子中 /^\d{4}[/-]\d{2}[/-]\d{2}$/
表示符合 /-
都可以
字符类取反 [^]
表示不属于此类
空格也不属于,好多狗
范围类[-]
正则表达式支持一定范围规则比如 [a-z][A-Z][0-9] 可以连写[a-z0-9] 如果你只是想匹配-在 范围类最后加-即可。请看实例。
常用为了方便书写
字符
等价类
含义
1 | . |
除了回车符和换行符之外的所有字符
1 | \d |
数字字符
1 | \D |
非数字字符
1 | \s |
空白符
1 | \S |
非空白符
1 | \w |
单词字符(字母、数字、下划线)
1 | \W |
非单词字符
有了这些预定义类,写一些正则就很方便了,比如我们希望匹配一个 ab+数字+任意字符 的字符串,就可以这样写了 /ab\d./
边界
字符
含义
1 | ^ |
以xx开头
1 | $ |
以xx结尾
1 | \b |
单词边界,指[a-zA-Z_0-9]之外的字符
1 | \B |
非单词边界
量词
字符
含义
1 | ? |
出现零次或一次
1 | * |
出现零次或多次(任意次)
1 | + |
出现一次或多次(至少一次)
1 | {n} |
对应零次或者n次
1 | {n,m} |
至少出现n次但不超过m次
1 | {n,} |
至少出现n次(+的升级版)
1 | {0,n} |
至多出现n次(其实就是{n,m} 方便记忆而已)
如果没有量词,要匹配4位数字这样写就可以/\d\d\d\d/, 如果匹配50位100位呢?那不是要疯掉了?
有了量词,就可以这样写/\d{100}/, 量词的使用我们在手机号中使用过,表现在可视化中就是循环多少次。
凑一个上面都包含的实例/\d?@\d*@\d+@\d{10}@\d{10,20}@\d{10,}@\d{0,10}/
贪婪与懒惰(非贪婪)
正则表达式默认会匹配贪婪模式,什么是贪婪模式呢?如其名尽可能多的匹配。我们看个例子。
1 | /\d{3,6}/ |
贪婪模式下,匹配的了最多的情况。
与贪婪对应就是懒惰模式,懒惰对应的就是匹配的尽可能少的情况。如何开启懒惰模式? 在量词后面加?。继续上面的例子
1 | /\d{3,6}?/ |
如果想知道,正则表达式是如何匹配量词的,请看 进阶正则表达式 文中有介绍,正则是如何回溯的。
分组与反向引用
分组,又称为子表达式。把正则表达式拆分成小表达式。概念枯燥,说个例子为嘛用分组:
不分组 /abc{2}/
量词仅作用到最后的c
分组 /(abc){2}/
注意这里 group #1
分组虽然和运算符() 很像,但是分组在正则表达式中,注意理解组的含义。经常有人滥用分组
/^(http|https)/
真的需要这样么?其实 /^https?/
就可以了,你正则写的特别长的时候,会出现一堆没用的结果,看着都头疼吧。
分组往往和反向引用一起使用,别被概念吓到:当一个正则表达式被分组后,每个分组自动被赋予一个组号,一左到右分别是 $1$2…
再把之前的例子拿出来
1 | /^(\d{4})[/-](\d{2})[/-](\d{2})$/ |
轻松的可以拿到 group#1 #2 #3 的内容,对应 $1$2$3
如果在反向引用中不想捕获年该如何操作? 加上 ?:即可
1 | /^(?:\d{4})[/-](\d{2})[/-](\d{2})$/ |
这部分为进阶部分—选看
正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那一块地方。
注意:后顾性能损耗比较大,js只支持前瞻(知乎上看到的,具体原因不详)
上面的比较概念话,尝试用大白话讲讲,就说皇上选妃吧,先行条件得是美女吧,长得“如花”那样皇上可不要,漂亮这关过了,皇上想要这个美女也不行,皇室有规矩,必须是贵族血统。
那么“漂亮”就是正常的匹配,匹配到了,还得看看家室是不是贵族。”贵族”相当于前瞻条件
前瞻分两种一种是正向前瞻(?=xxx), 另一种是负向前瞻(?!xxx)
用法一: 限定开头
文档上给出了解释是匹配输入的开始,如果多行标示被设置成了true,同时会匹配后面紧跟的字符。 比如 /^A/会匹配”An e”中的A,但是不会匹配”ab A”中的A
用法二:(否)取反
当这个字符出现在一个字符集合模式的第一个字符时,他将会有不同的含义。
比如:/[^a-z\s]/会匹配"my 3 sisters"中的"3"
这里的”^”的意思是字符类的否定,上面的正则表达式的意思是匹配不是(a到z和空白字符)的字符。
总结:
什么时候”^”是否定字符,什么时候是匹配开始行
表示限定开头的示例:
1 | `/``[(^\s``+``)(\s``+``$)]``/``g``(^cat)$``(^cat$)``^(cat)$``^(cat$)` |
表示否定的示例:
1 | `[^a]表示“匹配除了a的任意字符”。``[^a``-``zA``-``Z0``-``9``]表示“找到一个非字母也非数字的字符”。``[\^abc]表示“找到一个插入符或者a或者b或者c”。` |
经过对比,只要是”^”这个字符是在中括号”[]”中被使用的话就是表示字符类的否定,如果不是的话就是表示限定开头。我这里说的是直接在”[]”中使用,不包括嵌套使用。
其实也就是说”[]”代表的是一个字符集,”^”只有在字符集中才是反向字符集的意思。
在正则表达式中,前中括号 [ 属于特殊字符,要匹配它,需要转义,即加上 \;而后中括号 ] 不属于特殊字符,不必加转义字符
举例说明:
需要匹配以下字符串中括号里面的内容
1 | ["www.baidu.com","www.wenta.com","www.insoan.com"] |
有两种规则可以使用,任选一:
"|]|\[
过滤不需要的\[(.+)]
取出需要的1 | /^1[34578][0-9]{9}$/ |
1 | /^https?/ |
1 | /^(\d{4})[/-](\d{2})[/-](\d{2})$/ |
1 | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} |
1 | (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}) |
1 | ((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3} |
1 | ^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$ |
1 | \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+([A-Za-z]{2,14}) |
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
排除依赖中的指定包
1 | compile ('com.mcxiaoke.viewpagerindicator:library:2.4.1') { |
force强制设置某个模块的版本
1 | configurations.all { |
force强制设置整个工程的的版本 在根目录的gradle.build文件中设置
1 | allprojects { |
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
1 | //admob广告 |
1 | <application |
1 | <!-- 布局中可以设置广告单元id 这里考虑到防止反编译 改成在代码中设置--> |
1 | // 初始化Admob 这个地方填appid 注意 |
1 | private static final String AD_UNIT_ID = "ca-app-pub-xxxxxxxxxxxxxxxxxxxx"; |
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
javah参数配置(直接拷贝):
Program: $JDKPath$\bin\javah.exe
Parameters: -classpath . -jni -o $ModuleFileDir$/src/main/jni/$Prompt$ $FileClass$
Working directory: $ModuleFileDir$\src\main\Java
Parameters的另外一种写法: -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
javap参数配置(直接拷贝):*
Program: $JDKPath$\bin\javap
Parameters: -s -p $FileClass$
Working directory: $ModuleFileDir$\build\intermediates\classes\debug
ndk-build参数配置(直接拷贝):
Program: D:\Android_NDK\android-ndk-r11b\ndk-build.cmd
Working directory: $ModuleFileDir$\src\main
1 | static { |
此时 会自动创建jni目录并生成头文件
注:
项目结构切换成 Android状态时,jni文件夹显示成 cpp名字!
当切换成project时就显示成jni文件夹!!
如下图:
添加如下代码:
1 | ndk{ |
点击Androidstudio 菜单栏 Build ->ReBuildProject 后自动生成Android.mk文件
把Android.mk文件拷贝到 main/jni文件夹下 然后右键—>External Tools –>ndk-build 生成 .so文件!!
其次 在项目的gradle.properties 文件中添加
1 | android.useDeprecatedNdk=true |
加载生成的动态库指定的文件名( System.loadLibrary(“MyJni”);)和生成.so时指定的名字(build.gradle中的ndk{moduleName “MyJni” }),还有Android.mk中LOCAL_MODULE := MyJni三者名称需要保持一致;
异常提示不支持c++
1 | Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system. |
解决方案:在build.gradle中添加如下配置即可:
1 | android{ |
1 | static { |
1 | //在c代码里面调用java代码里面的方法 |
1 | /* C */ |
在C语言中,JNIEnv是指向JNINativeInterface结构的指针,使用它必须要解引用。而第一个参数还是env,学过C和C++语言都知道,C语言是面向过程语言,NewStringUTF只是一个函数指针,调用该方法还不清楚调用者,所以要传递env,而C++就不用,因为C++是面向对象语言,这个就不解释咯
2.关于C++调用C函数或者变量
1 | //在C++中引用C语言中的函数和变量,在包含C语言头文件时(假设为cExample.h),需进行以下处理: |
3.关于so文件的名称问题
Android.mk文件中的LOCAL_MODULE 决定了so文件的名称,LOCAL_MODULE 的名称可以手动修改也可以在build.gradle中配置:
1 | ndk { |
4.关于System.loadLibrary();
为什么loadLibrary中填入的名称不一致,却能依然运行成功不报错?
目前自测发现 build文件中出现很多编译后的so库 有可能是旧so库未及时清除的原因,可以过研究研究build文件夹,里面藏着非常多的秘密
5.ndk-build不执行照样运行成功
C/C++源码文件改动后自动调用ndk-build编译生成新的so库存放在build文件夹中,可以拷贝直接使用,ndk-build生成正式的so库,这跟apk打包是同样的道理 Android.mk文件是必须存在的,否则无法编译生成so库,也无法编译识别源文件
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
本文内容包括:
之前写了一个Android中的AOP框架Cooker.
这里总结一下里面用到的两块小知识:
1)自定义 Gradle plugin
2)发布自己的jar到 maven仓库
项目中引入自定义Gradle plugin一般有三种方法:
- 直接写在 build.gradle中.
- plugin源码放到rootProjectDir/buildSrc/src/main/groovy目录下
- plugin打包成jar, 发布到maven仓库, 然后项目通过Build Script依赖jar的形式引入
下面介绍的是第3种方式.
先起名叫cooker-plugin吧, 我们将会用这个library写Gradle plugin
把这个cooker-plugin中默认产生的文件都删除, 然后按照下面结构新建文件
1.因为我们用Groovy写的插件, 插件代码放在 src/main/groovy下
2.在src/main/resources/META-INF/gradle-plugins 里声明plugin信息
比如:新建cooker-plugin.properties
文件,内容如下
1
2 >
>
implementation-class=com.helen.plugin.CookerPlugin
1 | > 这里: |
实现plugin,其实就是需要继承实现Plugin
1 | package com.helen.plugin |
在cooker-plugin项目中, build一下.
就能在build/libs下生成对应的plugin插件了
这个插件就能使用了. 可以发布在本地仓库或者Maven仓库.
下面介绍一下利用mavenDeployer发布在本地仓库.
修改cooker-plugin的build.gradle, 修改后如下:
1 | apply plugin: 'groovy' |
运行uploadArchives. 就能在设置的仓库路径中生成 cooker-plugin了
1 | apply plugin: 'com.android.application' |
每次clean/build时, 在Gradle Console可以看到我们的loghello, this is cooker plugin!
1 | Configuration on demand is an incubating feature. |
前面demo中, 我们新建了一个task: cooker-test-task
, 他简单输出一句log.下面测试运行一下这个task.
在控制台输入 gradle cooker-test-task
运行结果如下
Demo地址-Github
到此为止, 自定义Gradle plugin就介绍完了.
结合AndroidStudio, 自定义Gradle plugin可以完成很多功能.
比如cooker的plugin完成了:
1)添加编译依赖
2)进行Aspecj编译
3)自动生成混淆配置
前面我们讲了如何自定义gradle插件并且打包出去,可能步骤比较多。有时候,你可能并不需要打包出去,只是在这一个项目中使用而已,那么你无需打包这个过程。
只是针对当前项目开发的Gradle插件相对较简单。步骤之前所提到的很类似,只是有几点需要注意:
1 | 1.新建的Module名称必须为BuildSrc |
目录结构如下所示:
其中,build.gradle内容为:
1 | apply plugin: 'groovy' |
SecondPlugin.groovy内容为:
SecondPlugin.groovy内容为:
1 | package com.hc.second |
在app这个Module中如何使用呢?直接在app的build.gradle下加入
1 | apply plugin: com.hc.second.SecondPlugin |
clean一下,再make project,messages窗口信息如下
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
当我们采用H5与Native原生结合开发,使用H5去开发一些功能的时候,肯定会涉及到Android与Js互相调用的问题,通常有两种实现方式,
第一种 使用原生的addJavascriptInterface()来解决
第二种 使用第三方框架WebViewJavascriptBridge 这也是我今天要分享的部分
对于安卓开发有一段时间的人来说,知道安卓4.4以前谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户端的重要信息,甚至轻而易举的调用本地代码进行流氓行为,谷歌后来发现有此漏洞后,增加了防御措施,如果要是js调用本地代码,开发者必须在代码中申明JavascriptInterface
,
列如在4.0之前我们要使得webView加载js只需如下代码:
1 | mWebView.addJavascriptInterface(new JsToJava(), "myjsfunction"); |
4.4之后调用需要在调用方法加入加入@JavascriptInterface注解,如果代码无此申明,那么也就无法使得js生效,也就是说这样就可以避免恶意网页利用js对安卓客户端的窃取和攻击。
但是即使这样,我们很多时候需要在js记载本地代码的时候,要做一些判断和限制,或者有可能也会做些过滤和对用户友好提示,因此JavascriptInterface也就无法满足我们的需求了,特此有大神就写出了WebViewJavascriptBridge框架。
1 | repositories { |
1 | <com.github.lzyzsd.jsbridge.BridgeWebView |
H5调android方法
1 | //android端代码 |
或者
1 | //android端代码 |
以上两种方式 一个是指定调具体协定好的方法,一个是全局调用
android调H5
1 | //android端代码 |
或者
1 | //android端代码 |
同样 两种方式一个是不指定方法,另一个是指定具体方法
到此为止还无法交互,还需要配置setWebViewClient
1 | mWebView.setWebViewClient(new BridgeWebViewClient(mWebView)); |
这步非常关键,如果不配置 测试点击压根就不响应,如果你需要自定义WebViewClient,必须实现对应构造方法,而且重写的方法必须调用父类方法,如下:
1 | private class MyWebViewClient extends BridgeWebViewClient { |
到此为止,配置完毕,H5和Android就可以互相调用了
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
有时候我们可能需要改动markdown 的样式。由于markdown的呈现形式是html,可以直接把以下部分添加到markdown中,即可更改默认的样式
1 |
|
直接将以上代码插入文本的上方, 如下:
生成html的结果为:
跟引入css样式一样 直接插入js代码即可 这里有两种方式:
第一种 引用第三方js文件
1 | <script type="text/javascript" src="/js/src/echarts.min.js"></script> |
第二种 常规写法
1 | <script> |
如果使用hexo
编译html
如果要将html
代码当做普通文本处理 可以添加以下raw
标签, 如下:
1 | {% raw %} |
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站
最近需要在服务器上用Jenkins自动打包Android app,从google官网上下载的Linux版本sdk结果发现里面就只有一个tools目录有文件,其他的都没有。。。
无奈,服务器是没有界面的,之前都习惯用IDE去安装更新,现在尝试用命令行下载更新了。
从google的官网下载最新Linux版本SDK,由于dl.google.com域名一直没有被墙,所以才可以直接从官网下了。这点不错~
1 | 下载 |
1 | 解压 |
前面说到了,我们下载的这个包其实只有tools目录下才有东西。既然google给了我们这个,表示这里面肯定有可以更新SDK的工具啦。
其实就是tools/android这个文件
1 | $ cd android-sdk-linux/tools |
进入后
1 | 查看当前可安装的SDK版本 |
因为是首次安装,所有有非常多的版本可下载。
我们可以有2个选择:
安装所有版本的SDK
1 | $ ./android update sdk -u |
只安装我们需要SDK版本
1 | 只安装指定序号的版本 |
因为是在服务器上,建议直接安装所有版本的吧,不然后续可能有些app需要这个版本,又有的需要那个版本。还不如一开始就全部安装好。
安装后可跳转到上一级目录查看是否已经有了。
1 | $ cd .. |
可以看到安装成功了。
通过这些我们也可以推测出其实那些IDE图形界面底层调用的也是这些命令吧
1 | 查看当前目录的实际路径 |
1 | 全局搜索指定文件 包括文件夹和文件 |
1 | 不区分大小写查找 |
1 | 从/开始查找以.log结尾的文件 |
1 | 下载文件到指定路径 这将只有在路径存在时下载。下载将保留远程文件名。下载后,将返回原始位置 |
1 | 查看系统整体空间剩余情况 |
1 | 查看每个文件夹的占用情况 |
1 | 删除非空目录 |
1 | 查看 或 编辑 环境变量的配置 |
1 | 配置环境变量 |
1 | 移动文件夹下所有东西到zone中 |
本帖附件
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站