繁体   English   中英

使用隐式意图在同一个应用程序中启动另一个活动

[英]Use implicit intent to launch another activity in the same app

所以最近在一次采访中,有人问我是否可以使用隐式意图从 Activity A 启动 Activity B。据我了解,我们可以这样做,但它会导致操作系统显示一个弹出窗口并且用户选择哪个应用程序(如果有多个)从中选择。 那么在什么情况下,这对于在同一个应用程序中以隐式意图启动另一个活动很有用。

您可以定义自己的隐式意图,也可以定义意图过滤器

示例:在您应用的AndroidManifest.xml

 <activity
      android:name=".MyActivity"
      android:launchMode="singleTop">
   <intent-filter>
      <action android:name="com.my.app.NAME" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:mimeType="text/plain" /> 
   </intent-filter>
</activity>

因此,您的 Activity 会侦听特定的意图操作。

以下是您的应用程序(或任何其他应用程序)如何使用隐式意图打开此活动:

          val sendIntent = Intent().apply { 
            action = "com.my.app.NAME"
            type = "text/plain"
            putExtra("EXTRA_KEY","some argument I want to pass as an Extra")
          }

在发送自定义隐式意图之前,您应该始终通过包管理器验证是否有可以处理它的 Activity


// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(context.packageManager) != null) {
    startActivity(sendIntent)
}

我认为这可以通过使用Activity B 识别的自定义action定义自定义intent-filter来完成。假设您想从Activity A 启动Activity B,您将使用指定的action创建一个implicit intent ,然后它将启动Activity B。不过,我想不出具体的用例。

所以最近在一次采访中,有人问我是否可以使用隐式意图从 Activity A 启动 Activity B

是的,我们可以使用隐式意图在活动之间导航。

据我了解,我们可以做到这一点,但它会导致操作系统显示一个弹出窗口和用户选择要选择的应用程序(如果有多个)。

正确的。 在这种情况下隐含意味着我们不知道哪个应用程序将处理我们的意图。 当我们有多个应用程序来处理类似任务时,这可能很有用。 例如,您有多个应用程序来处理图像、发送 email、打开文件等等。

但是,我们可以通过传递 package id 来隐含地只打开一个应用程序。

val action = "com.example.myapp.myaction"
val packageId = "com.example.myapp"
val intent = Intent(action, packageId)

这是可能的,因为 Play 商店中的应用程序保证具有唯一的 package id(也称为应用程序 id)。 因此,如果您在“com.example.myapp”的应用程序 ID 下发布您的应用程序,您的用户只会打开您的应用程序。

那么在什么情况下,这对于在同一个应用程序中以隐式意图启动另一个活动很有用。

这种技术通常用于多模块项目中的 Activity 之间的导航(模块化)。 在多模块项目中,功能模块(具有 Activity 的模块)彼此之间没有依赖关系。 这意味着,您不能使用明确的意图。

// Will cause ClassNotFoundException since 
// AnotherActivity does not exist!
val intent = Intent(context, AnotherActivity::class.java)

这就是隐式意图派上用场的地方。 功能 A 可以使用隐式意图来启动功能 B (AnotherActivity)。

<activity android:name="AnotherActivity" android:exported="false">
    <intent-filter>
        <action android:name="com.example.myapp.myaction"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

笔记:

  • 还有另一种在功能模块中的 Activity 之间导航的方法,它使用目标的接口,目标 Activity 将实现该接口。 但这与这个问题无关。

  • 如果您使用单活动架构,其中每个屏幕由片段(而不是活动)表示,您可以使用 Jetpack 导航库的深度链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM