簡體   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