Android技能树点亮计划-多module路由跳转

170 阅读3分钟

背景

Android的路由通过intent进行跳转,intent分为显示Intent和隐式intent

显示Intent

通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。
一般用于在同一个模块中的路由跳转。

startActivity(new Intent(this, FloatWindowActivity.class));

隐式 Intent

不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理
一般用于不同模块的Activity进行跳转


Uri uri = Uri.parse("youer://io.github.pettywing/floatwindow");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
 
// AndroidManifest.xml
<activity android:name=".FloatWindowActivity">
    <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data
        android:host="io.github.pettywing"
        android:path="/floatwindow"
        android:scheme="youer" />
    </intent-filter>

</activity>

本文章主要面向的是多模块的情况,所以这里主要讲隐式Intent,使用隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。如果 Intent 与 Intent 过滤器匹配,则系统将启动该组件,并向其传递 Intent 对象。如果多个 Intent 过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用

IntentFilter 的匹配规则

1.action 的匹配规则

  • action在Intent-filter可以设置多条
  • intent中必须指定action否则匹配失败且intent中action最多只有一条
  • intent中的action和intent-filter中的action必须完全一样时(包括大小写)才算匹配成功
  • intent中的action只要与intent-filter其中的一条匹配成功即可

2.category的匹配规则

  • category在intent-filter中可以有多条
  • category在intent中也可以有多条
  • intent中所有的category都可以在intent-filter中找到一样的(包括大小写)才算匹配成功
  • 通过intent启动Activity的时候如果没有添加category会自动添加android.intent.category.DEFAULT,如果intent-filter中没有添加android.intent.category.DEFAULT则会匹配失败

3.data的匹配规则

  • intent-filter中可以设置多个data
  • intent中只能设置一个data
  • intent-filter中指定了data,intent中就要指定其中的一个data
  • setType会覆盖setData,setData会覆盖setType,因此需要使用setDataAndType方法来设置data和mimeType处。
  • data的语法
<data 
  android:host="string"
  android:mimeType="string"
  android:path="string"
  android:pathPattern="string"
  android:pathPrefix="string"
  android:port="string"
  android:scheme="string"/>

scheme://host:port/path|pathPrefix|pathPattern

优点

  1. 适用于多模块架构的页面之间跳转
  2. 可以方便替换路由为h5路由,h5和native都可以通过params进行传参,接受页面通过getQueryParams来解析
// 跳转前
Uri.Builder uriBuilder = Uri
            .parse("youer://io.github.pettywing/floatwindow")
    .buildUpon();
// 添加url后续构建的参数
uriBuilder.appendQueryParameter("test", "xxx");
uriBuilder.appendQueryParameter("test2", "yyy");
// 实际生成的url为 youer://io.github.pettywing/floatwindow?test=xxx&test2=yyy
Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(uriBuilder.build());
        startActivity(intent);
// 跳转后
getIntent().getData().getQueryParameter("test")
  1. 可以在同一路由拦截里面通过判断目标地址的activity是否存在来添加兜底,如果不存在直接拉起web页面
ResolveInfo info = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
//List<ResolveInfo> info2 = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if(info ==null){
    // 对应的activity找不到,拉起webView页面
}

实践

Floatwindow仓库

找到我

Android技能树点亮计划Git库
Android技能树点亮计划-语雀文档库
稀土掘金:悠二
Github:PettyWing