一举手一投足采纳开辟时常境遇应用跳转、h5唤起原生页面等应用处境,所以一个硬朗的运用要求全数路由的力量。常见的操作方法供给在manifest中针对各样页面进行布署,虚构应用有恢宏的页面那配置专业岂不是费时费劲,所以大家便来共同探望Android
Studio 2.3给大家带来了怎么着实惠

原文:Android M App Links: implementation, drawbacks and
solutions
在上次的I/O大会上,谷歌(Google)发表了Android M 支持app链接(App
Links),Google正在极力的推进深度链接(deep linking)。那将对Android
M的顾客体验变成深刻的积极影响,客户点击三个web链接就能平素跳转到app。
在Android M在此之前,点击多少个链接会产生三个弹出框,询问顾客张开哪个应用 -
包含浏览器采纳。可是谷歌(Google)在Android M
达成了二个自动认证(auto-verify)机制,让开采者能够避开这么些弹出框,使客商不用去挑选四个列表,直接跳转到他们的app。

引子

那篇文章会告诉你

  • 如何是路由,是为着解决什么难点才发出的
  • 业界现状是哪些的,我们得以做什么样来优化当前的题材
  • 路由设计思路是何许的,该怎么统一计划相比较好
  • 怎么用注明实现路由表
  • UQX56L的参数如何依附注入到Activity、Fragement
  • 如何HookOnActivityResult,无需再展开requstCode判别
  • 如何异步拦截路由,实现线程切换,不封堵页面跳转
  • 如何用Apt实现Retrofit接口式调用
  • 怎么着找到Activity的调用方
  • 什么样完毕路由的安全调用
  • 怎么躲避Apt金沙娱樂城,无法集中全部Module路由的主题材料

App Links是Android
M以上的蓄意功用,即完毕了auto-verify支撑客商点击二个链接就可以唤起应用程式,而不用像未来版本中要求点击二个选取框列表。为了使自身的选用支撑App
Links
,大家常需求以下多少个步骤:

金沙娱樂城 1

前言

当下Android的路由库实在太多了,刚起先的时候想怎么要用路由表的库,用Android原生的Scheme码不就好了,又不像iOS只好类注重,后边越深刻就越开采立刻想的太简单了,前面看到Retrofit和OkHttp,才想到页面伏乞精神和互联网乞请不是同样呢,终于业界最简便便捷的路由方案1.0出来了
开源的库后边会放在店堂github地址上面

  • 在manifest中创建Intent filter
  • 在Activity中编辑对应的代码逻辑管理收到的url links
  • 透过布署证书文件,关联网页和采取

在app的manifest中增添auto-verify(右侧)而且在web服务器上加多叁个statements JSON
文件(右侧)就能够令你的web链接张开三个app。
翻译注:statements JSON
文件即贰个叫statements.json的文件,前面会波及。
要找到谷歌(Google)的App Links文书档案与掌握它须要花点时间(你不得不寻觅“Android M App
Links”关键词才具找到)。那一个文档这两天只是轻巧的叙说了那一个话题,可是大家将扶助你详细询问完毕的细节,它的瑕玷以及怎样利用大家的smart
links消除这几个难点。HOKO的各类客商端最近都曾经支撑Google的App
Link,轻松加欢喜。
什么是App Links?
Google的App
Link让顾客在点击贰个平常web链接的时候能够张开钦点app的钦点页面,前提是以此app已经设置还要通过了验证,不然会来得一个开采选项的弹出框。自此,在安卓中开发叁个链接的顾客体验大大进步,客商能够在链接与app之间相当慢切换。
比如,点击Google关于美食指南的移动寻找结果恐怕三个别人发来的美食指南链接会直接导航你到与该链接域名相关的app的美食做法页面。

背景

Android Studio 2.3及以上版本中提供了App Links
Assistant扶助开垦者举行神速布署,该意义可在tools > App Links
Assistant
中开启。

金沙娱樂城 2

什么是路由

根据路由表页面请求分发到内定页面

金沙娱樂城 3App
Links Assistant

而点击一条推文(Tweet)的web链接会直接带你到Twitter应用的相关推文页面。
注:用页面形容app的屏貌似也不太准确哈~
web链接可以在随机地点发送,公布,或者展开,因为他们便是一般的链接,并且一旦出现了哪些错误,则会像平日同样用浏览器展开那一个web页面。
落到实处App Links其实特别轻松,然而首先你必要确认保证满意一些列要求:
有三个注册了的域名

接纳情状

  1. App接收到八个布告,点击通告打开App的有些页面
  2. 浏览器App中式茶食击有些链接张开App的某部页面
  3. 运转活动必要,动态把原生的页面替换来H5页面
  4. 开垦页面需求一些原则,先验证完条件,再去开采那些页面
  5. 非法的张开App的页面被屏蔽掉
  6. H5张开链接在全部平台都同样,方便统一跳转
  7. App存在就开拓页面,一纸空文就去下载页面下载,只有谷歌的App Link扶助

