Android JS启动APK

1.在移动设备访问m.alipay.com时,如果本地安装了支付宝客户端,则浏览器会调用本地客户端,没有安装则会跳转到下载页面,提示安装。刚好有这样的需求,就分析了下支付宝的实现。网上参考了其他人的实现,大部分都是关于APK和本地js交互,相关资料可以参考

2. APK启动流程

在启动APK时,系统会发出对应的intent,根据包名加intent来启动对应activity,activity如果存在对应的intent-filter则启动该应用,如果多个应用同时匹配,则会出现选择框让用户选择。

如下,启动demo.testjs应用的MainActivity

ActivityManager(313):START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0×10200000 cmp=demo.testjs/.MainActivity bnds=[13,76][127,211]} from pid 607

3.浏览器和本地APK的交互

Android manifest标签参考官方的开发指南

下面是UC的一个

设置

标签,可以拦截浏览器的请求,data可以增加过滤的条件。为了防止我们的启动APK scheme被其它应用拦截,尽量使用唯一的标识符如域名等。

在android应用中application的详细配置实例:

在MainActivity增加了

过滤器。

android:allowBackup=“true”

android:icon=“@drawable/ic_launcher”

android:label=“@string/app_name”

android:theme=“@style/AppTheme” >

android:name=“demo.testjs.MainActivity”

android:label=“@string/app_name” >

在web页面中加入如下测试代码

测试页面

APK客户端下载链接

//ios判断  if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i))

//判断是否是android设备浏览器   if (navigator.userAgent.match(/android/i)) {

if (navigator.userAgent.match(/android/i)) {

document.getElementById(‘openApp’).onclick = function(e) {

// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为

// 否则打开a标签的href链接

var ifrSrc = ‘testjs://platformapi/startApp?name=tom&age=18′;

if (!ifrSrc) {

return;

}

var ifr = document.createElement(‘iframe’);

ifr.src = ifrSrc;

ifr.style.display = ‘none’;

document.body.appendChild(ifr);

setTimeout(function() {

document.body.removeChild(ifr);

}, 1000);

};

if (document.all) {

document.getElementById(‘openApp’).click();

}

// 其它浏览器

else {

var e = document.createEvent(“MouseEvents”);

e.initEvent(“click”, true, true);

document.getElementById(“openApp”).dispatchEvent(e);

}

}

新建web工程,加入测试页面。在手机浏览器上访问该页面,如果本地安装了对应的APK,则会启动APK,没有安装则跳转到对应的下载页面。以上web页面的脚本从支付宝手机客户端访问的页面截取的。(UC7.8版本的android浏览器可以下载保存网页)

4.获取浏览器传递的值

var ifrSrc = ‘testjs://platformapi/startApp?name=tom&age=18′;

实例中会提交name和age值

在activity中可以取到通过浏览器传递的值

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

if(Intent.ACTION_VIEW.equals(getIntent().getAction())){

Intent intent = getIntent();

String scheme = intent.getScheme();

Uri uri = intent.getData();

Log.e(tag, “scheme: “+scheme);

Log.e(tag, “path: “+uri.getPath());

Log.e(tag, “Host: “+uri.getHost());

Log.e(tag, “name: “+uri.getQueryParameter(“name”));

Log.e(tag, “age: “+uri.getQueryParameter(“age”));

}

}

可以取到scheme、 url、参数列表等信息

PS:浏览器实际上没有办法判断到本地是否安装了对应的APK文件,支付宝的web前端实现实际上了打开了一个隐藏的url地址,该url如果被本地apk拦截,则启动本地apk,如果url没有被拦截,则在1S后删除添加的’iframe’,跳转到下载页面。(不管url是否被本地拦截成功,1S后都会跳转下载页面,只不过拦截成功,本地APK启动页面会遮住浏览器的下载页面)

参考其它人用window.location 或   window.open标签也可以启动本地APK,但没有处理url跳转不存在的问题。(window.open未测试成功)

window.location实现方式:

AndroidManifest.xml配置

web页面添加

alert(“启动APK”);

window.location=”testjs://demo.testjs”;

