webview显示富文本与JS和java的交互

webview显示富文本与JS和java的交互

2年前 (2016-01-15) 浏览: 216 评论: 1

WebView是安卓下显示网页的控件,使用它可以实现一个简单的浏览器,访问互联网上的网页。也可以当作一个本地的文本显示控件,和textView类似。用 WebView 或者 TextView 来显示 HTML 内容,其交互的实现方式有较大的区别,以在 HTML 内容中的图片点击事件为例,在 WebView 模式下,开发人员需要通过注入 JavaScript 代码来进行点击事件的响应,Android 系统提供了 WebView 中 JavaScript 网页脚本调用 Java 类方法的机制;而在 TextView 中,图片会被解析为 ImageSpan,通过在 ImageSpan 上注册点击事件来响应。   一、webview显示富文本 比如iniHtml为一段String类型的html代码,使用 即可在webview上显示这段html。   二、webview显示项目资源中网页文件 我们可以将一个html文件index.html放在项目的assets文件下,使用WebView.loadUrl("file:///android_asset/index.html")来显示这个html文件,在这个html文件如果要引用asserts文件夹下的css、js文件,同样使用file:///android_asset/ ; 来访问。 三、java中调用javascript函数 使用loadurl调用java代码 四、javascript怎样调用java函数 在webview使用javascript调用外部的java函数可以让android的webview显示富文本有一种更加原生的体验,而不会让使用者感觉他在使用一个浏览器在查看你的显示文本。为了能让javascript调用java中代码,安卓采取将javascript的一个window下的对象M与java中的对象N做一个绑定或者说是映射,这样在javascript下对M的操作就相当于在java下N的操作。 实现方法:webview启用javascript,绑定js对象 addJavascriptInterface(Object object, String name)函数中第一个参数object是java下的对象,name是映射到javascript下的对象名。你可以为java下的object比如当前的activity申明一个click()函数,在javascript下使用window.name.click() 即可出发java下click函数。 需要指出的是在java中的click函数需要添加声明 @JavascriptInterface

网页添加链接调用APP与跳转下载网址

网页添加链接调用APP与跳转下载网址

2年前 (2016-01-09) 浏览: 325 评论: 1

在京东、百度糯米等网站的手机端网页上,常常有有个悬浮提示“点击打开客户端”,如果用户在手机上安装了客户端,将会自动调用客户端打开与当前网页内容一致的客户端页面;如果用户没有安装这些APP,浏览器将会跳转到下载网址,让用户下载客户端。在王柏元的博客客户端中也实现了这一功能。 之前在《安卓实现打开指定链接调用其他应用程序》介绍了如果让客户端点击特定链接(APPLINK)时自动调用客户端软件,在此再次重复一遍: 在打开指定链接需要跳转到的Activity的AndroidManifest.xml清单文件中中加入一条intent-filter标签,并如下面的例子设置scheme、HOST等属性。 怎样链接到客户端指定页面 通过 category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="wbyblog" android:host="wangbaiyuan.cn" android:pathPrefix="/home"/> 这一Intent调用Activity不仅能在applink被点击时启动该APP,还支持类似HTTP的GET传值,这就是跳转到网页对应的客户端页面的前提。 比如:王柏元的博客客户端注册了android:scheme="wbyblog" android:host="wangbaiyuan.cn" android:pathPrefix="/post" 的Intent的postActivity,在浏览器打开链接:"wbyblog://wangbaiyuan.cn/post?postid=1234**&title=网页添加链接调用APP与跳转下载网址 "时,将把postid:1234**和title:网页添加链接调用APP与跳转下载网址 传入postActivity;在postActivity中通过下列代码实现获取传入的值。 这样你就可以根据传值显示特定的app页面了 网页端实现已安装客户端则调用、无则下载 在服务端我们需要动态生成当前网页对应的APPLINK,并通过一个悬浮固定的div显示applink,以便醒目吸引用户点击。比如极客人实现的在手机网页、文章页面,生成有该链接的div(电脑不予显示): 其中关键部分为下面的js代码: js实现了让浏览器打开applink从而自动调用你的app(当然前提是你安装了),并在1000m后跳转到app下载页面,其它并不能判断你的手机上是否安装了你的APP,但是展现的效果是一样的!

