Android 通过外部调起到app

825 阅读3分钟

安卓有两种启动方式 一种显示启动 一种是隐式启动

1:显示启动

Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);

2:隐式启动 当我们通过h5调起app的时候就需要使用隐式启动

接收隐式 Intent

要公布应用可以接收哪些隐式 Intent,请在清单文件中使用 <intent-filter> 元素为每个应用组件声明一个或多个 Intent 过滤器。每个 Intent 过滤器均根据 Intent 的操作、数据和类别指定自身接受的 Intent 类型。仅当隐式 Intent 可以通过 Intent 过滤器之一传递时,系统才会将该 Intent 传递给应用组件。

请注意: 显式 Intent 始终会传递给其目标,无论组件声明的 Intent 过滤器如何均是如此。

应用组件应当为自身可执行的每个独特作业声明单独的过滤器。例如,图像库应用中的一个 Activity 可能会有两个过滤器,分别用于查看图像和编辑图像。当 Activity 启动时,将检查 Intent 并根据 Intent 中的信息决定具体的行为(例如,是否显示编辑器控件)。

每个 Intent 过滤器均由应用清单文件中的 <intent-filter> 元素定义,并嵌套在相应的应用组件(例如,<activity> 元素)中。在 <intent-filter> 内部,您可以使用以下三个元素中的一个或多个指定要接受的 Intent 类型:

  • <action>

    在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。

  • <data>

    使用一个或多个指定数据 URI(schemehostportpath)各个方面和 MIME 类型的属性,声明接受的数据类型。

  • <category>

    在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。

    以下是隐式启动的例子

<activity android:name=".ActivityA">

    <intent-filter>
        <action android:name="android.intent.action.VIEW" /> //可以设置多条只要其中一条匹配就可以打开这个Activity 但是这个是默认的
        
        <action android:name="com.example.action.ACTIVITYA" /> //自定义

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="com.example"//可以设置自己的包名
            android:pathPrefix="/open"
            android:scheme="example" />

    </intent-filter>
    
</activity>

<data>标签中主要可以配置以下内容。

1.  android:scheme
用于指定数据的协议部分。
2.  android:host
用于指定数据的主机名部分。
3.  android:port
用于指定数据的端口部分,一般紧随在主机名之后。
4.  android:path
用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
5.  android:mimeType
用于指定可以处理的数据类型,允许使用通配符的方式进行指定。只有标签中指定的内容和 Intent 中携带的 Data 完全一致时,当前活动才能够响应该 Intent。不过一般在标签中都不会指定过多的内容,常见的是mimeType和 scheme。

如果是网页打开app的话是这样的:example://com.example/open

如果app打开别的app是这样的:startActivity(new Intent().setAction("com.example.action.ACTIVITYA"));

如果我打开app还要传数据过去呢网页打开的链接是这样的:example://com.example/open?sex=man&age=19

在app内获取参数数据

if (getIntent().getAction().equals("com.example.action.ACTIVITYA")){
    Uri data = getIntent().getData();
    String sex = data.getQueryParameter("sex");
    String age = data.getQueryParameter("age");
}

参考链接:

# Android 隐式启动 Activity 可能存在的坑

# 安卓Activity隐式启动全面解析

# Android 实现浏览器打开app