android 如何启动apk,Android JS启动APK相关推荐

  1. 【Android 插件化】VirtualApp 接入 ( 安装 APK 插件应用 | 启动插件 APK 应用 | MainActivity 安装启动插件完整代码 )

    文章目录 一.安装 APK 插件应用 二.启动插件 APK 应用 三.MainActivity 完整代码 四.博客源码 一.安装 APK 插件应用 调用 VirtualCore.get().insta ...

  2. Android 浏览器的研究(四)--- Apk的启动和主页的加载过程

    当我们在Launcher中点击浏览器的图标时,浏览器的窗口会打开并显示主页(HomePage).这里我们对这一场景进行分析,研究浏览器如何启动,取得缺省主页并将它布局和显示的. 根据前边对WebVie ...

  3. Android开发——Android系统启动以及APK安装、启动过程

    0. 前言   从Android手机打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的? 1.  系统上电 当给Android系统上电,在电源接通的瞬间,CPU内的寄存器和各引脚均会被 ...

  4. Android 4.0.4系统下实现apk的静默安装和启动

    转自http://www.linuxidc.com/Linux/2013-02/79403.htm 未亲测 最近在Android 4.0.4系统下实现apk的静默安装和启动的功能,这里和大家分享一下, ...

  5. Unity发布Android APK去掉Unity启动Logo教程

    Unity发布Android APK去掉Unity启动Logo教程 我们要解决的问题: 黑屏时间问题和启动Logo问题,之所以黑屏是因为Activity启动后mUnityPlayer 中的内容还没有准 ...

  6. android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]

    1 章节目录 2 Android Activity综述 2.1 Activity怎么用 2.2 layout - 界面布局 2.3 Java - 控制界面 2.4 AndroidManifest.xm ...

  7. Android 10.0 PackageManagerService(三)APK扫描-[Android取经之路]

    摘要:上一节讲解了PKMS的 权限扫描,扫描/system/etc/permissions中的xml,存入相应的结构体中,供之后权限管理使用. 这一节主要来讲讲APK的扫描. 阅读本文大约需要花费15 ...

  8. Android 10.0 PackageManagerService(一)工作原理及启动流程-[Android取经之路]

    摘要:PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责APK.jar包等的管理. 阅读本文大约需要花费50分钟. 文章的内容主要还是从 ...

  9. Android10.0系统启动之Launcher(桌面)启动流程-[Android取经之路]

    摘要:上一节我们讲完了Android10.0的ActivityManagerService的启动流程,在AMS的最后启动了Launcher进程,今天我们就来看看Launcher的真正启动流程. 阅读本 ...

  10. Android 10.0 系统服务之ActivityMnagerService-AMS启动流程-[Android取经之路]

    摘要:上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程. ActivityManagerService简称AMS ...

最新文章

  1. 迎接奥运会 里约把机场的IT建设翻新了下
  2. JavaScript中的剪贴板(clipboardData)
  3. 优化算法-共轭梯度法
  4. 研究生的早期科研之路
  5. JAVA关于父亲节的代码_关于父亲节的经典语录
  6. 虚幻引擎发布4.8版,支持VR虚拟设备
  7. 模式(一)javascript设计模式
  8. arcgis中的python字符串比较
  9. Linux——tar打包文件和压缩解压缩
  10. CSS3新单位vw,vh,vmin,vmax详解
  11. 数据结构之基于Java的最优二叉树实现
  12. 图片上传插件WebUploader的坑
  13. windows安装python3_windows下同时安装python2和python3
  14. iOS-UI分析利器--Reveal安装破解以及简单使用
  15. shell脚本格式的几点注意:格式严格,空格不能随便出现(一写就记不住)
  16. 企业AD域管理利弊_如何避免企业AD域管理中的各种弊端?
  17. 如何制作互联网区块链PPT模板?
  18. 今年11月初阿里巴巴社招面试经历分享,Java工程师方向已拿offer【附学习方法】
  19. dell服务器设置bios设置u盘启动不了系统,戴尔台式机bios设置图解教程|dell bios设置u盘启动...
  20. mocc javascript

热门文章

  1. “蔚小理”想挑战特斯拉?先干过比亚迪再说
  2. python代码表达失恋_罗建军失恋
  3. 计算机系统动态库修复,电脑系统windows7出现无法定位动态链接库user32.dll错误提示解决措施...
  4. Navicat备份数据库和还原数据库详解
  5. 电脑数据丢失没有备份怎么找回?
  6. GAMES101-现代计算机图形学入门-闫令琪——Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering) 学习笔记
  7. 当自己觉得特别迷茫的时候,是怎么走出这个困境的
  8. 对音频压缩概念的一些误解--记一次与音视频压缩专家的对话
  9. 红外遥控接收发射原理及ESP8266实现
  10. 新唐单片机选型手册_Nuvoton新唐8位8051单片机选型指南