AndroidStudio代码混淆和NDK预防apk反编译

AndroidStudio代码混淆和NDK预防apk反编译

2年前 (2016-01-09) 浏览: 797 评论: 0

代码混淆 什么是代码混淆 Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。 混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。   NDK将应用的核心代码或通讯协议打包成so文件 NDK可以实现代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 因为java是半解释半编译性语言,,先将java的代码解释成CLASS文件,然后编译给计算机中的JVM虚拟机,然后由虚拟机调用相应的计算机部件进行运算,而安卓的SO文件是linux下的文件,用c或者c++写的,c++你可以看做是C的扩充版,C有良好的机器兼容性,就是因为它可以直接编译为机器指令,执行效率相对java高,而java是跨平台移可植性强大。 C/C++更接近底层系统实现和依赖于编译器,不同编译器生成的二进制代码会相对不同平台有所区别,甚至同一操作系统不同系列的编译器都会有一点差异,比如在linux下编译C/C++得到的二进制代码就很难或无法运行在windows平台上,反之亦然,所以反编译很困难,现在大多数反编译软件都只能反编译成汇编。有一些号称可以反编译成C或者C++的工具,但反编译出来的结果大多看不明白,还不如用汇编。  

第一个android studio+NDK程序

第一个android studio+NDK程序

2年前 (2016-01-08) 浏览: 132 评论: 0

NDK(android native develop kits ):android 本地开发工具集 ,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件。 什么是JNI :java本地开发接口,JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。 java可以实现上层应用的开发,但是不能写底层驱动,有些android项目必须和底层硬件打交道,比如要精确快速的获取某种传感器的值,那么java是不能办到的,那怎么办,就通过JNI开发,通过c/c++完成底层驱动或者值得获取,然后将值传回到java层。同样java层也可以将数据传递给c/c++层,这样通过JNI完成数据的交互。 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。 3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。 MainActivity: 下面是通过javah命令自动生成的 cn_wangbaiyuan_ndktest_MainActivity.h   在build.gradle(Module:App)加入下列配置可指定生成.so文件的CPU平台类型以及so文件的名称,如果没有指定,android将会生成libapp.so,以及所有平台的so文件;生成so文件路径为:你的项目根目录\app\build\intermediates\ndk\debug\lib build.gradle(Module:App)    

百度云推送实现博客新文章提醒

百度云推送实现博客新文章提醒

2年前 (2016-01-07) 浏览: 132 评论: 1

在开发王柏元的博客客户端时,为了加入新文章发布时实现客户端通知的效果,极客人采用了百度云推送平台,使用百度官方提供的SDK和demo成功实现。服务端发送通知时,客户端会执行onNotificationClicked 回调函数。该函数的形参分别为 Context context:上下文 String title:通知标题 String description:通知内容 String customContentString:自定义字段,通过json可获取服务端的传值。 安卓端 服务器端代码需要引入sdk.php,关键是服务器要支持cUrl模块。我的阿里云免费主机就不支持,后来我消息推送的代码放在景安的虚拟主机上,通过阿里云调用URL的方式执行在景安主机上的PHP文件,解决了这一问题。 PHP服务器端    

安卓实现打开指定链接调用其他应用程序

安卓实现打开指定链接调用其他应用程序

2年前 (2016-01-01) 浏览: 118 评论: 0

有些网站在网页上设置了点击跳转到其官方APP上的链接,比如京东;近期在做王柏元的博客客户端上我加入此功能,用以打开网页上的链接调用我的客户端打开相关文章。下面是实现方法: 安卓实现打开指定链接调用其他应用程序 在打开指定链接需要跳转到的Activity的AndroidManifest.xml清单文件中中加入一条intent-filter标签,并如下面的例子设置scheme、HOST等属性。 并做了一个网页亲测成功:  

触类旁通学习swift(1)语言简述

触类旁通学习swift(1)语言简述