配置Intent filsters

率先展开UEscortL相配法则编辑器,配置基本的Scheme、Host等音讯,并点名关联的Activity对那块不是很了然的同窗能够点击App
Manifest驾驭各类字段的意思以及先行级。

金沙娱樂城 4URL
Mapping

布局完成后可查阅已布局的映射的涉及,并能够经过输入URAV4L举行校验是不是调通

金沙娱樂城 5URL-to-Activity

域名的SSL通道

缘何要有路由

Android原生已经支撑AndroidManifest去管理App跳转,为何要有路由库,那大概是超过一半人接触到Android种种Router库不老子@楚的地点,这里自身讲一下本人的明亮

  • 呈现Intent:项目庞大今后,类重视耦合太大,不吻合组件化拆分
  • 隐式Intent:合营困难,调用时候不清楚调什么参数
  • 各样注册了Scheme的Activity都足以一向张开,有康宁风险
  • AndroidMainfest聚焦式管理相比较臃肿
  • 束手无策动态修改路由,倘使页面出错,无法动态降级
  • 没辙动态拦截跳转,例如未登入的情形下,张开登入页面,登入成功后随着展开刚才想张开的页面
  • H5、Android、iOS地址不平等,不便利统一跳转

选择Activity

配置好mapping后,点击Select
Activity
挑选上述配置好的Activity可自动生成以下代码。变量appLinkData以Uri的格局积累了开展传递的数目,针对具体页面开采者可编写制定特定的拍卖逻辑。

 // ATTENTION: This was auto-generated to handle app links. Intent appLinkIntent = getIntent(); String appLinkAction = appLinkIntent.getAction(); Uri appLinkData = appLinkIntent.getData();

具备上传JSON文件到域名的力量

怎么着的路由才算好路由

路由提起底依旧为了化解开垦者遭逢的各样奇葩供给,使用简易、侵入性低、维护方正是主要条件,不影响您原本的代码,写入代码也相当少,这里将要说说自个儿的OkDeepLink的中国共产党第五次全国代表大会效用了,中国共产党第五次全国代表大会效果一下子击中您的各个痛点,早点下班不是梦。

  • 编写翻译时表明,达成静态路由表,不再须求在重叠的AndroidManifest中找到拾壹分Actvity写Scheme和Intent
    Filter
  • 异步拦截器,完结动态路由,安全拦截、动态降级难不倒你
  • 模仿Retrofit接口式调用,完毕格局用apt,不耗品质,参数调用不再是难点
  • HookOnActivityResult,支持奥迪Q7xJava响应式调用,不再须要开展requestCode判定
  • 参数依赖注入,自动保存,不再供给手动写onSaveInstanceonCreate(SaveInstace)onNewIntent(Intent)getQueryParamer

金沙娱樂城 6

注册路由

金沙娱樂城 7

路由结构图

波及应用

前两步已经使大家的采纳具有了UHavalL扶助,在结尾一步中大家将生成站点的布署文件,使其能够唤起大家的应用。此处需求依附个人用途选用Signing
config
keystore并选用debug/release类型,点击生成的布局文件为assetlinks.json,并将其上传至本人的站点。

金沙娱樂城 8Associate
Website

传说官方文档,特别注意的是系统识别Links需求通过https公约,故大家须求确认保障assetlinks.json能够经过https链接,无论大家的行使是还是不是在Intent-filter中包涵了https

经过配备assetlinks.json咱俩得以使站点具有唤起单一应用程式只怕七个应用软件的力量,文件中央银行使了以下字段来关联app:

  • package_name 即manifest中定义的包名
  • sha256_cert_fingerprints 即应用的sha256指纹证书

而指纹证书能够调用命令行实行改换$ keytool -list -v -keystore my-release-key.keystore若须求关联七个app,能够参照上边包车型大巴格式进行配备

[{ "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "example.com.puppies.app", "sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"] } }, { "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "example.com.monkeys.app", "sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"] }}]

最终点击Test App Links能够在设备或模拟器上举行测量试验。

Android Studio 1.3 Preview
(download)

详尽相比

大部路由库都用Apt(编写翻译时注脚)生成路由表,然后用路由表转载到内定页面

方案对比 OkDeepLink Airbnb DeepLinkDispatch 阿里 ARouter 天猫 统跳协议 ActivityRouter
路由注册 注解式接口注册 每个module都要手动注册 每个module的路由表都要类查找 AndroidManiFest配置 每个module都要手动注册
路由查找 路由表 路由表 路由表 系统Intent 路由表
路由分发 Activity转发 Activity转发 Activity转发 Activity转发 Activity转发
动态替换 Rxjava实现异步拦截器 不支持 线程等待 不支持 不支持
动态拦截 Rxjava实现异步拦截器 不支持 线程等待 不支持 主线程
安全拦截 Rxjava实现异步拦截器 不支持 线程等待 不支持 主线程
方法调用 接口 手动拼装 手动拼装 手动拼装 手动拼装
参数获取 Apt依赖注入,支持所有类型,不需要在Activity的onCreate中手动调用get方法 参数定义在path,不利于多人协作 Apt依赖注入,但是要手动调用get方法 手动调用 手动调用
结果返回 Rxjava回调 onActivityResult onActivityResult onActivityResult onActivityResult
Module接入不同App 支持 不支持 支持 不支持 支持

