这也许是功能最强大的Android与Javascript交互开源库

项目中为了减少端上开发量,通常会使用一些跨平台的解决方案,而 web 就是最简单、兼容性最强的方案,但 web 又受制于浏览器,不能直接访问系统的一些属性,而且我们也需要 web 调用 native 的一些方法,所以我们需要一套 web 和 native 双向交互的方案。 目前,Android 要实现与 web 交互有以下几种常用方案: WebView addJavascriptInterface方法 拦截自定义协议链接实现数据交换 实现 prompt,console等原生方法来数据交互 方案一是官方推荐实现方案,但是在 android 4.2以下存在严重安全漏洞,而且和 JS 交换的数据仅仅局限于基本类型(int,float,double,String 等),不支持直接 JS 函数调用和回调(需要通过注入 JS 支持)

阅读全文...

Activity重建导致Fragment多次初始化问题探讨

0x1 起因 我们先来看段代码(仅关键代码) public class TestActivity extends FragmentActivity { ... protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.xxxx); getSupportFragmentManager().beginTransaction() .replace(R.id.content, new TestFragment()) .commit(); } ... } public class TestFragment extends Fragment { public TestFragment() { Log.d("TestFragment", "new TestFragment"); } ... } 运行,并切换横竖屏 或者 切换系统语言,请问TestFragment的构造函数会执行几次呢?(注意:Manifest中没有配置configChanges属性) 06-01 10:34:37.

阅读全文...

那些不常用的adb命令

显示当前activity adb shell dumpsys window w | grep \/ | grep name= | cut -d = -f 3 | cut -d \) -f 1 打开应用详情 adb shell am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:com.baidu.hi 清空应用信息 shell pm clear com.baidu.hi 多语言选择 adb shell am start -a android.settings.LOCALE_SETTINGS

阅读全文...

targetSdkVersion < 22 下权限适配

android 在 6.0 (android M) 引入动态权限,应用在安装时不会授予危险权限(危险权限列表),应用在运行的时候动态申请,用户确认后才可以拿到权限。 这一套在targetSdkVersion >= 23 的情况下没有任何问题,23以下呢?应用安装的时候默认授予所有权限,但是不(keng)幸(die) 的是 在运行6.0及以上的手机上用户可以主动关闭权限,而且应用还拿不到任何通知。 华为手机取消时界面如下: 下面总结了下不同版本权限的影响: targetSdkVersion/手机系统 不小于6.0 小于 6.0 小于23 安装时默认授予权限,用户可以取消权限(取消时手机会弹出提醒"取消可能导致无法运行"),app不能动态申请 安装时默认授予权限,且用户不能取消 不小于23 安装默认不授予权限,需要app动态申请权限, 或者用户主动设置 安装时默认授予权限,且用户不能取消 现在的问题是targetsdkversion <= 22

阅读全文...

从wordpress迁移到ghost问题小结

数据迁移 安装ghost的wordpress插件导出数据,并在ghost后台导入 搜索引擎抓取问题 wordpress 文章的路径和 ghost 不一样,这就导致了那些被搜索引擎抓取的内容将无法访问。通过nginx设置重定向来解决这个问题 server { listen 80; server_name www.apkfuns.com apkfuns.com *.apkfuns.com; location ~* \.(html)$ { rewrite ^/(.*)$ http://oldblog.apkfuns.com/$1 permanent; } location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://127.0.0.

阅读全文...

博客评论从多说换到网易云跟帖

多说官方宣布17年6月1号停止维护,一个优秀的评论系统从此倒下了,令人唏嘘不已,还是要感谢多说团队多年的付出。眼下留给博主们的选择也就畅言和网易云跟帖了。经过综合考虑选择了网易跟帖,下面就来介绍下接入流程。 1.登录网易帐号,配置下站点信息:https://manage.gentie.163.com/#/site 2.选择获取代码的banner,复制到博客需要用到评论的地方。我的代码如下: <div id="cloud-tie-wrapper" class="cloud-tie-wrapper"></div> <script src="https://img1.cache.netease.com/f2e/tie/yun/sdk/loader.js"></script> <script&

阅读全文...

Sublime command + b 运行shell

Sublime自带的build system中是没有shell选项的,直接command + b 也是没有任何反应。那我们就只能自己来写一个执行shell的,还好Sublime支持创建Build System。 依次点击Sublime Tools > Build System > New Build System 在弹出框中替换成以下内容: Sublime 3.* { "shell_cmd": "chmod a+x $file && /bin/sh $file" } Sublime 2.* { "cmd" : ["bash", "$file"], "selector" : "source.shell" } 配置后保存(默认路径就行),切换我们刚才新建的build system。Tools > Build Systems > 保存时创建的名字。 再次按command + b就可以直接运行shell了。 以上教程在MAC上Sublime2、3 测试通过,

阅读全文...

类微信底部Tab+ViewPager延缓加载实现

效果分析     Android APP采用底部tab切换效果越来越多,像微信,QQ, 支付宝等巨型APP都是采用这种设计。我们今天要介绍的就是基于这样的设计的一种内存优化方案 - ViewPager延迟加载。先看看微信的效果吧。 滑动过程中看到的是正在加载...,等切换完成才会开始加载页面内容。 android ViewPager默认加载当前页面的前一张和后一张,一般情况下会初始化三个界面,先不考虑三个页面同时加载导致的线程网络阻塞的问题,用户打开app并不需要马上初始化不可见的页面,这部分内存是可以优化的,可见的时候才开始加载内容,这样尽量减少内存的占用。 原理分析和实现效果     我们采用ViewPager + FragmentPagerAdapter来实现底部Tag切换的效果,要实现微信这种效果首先需要在不可见时文本占位提示正在加载..., 其次需要获取到当前页面可见与不可见的事件监听。在可见的时候加载内容。这两条都可以通过重写ViewPager来实现,但是比较麻烦,有兴趣的朋友可以去尝试下。我们这里介绍一种更简单的方案,通过重写Fragment的setUserVisibleHint方法来实现。 我们来看看setUserVisibleHint方法官网文档 setUserVisibleHint() Set a hint to the system about whether this

阅读全文...

怎么下载github项目的某个文件夹?

github上提供了git下载和整个项目的zip包下载,有时候项目很大,而你又只想下载某个文件夹的时候就比较麻烦了。整理了下网上下载Github某个文件夹的教程如下: 下载master分支文件夹: 文件夹地址为:https://github.com/alibaba/freeline/tree/master/gradle 下载方法 svn checkout  https://github.com/alibaba/freeline/trunk/gradle 第一次使用会提示这个: (R)eject, accept (t)emporarily or accept (p)ermanently?  选择p永久接受就好了。 下载Branch分支文件夹 原理差不多,如文件夹地址为: https://github.com/alibaba/freeline/tree/as_plugin/android-studio-plugin 这是在as_plugin分支下的android-studio-plugin文件夹 下载方法

阅读全文...

导入intellij plugin项目报错No plugin module specified for configuration

导入intellij IDEA项目总是运行失败,报错No plugin module specified for configuration。 在http://stackoverflow.com/questions/18278440/how-to-import-and-run-existing-plugins-from-intellij-community-edition-repo上找到了答案,原来导入intellij plugin项目默认用的java项目来解析,所以不管怎么设置都添加不了插件项目。 只要把项目根目录的*.iml中MODULE”  改成MODULE”  就可以啦。 还有,别忘了修改plugin.xml的位置,java项目默认在根目录Meta-INF下,而plugin项目在resource下META-INF下。

阅读全文...