2年前 (2015-12-30) 浏览: 128 评论: 0

由于要参加一个iOS竞赛,所以极客人最近开始学习swift语言。swift语言是苹果2014年发布的一个开发苹果旗下软件的一种新的编程语言,貌似有取缔之前用来开发苹果软件的objective c语言的势头,所以个人觉得学习swift还是比较有前途的。由于开发iOS必须要MAC系统,之前花费了大量的时间给我的戴尔电脑安装了“黑苹果”,但因为驱动问题导致无法联网,十分影响学习。为此,十分感谢杨帆老师借了我一台闲置的MAC电脑。 与之前学习过的c++,java,php,javascript语言相比,swift语言在我看来更加高端或者说“高级”,比java等语言比swift更加简洁,对一些诸如数组等数据类型的操作功能极为强大,写相同量大swift的代码可以做很多的事情。简洁、高级的swift可以节省程序员打字的工作量,但是也意味着这个语言可能的封装度更大。封装性让成员易于操作但会让程序员离底层越来越远,上层函数的记忆量就会加大。swift和其它高级语言的不同还是很大的,不像java和php相似度极大,只要学会java,php在短时间内即可无师自通。 学过几门计算机语言之后,我认为再学习一门新的语言时与之前语言的比较十分重要。所以在学习swift时很有必要把它和其他语言进行类比学习,以加强记忆,防止各种语言之间的“串味”。 swift面向什么? swift和php相似,既支持面向过程又支持面向对象,没必要把所有的操作都写成一个类和方法,而java则是严格的面向对象语言。但PHP是一种脚本语言,但是swift不是,脚本语言是解释执行的,执行文件是文本; 编译语言,执行文件是二进制,swift需要经过编译生成一个二进制的可执行文件。 swift不是弱类型 swift和javascript一样没有显式地声明变量类型,但是在没有声明变量类型的swift会根据情况自动推断出变量类型。比如var a="hello world",a会被推断为string类型。

支持自动提示的多引擎的搜索框

支持自动提示的多引擎的搜索框

2年前 (2015-12-30) 浏览: 219 评论: 0

使用网上开源的导航站源码制作了我的导航网页“百元导航”后,总觉得它丢掉了导航网站的一个很重要的东西—搜索框。于是极客人为自己的导航站加入了搜索框的功能,支持百度搜索、好搜、极客搜、CSDN搜索、蒲公英PT搜索等(可以加代码轻松扩展),除了网站界面使用了网上的代码,逻辑处理部分的js代码全由本人实现。 html代码: 下面是搜索框的界面的html部分,CSS没有贴在下面,如果需要请留言: javascript代码 要想搜索框支持多搜索引擎切换,首先需要掌握搜索引擎搜索关键词的URL参数,查看有几个GET参数(搜索引擎一般都是用GET传值的),比如下面是搜索引擎搜索“王柏元的博客”的结果页的URL: https://www.baidu.com/s?ie=UTF-8&wd=%E7%8E%8B%E6%9F%8F%E5%85%83 ?ie后面是编码格式,wd后面是搜索的关键词的URLEncode编码。 所以只要做一个表单,在表单内部加入name="ie"的DOM元素,这个元素没有必要在界面上显示,可以在CSS样式中加入“display:none”,下面的addparams函数实现的就是这一功能;再加入name="wd"的文本框,就是输入关键词的那个搜索框。最后将表单的action设置为百度搜索关键词网址:https://www.baidu.com/s 下面的setEngine函数就是切换搜索引擎的函数。传入searchIndex,就是html中select下option的value; 为了在用户切换搜索引擎后,再次打开导航页默认显示切换后的搜索引擎,可采用cookie记录searchIndex。 下面的代码用以在切换搜索引擎时,如果搜索框不为空则自动搜索搜索框内关键词,不用点击“搜索按钮”。 搜索框加入百度搜索自动提示 其中搜索自动提示的功能采用了百度开放的百度搜索框提示:引入一个百度的opensug.js文件,然后在要绑定搜索提示的文本框input元素中加入baiduSug="1"。这样在绑定的搜索框中输入文字即可获得和百度一样的搜索提示。 比如: 网上说百度搜索提示还有很多高级用法,比如自定义搜索提示的背景颜色、字体等等。不过极客人试过发现并不支持,你可以自行尝试,成功了欢迎来王柏元的博客交流!