骨子里说起底,路由的精神正是注册再倒车,围绕着转会可以进行种种操作,拦截,替换,参数获取等等,别的Apt、ENVISIONxjava提起底都只是为着方便使用出现的,这里你会意识各类路由库反而为了修补各个工具带来的主题素材,出现了本来未有的标题,例如DeepLinkDispatch为了消除Apt无法汇总全部Module路由,每种module都要手动注册,ARouter为了减轻Apt没办法汇总全体Module路由,通过类操作耗费时间,才面世分组的概念。

缺陷

使用App Links能为开拓者带来有利,但眼下还是有多少个不足忽略的缺欠:

  • 当app配置好了对App Links的支撑之后,只有运维在Android
    M上的客户才具直接体会到这项好处
  • 开采者须求保养与App相关联的站点,并辅助上传认证文件,恐怕引致越来越大的工本精力费用

Gradle 版本 — com.android.tools.build:gradle:1.3.0-beta3

原理剖析

金沙娱樂城 9

原理流程图

扩展

利用App Links
Assistant
我们能够快速安排利用全局路由的支撑,由于manifest中已存在url与activity的映射关系,大家能够依据Intent和PackageManager设计一个轻易易行的路由框架。比起手动在manifest增加和删除,App
Links Assistant
能帮衬大家神速管理当前的投射关系并张开测验。

设置 compileSdkVersion 为 android-MNC

定义路由

金沙娱樂城 10

路由定义

对应路由的概念,产业界有二种做法

  1. 参数放在path里面
  2. 参数放在query里面

参数定义在path里面包车型地铁做法,有无需额外传参数的功利,不过并未有那么灵活,调节和测量试验起来也未曾那么平价。

参照他事他说加以考察文献

1.Handling App Links2.Add Android App Links

buildToolsVersion — 23.0.0 rc2

路由注册

AndroidManifest里面的acitivity证明scheme码是不安全的,全体App都足以打开那个页面,这里就发生有三种方法去登记,

  • 疏解产生路由表,通过DispatchActivity转发
  • AndroidManifest注册,将其export=fasle,不过再通过DispatchActivity转载Intent,Tmall正是如此做的,比位置的情势的利润是路由查找都是系统调用,省掉了爱抚路由表的进度,然而AndroidManifest配置也许相比较不方便人民群众的
  • 表明自动修改AndroidManifest,这种方法能够制止路由表汇总的难点,方案是那般的,用自定义Lint扫描出注脚相关的Activity,然后在processManifestTask后面修改Manifest

自家现在照旧利用了讲解,第两种不安静

只要以上需要全都满意,只需遵循以下三步就可以让App Links
工作在你的app上。

生成路由表

思路都以用Apt生成U汉兰达L和activity的相应关系

Airbnb

@DeepLink("foo://example.com/deepLink/{id}")
public class MainActivity extends Activity {
  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }
}

生成

public final class SampleModuleLoader implements Parser {
  public static final List<DeepLinkEntry> REGISTRY = Collections.unmodifiableList(Arrays.asList(
    new DeepLinkEntry("foo://example.com/deepLink/{id}", DeepLinkEntry.Type.METHOD, MainActivity.class, null)
    ));

  @Override
  public DeepLinkEntry parseUri(String uri) {
    for (DeepLinkEntry entry : REGISTRY) {
      if (entry.matches(uri)) {
        return entry;
      }
    }
    return null;
  }
}

阿里Arouter

@Route(path = "/deepLink")
public class MainActivity extends Activity {
 @Autowired
    String id;
  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }
}

生成

public class ARouter$$Group$$m2 implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/deepLink", RouteMeta.build(RouteType.ACTIVITY, MainActivity.class, "/deepLink", null, null, -1, -2147483648));
  }
}

Activity Router

@Router("deeplink")
public class ModuleActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

生成

public final class RouterMapping_sdk {
  public static final void map() {
    java.util.Map<String,String> transfer = null;
    com.github.mzule.activityrouter.router.ExtraTypes extraTypes;

    transfer = null;
    extraTypes = new com.github.mzule.activityrouter.router.ExtraTypes();
    extraTypes.setTransfer(transfer);
    com.github.mzule.activityrouter.router.Routers.map("deeplink", ModuleActivity.class, null, extraTypes);

  }
}

OkDeepLink

public interface SampleService {


    @Path("/main")
    @Activity(MainActivity.class)
    void startMainActivity(@Query("key") String key);
}

生成

@After("execution(* okdeeplink.DeepLinkClient.init(..))")
  public void init() {
    DeepLinkClient.addAddress(new Address("/main", MainActivity.class));
  }

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注