一个炫酷、快速的PC网址导航站-百元导航

一个炫酷、快速的PC网址导航站-百元导航

2年前 (2015-12-29) 浏览: 128 评论: 0

前几天在一个网站上发现了一个炫酷的导航网页,界面美观大气,采用windows8磁贴风格、网站图标采用扁平化设计。后来发现这个导航网页是开放源码的,于是就下载了一份,并做了细微的修改与优化放在我的主机上,取名“百元导航”。之后我就自豪将“百元导航”设置为我所有浏览器的主页。因为我可以自信地告诉你,这个导航网页二次加载速度绝对快于任何导航网站(不服可亲测),包括主流的百度搜索、360导航。话不多说,百元导航的网址:http://wangbaiyuan.cn/daohang,欢迎大家将其设置为你的浏览器主页和提出宝贵意见。 0.3s的极速加载体验 百元导航的首次加载速度在我的15M宽带下、360极速浏览器谷歌内核下测试速度为851ms,二次加载速度260ms,并且支持第二次没有联网都可以访问。之所以能在不到0.3s的速度里完成加载,是因为网页内的所有资源包括CSS、js以及网页自身的html都缓存在本地。二次访问相当于你在本地硬盘上打开一个网页文件。 怎样实现浏览器资源缓存 一般来说,浏览器会将其访问过的一些资源文件进行保存,比如CSS,JS,这些存储在本地磁盘的网页文件称为缓存,在二次访问时,浏览器一般会优先访问本地缓存里面的内容,如果网页中还有些资源文件在缓存里没有找到或者缓存已经过时,才会通过网络连接向服务器上请求下载。这就是我们在上网时发现一个网站首次访问速度会特别慢、第二次就快很多的缘故。 浏览器缓存css、js是默认行为,缓存时间也是不确定的,为了让浏览器缓存所有的文件,甚至包括网页文件自身,并且让浏览器缓存的CSS、JS缓存的时间足够长,服务器可以做一个缓存文件类型设置和缓存超时设置。 在网站根目录或者当前资源文件目录中的htaccess中加入: 表示将扩展名为flv、gif、jpg、jpeg、png、ico、swf、js、css、pdf、eot 的文件缓存过期时间为2592000秒,30天。如下同理,将js、css过期时间设置为10天: 将txt、xml、html过期时间设置为10天   或者在PHP中使用@header函数发出响应头消息告诉浏览器资源过期时间: 上面实现了将放置此代码的PHP文件返回的文件类型是text/css)缓存过期时间为每天北京时间0点,GMT时间(格林尼治时间)16:00。 有自动提示、支持多引擎的搜索框 搜索框的代码是我在原有的导航网站源代码基础上加入的,支持百度、极客搜、谷歌、360、搜狗搜索,并使用了百度开放的百度搜索框提示代码“opensug.js”实现了自动提示功能。具体的实现方法可以参考我的下一篇博文:支持自动提示的多引擎的搜索框。  

PHP获取指定日期的农历和节日

PHP获取指定日期的农历和节日

2年前 (2015-12-25) 浏览: 1668 评论: 2

今天是圣诞节,用了半天做了一个节日祝福语和节日主题,效果还不错。可以在洋节和中国节日(包括农历节日 春节、中秋节等等)当天更换王柏元的博客的节日主题,并在站点公告里送上节日祝福语。 下面是关键的PHP类:Lunar。其中的getFestival()函数可传入的实参是不定数目的,可以通过传入的公历年月日,不传入默认是当前的服务器时间,函数实现了判断指定日期是否是已经设定的节日:比如中秋节、春节,同时还输出节日祝福语或诗句,返回的形式是一个数组。其余几个函数实现了获取公历和农历之间的转换,农历还支持返回当前日期农历的天干地支纪年以及生肖。    

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册