Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

如何創建即時應用程序功能

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Traditional) (中文(繁體)) translation by Zhang Xiang Liang (you can also view the original English article)

Android即時應用程式是讓應用程式盡可能多的被用戶使用的新方式。

在您的項目中添加即時應用程序支持後,用戶甚至不需要安裝應用程序來訪問其內容和功能 - 通過點擊壹個URL它們可以根據需要加載應用程序的整個部分。

在這三部分系列中,我將討論將Android即時應用程序支持添加到Android項目的整個過程,所以在完成之後,您將完全了解如何創建能在任何支持URL的位置被發現和訪問的Android應用程序。

在第壹篇文章中,我們研究了即時應用程序是什麽、其工作原理以及為什麽這項新功能對Android開發人員和Android用戶來說是如此大的消息。以前,我們走了捷徑,並創建了壹個內置即時應用程序支持的Android項目,但我們並沒有看到如何為現有項目添加即時應用程序支持,所以這就是本文要討論的內容。

我還將介紹如何實現App Links,因此在本文結尾處,您將創建壹個功能齊全的即時應用程序,您可以在任何兼容的Android設備上啟動和測試。

下載示例項目 

向項目添加即時應用程序支持通常需要對該項目的結構進行壹些非常大的改變。

有可能您不太想通過完全改變自己的Android項目的結構來嘗試新功能,所以我提供了壹個可以從GitHub下載的示例應用程序。在整篇文章中,我們將更新這個具體的項目以支持即時應用程序功能。

從GitHub下載MyLocation項目並在Android Studio中打開它。妳會看到這是壹個非常簡單的項目,由包含壹個Activity(MapsActivity)的單個應用程序模塊組成 。

The MyLocation project displays your current location on a Google Map

雖然您可以在當前狀態下安裝並啟動此項目,但如果MapsActivity將顯示任何實際內容,則需要生成API密鑰並將其添加到此項目中:

  • 打開項目的res/values/google_maps_api.xml文件。
  • 按照此文件中的說明生成您的Google Maps API密鑰。
  • 將生成的密鑰復制/粘貼到google_maps_api.xml文件中:

我們將更新此項目,以便即時應用程序可以使用其單壹功能(即在地圖上顯示用戶當前位置的功能)。要實現這壹點,我們要完成以下步驟:

  • 創建壹個基本功能模塊,其中包含傳遞此單個功能所需的所有代碼和資源。
  • 創建即時應用程序模塊,作為我們即時應用APK的容器。
  • 使用“應用程序鏈接”將特定URL映射到此基本功能模塊。

在開始之前,還需要註意以下幾點:

  • 在下壹篇文章之前,我們不會在此項目中添加任何其他功能模塊。然而,正如您將看到,當我們來測試MyLocation時,完全可以通過創建基本功能模塊和即時應用程序模塊為項目添加即時應用程序支持 - 額外的功能模塊是可選功能。
  • 由於MyLocation項目僅由壹個功能組成,所以我們幾乎需要將所有代碼和資源都包含在基本功能模塊中。通過將該項目的應用程序模塊轉換為基本功能模塊,然後創建壹個新的模塊替代應用程序模塊,我們可以更輕松地完成此任務。  這是壹個方便的快捷方式,您可以在將即時應用功能添加到自己的現實生活中的Android項目中時使用。但是,如果這個快捷方式對於特定的項目是不可行的,那麽您需要創建壹個新的模塊來充當您的基本功能模塊,然後花費壹些時間將所有相關代碼和資源移動到新的基本功能模塊中。

將應用程序模塊轉換為基本功能模塊

我們的第壹個任務是將MyLocation的應用程序模塊轉換為基本功能模塊。

當妳有多個模塊的工作,盡早建立命名約定是有幫助的,所以在這篇文章中,我將要追加每個模塊的類型(-app,-base,-instantapp等)模塊的名稱:

  • Control -點擊應用程序目錄並選擇Refactor> Rename ...
Select Refactor Rename from the context menu
  • 在“ Rename module”模塊窗口中,輸入mylocation-base,然後單擊“ 確定”。
  • 打開新命名的mylocation-base模塊的build.gradle文件。第壹行顯示,該模塊仍在使用默認com.android.application插件; 但是,所有功能模塊都必須使用com.android.feature插件,因此您需要將其更改為apply plugin: 'com.android.feature.'。
  • 明確指出,該模塊是您項目的唯壹基礎功能模塊,通過將baseFeature true屬性添加到android代碼塊。
  • 支持即時應用功能的任何項目都將不可避免地由多個模塊組成,但您只需要壹次聲明該項目applicationID即可。為了避免沖突和混亂,您應該從項目的其余部分刪除此屬性,因此請在mylocation-base的build.gradle文件中找到applicationID屬性,然後將其刪除。

完成所有這些步驟後,mylocation-base的 build.gradle文件應該如下所示:

創建應用程序模塊

此時,MyLocation缺少壹個應用程序模塊,所以讓我們創建壹個:

  • 從Android Studio工具欄中選擇新建>新建模塊...。
  • 在出現的窗口中,選擇手機和平板電腦,然後單擊下壹步。
  • 堅持我們建立的命名約定,將這個模塊命名為mylocation-app。單擊下壹步。
  • 此模塊應包含要包含在可安裝應用程序中的代碼和資源,但為了保持盡可能簡單的方式,請單擊“ 添加無activity”,然後單擊“ 完成”。
  • 打開妳的mylocation-app模塊的清單文件。如果您回到上壹篇文章中創建的項目,您會記得應用程序模塊的清單幾乎是空的,因為最終將散布在整個項目中的所有其他清單的內容將與此文件合並。 這正是我們的MyLocation項目會發生的,所以為了避免合並過程中的任何沖突,妳應該刪除這個清單的整個application塊。 .
Delete the application block of code from your Manifest
  • 打開mylocation-app模塊的build.gradle文件。該模塊取決於我們的mylocation-base模塊,因此從dependencies塊中刪除所有代碼,並將其替換為以下內容:
  • 通過切換到Android Studio的Project視圖並刪除src / androidTest目錄,從應用程序模塊中刪除所有未使用的文件和目錄。然後,打開主目錄並刪除Java、res和test目錄。
Delete the following files and directories srcandroidTest mainJava mainres and maintest

我們已將MyLocation的所有功能成功地移植到可共享的基本功能模塊中。由於這需要我們對項目結構進行壹些非常大的改變,所以您應該檢查MyLocation是否仍然可以作為可安裝的應用程序運行:

  • 啟動我們在第壹部分創建的AVD(Android虛擬設備),或連接與即時應用功能兼容的物理Android設備 - 在撰寫本文時,僅限於Nexus 5X、Nexus 6P、Pixel、Pixel XL、或運行Android 6.0或更高版本的Galaxy S7。
  • 從Android Studio工具欄中選擇運行>運行...。
  • 選擇mylocation-app模塊。
  • MyLocation應用程序將顯示在屏幕上,假設您為此項目生成了Google Maps API密鑰,則應顯示壹些Google Maps內容。

創建即時應用模塊

即時應用程序模塊滿足簡單但重要的任務,作為您的項目生成的所有即時應用APK的容器。要創建此模塊:

  • 從Android Studio工具欄中選擇文件>新建>新建模塊...。
  • 在後續窗口中,選擇“ 即時應用”,然後單擊“ 下壹步”。
  • 給這個模塊命名為mylocation-instantapp,然後單擊完成。
  • 由於此即時應用程序模塊僅存在於包含我們的基本功能的模塊,因此我們需要打開其build.gradle文件並聲明mylocation-base為依賴關系:

添加應用程序鏈接到項目

用戶通過點擊映射到基本功能或功能模塊的URL來啟動即時應用程序。這個URL可能在任何地方 - 也許這是朋友通過電子郵件或即時消息直接發送的URL; 也許這是壹個他們在推特、論壇或評論上發現的網址或者在他們的Google搜索結果彈出壹個網址。

不管該URL在哪裏,當用戶點擊此鏈接時,Google Play將會識別它與基本功能或功能模塊相關聯,並檢索在用戶設備上運行此特定模塊所需的所有代碼和資源。

在本節中,我們將使用App Links在基礎功能模塊和URL之間建立這種關系。Android App Links功能最初是為了幫助用戶繞過Android的應用選擇對話框,當他們在嘗試訪問可以由其設備上已安裝的應用程序處理的內容時。 例如,如果您點擊YouTube視頻的鏈接,系統可能會顯示壹個對話框,詢問您是否要在YouTube應用中打開此鏈接。 .

在即時應用程序的上下文中,App Links允許您將功能模塊的入口Activities映射到特定的URL。我們在第壹部分探討了入口Activities,但作為壹個回顧,它們是用戶在啟動基本功能或“常規”功能模塊時看到的第壹個Activity。

當您為現實生活中的項目添加即時應用程序支持時,您需要確定哪個Activity可以最有效地介紹您的即時應用程序組件,但由於mylocation-base只有壹個Activity,因此只能用它了!

Digital Asset鏈接

在本節中,我們將使用Android Studio的內置應用鏈接助手MapsActivity與www.example.com/maps網址關聯,但首先是免責聲明:

將Digital Asset鏈接文件上傳到您正在使用的域(在這種情況下,www.example.com)是應用程序鏈接過程中的關鍵步驟,因為系統將驗證您的應用程序是否有與此域相關聯的所有鏈接的默認處理程序。

雖然我將介紹生成和上Digital Asset鏈接文件的過程,因為我們不擁有www.example.com域,所以我們實際上將無法執行此步驟。然而,奇怪的是,在撰寫本文時,似乎可以在AVD上測試即時應用程序組件即使您尚未將Digital Asset鏈接上傳到相關聯的域 - 您只需要對Android Studio的運行時進行壹些調整組態。

如果您可以輕松訪問可以托管Digital Asset鏈接文件的域,那麽我建議您使用正確的URL 替換www.example.com網址,並將生成的Digital Asset鏈接文件上傳到您的網站。不過,即使您使用www.example.com網址,您仍然可以通過調整運行時配置來測試MyLocation的即時應用程序組件。

創建URL映射

Android Studio 2.3及更高版本附帶了壹個內置的App Links Assistant,使您的項目更加簡單的添加App Links:

  • 從Android Studio工具欄中選擇工具>應用程序鏈接助手。該助手將作為Android Studio窗口右側的新面板打開。
  • 點擊打開URL映射編輯按鈕。
  • 在URL到活動映射顯示面板,點擊小+圖標。
  • 在“ 主機”字段中,輸入要與此項目關聯的域; 我將使用www.example.com。

下壹步是在映射中輸入要使用的特定URL。您在這裏有幾個選項,因此請打開“ 路徑”下拉列表並選擇:

  • 路徑。如果要將單個URL映射到入口activity,則應選擇此選項。由於我只想MapsActivity響應www.example.com/maps網址,我將從此下拉菜單中選擇“ 路徑”。 我們已將域名www.example.com與我們的項目相關聯,因此我們只需要將URL(/ maps)的最後壹部分輸入到隨附的文本字段中。 .
Select Path from the dropdown menu and enter maps in the accompanying text field
  • pathPrefix。此選項可讓您對觸發入口activity的網址更加靈活。  例如,如果您選擇了pathPrefix,然後在隨附的文本框中輸入www.example.com/maps,MapsActivity則會響應URL,例如www.example.com/maps/mylocation和www.example.com/maps/nearby。
  • pathPattern。與“ 路徑”類似,此選項允許您指定應啟動入口activity的確切URL。但是,通過允許您在隨附的文本字段中使用通配符,它還可以提供更多的靈活性。

接下來,您需要選擇MapsActivity作為此模塊的入口activity:

  • 打開Activity下拉菜單。
  • 選擇.MapsActivity(mylocation-base)。
  • 單擊確定

App Links助手有助於更新您的清單,其中包含所有必需的代碼以便將MapsActivity轉換為此模塊的入口activity; 如果您查看mylocation-base模塊的清單,那麽您將看到以下代碼:

接下來,我們需要告訴MapsActivity如何通過此URL啟動它。再次,App Links Assistant可以引導您完成此過程:

  • 回到App Links Assistant,點擊選擇activity按鈕。
  • 選擇要映射到您的URL的activity,在這種情況下選擇MapsActivity。
  • 點擊插入代碼,App Links Assistant會將以下代碼插入到MapsActivity:

當您為自己的現實生活項目添加即時應用程序支持時,通常需要擴展此代碼,具體取決於當您的Activity作為即時應用啟動時,您希望activity的反應,但為了我們的MyLocation項目,這幾行代碼就完成工作了。

將應用程序與網站關聯

在本節中,我將展示如何生成Digital Asset鏈接文件以及如何將此文件上傳到您的網站。如果您使用www.example.com作為正版網址的替代品,那麽您將無法完成此步驟,但了解如何生成和上傳此文件仍然很重要,為您自己的Android項目添加即時應用程序支持。

要在您的域和應用程序之間創建此關聯,您需要完成以下步驟:

  • 在App Links Assistant中,單擊打開Digital Asset鏈接文件生成器按鈕。
  • 輸入您要與此應用關聯的域,例如www.example.com。
  • 輸入您的應用程序ID。
  • 輸入您的應用程序的簽名配置,或選擇密鑰庫文件。雖然在測試期間可以使用調試配置或密鑰庫,但生成的Digital Asset鏈接文件將與應用程序的發行版本不兼容。 如果您上傳使用調試配置或密鑰庫的Digital Asset鏈接文件,則在發布應用程序之前,您需要生成並上傳使用應用程序發行版的新Digital Asset鏈接。 .
  • 單擊生成Digital Asset鏈接文件按鈕。
  • 通過單擊保存文件按鈕下載Digital Asset文件。在Android Studio 3.0的Canary版本中,此按鈕有時位於屏幕外,因此您可能需要調整Android Studio窗口的大小,才能使保存文件按鈕脫離隱藏狀態。 點擊此按鈕將assetlinks.json文件下載到您的計算機。 .
  • 妳必須在https:// /.well-known/ assetlinks.json地址有assetlinks.json文件的,所以上傳新下載的assetlinks.json文件到這個確切位置。另請註意,Android將通過加密的HTTP協議驗證assetlinks.json文件,因此您需要確保此文件可通過HTTPS連接進行訪問。
  • 返回Android Studio,點擊App Link Assistant的鏈接並確認按鈕。如果您使用www.example.com獨立鏈接跟隨本教程,則Android Studio應報告您已成功完成每壹步,但上傳Digital Asset鏈接文件除外。

測試即時應用程序

現在,您終於可以測試MyLocation的即時應用程序組件!

具體來說,我們想測試壹下,如果用戶的設備上沒有安裝MyLocation,那麽點擊www.example.com/maps鏈接就可以訪問mylocation-base模塊:

  • 啟動即時應用兼容的AVD。
  • 驗證MyDocation應用程序沒有安裝在AVD上通過打開launcher。如果您發現MyLocation應用程序,請將其拖放到設備的“ 卸載”圖標上。
  • 接下來,您需要對項目的運行配置進行壹些調整,特別是如果您使用www.example.com/maps觸發您的基於位置的模塊。首先從Android Studio工具欄中 選擇運行>修改配置...。
  • 從左側菜單中選擇mylocation-instantapp。
  • 打開啟動下拉列表並將其設置為URL。
  • 刪除<>文本,並將其替換為要使用的URL,例如http://www.example.com/maps。當您選擇此運行配置時,它將模擬用戶點擊www.example.com/maps鏈接。
Delete the Error text and replace it with wwwexamplecommaps
  • 單擊應用,然後單擊確定。
  • 從Android Studio工具欄中選擇運行>運行...。
  • 選擇mylocation-instantapp作為您要啟動的組件。
  • 選擇您的目標AVD,然後單擊確定。
  • 如果這是第壹次在這個特定AVD上運行即時應用程序,那麽該設備將提示您選擇加入即時應用程序。閱讀免責聲明,如果您樂意繼續操作,請點擊是,我進入。

Android Studio現在將模擬您點擊www.example.com/maps鏈接,AVD應通過加載基本功能模塊進行響應。現在,MapsActivity會出現在屏幕上,您將能夠完全與安裝在此設備上的MyLocation進行交互。

為了驗證MyLocation真的不存在於此設備上,最小化MapsActivity並打開AVD的啟動器 - MyLocation應用程序應該完全不存在,但是如果單擊AVD的“ 重新啟動”軟鍵,MapsActivity則該設備仍然可見。 您可以從GitHub 下載MyLocation項目,更新完整的即時應用程序支持。

您可以從GitHub 下載MyLocation項目,更新完整的即時應用程序支持。

故障排除

即時應用仍然是壹個新功能,因此遇到錯誤消息、錯誤和其他奇怪的行為並不常見,特別是如果您使用的是Android Studio 3.0的預覽版或Canary版本。

您將遇到的最常見問題是,從Android Studio工具欄中選擇Run> Run instantapp時,通過顯示應用程序選擇器對話框或通過在其默認瀏覽器中打開該URL來讓AVD作出響應。如果發生這種情況,那麽這意味著AVD沒有正確地識別出您的URL被映射到即時應用程序模塊,並且像正常URL壹樣處理它。

假設您已經正確實實現了應用程序支持,您的AVD拒絕合作有幾個可能的原因:

您的AVD設置是否允許即時應用?

根據您創建的AVD,您可能需要明確告知您的AVD才能支持即時應用:

  • 打開AVD的設置應用程序。
  • 選擇Google。
  • 滾動到“ 服務”部分。
  • 如果您發現即時應用程序選項,請點擊。
  • 在隨後的屏幕上,將滑塊拖動到打開位置。
  • 重復嘗試在您的AVD上啟動即時應用程序模塊的過程,以查看是否已經解決了您的問題。

您的區域設置中是否支持即時應用?

每個地區都不支援即時應用程式,因此請檢查即時應用程式目前在世界各地可用。如果沒有,那麽您需要使用adb(Android Debug Bridge)命令來騙AVD認為您處於不同的位置:

  • 如果您在Windows上,請打開終端(如果您是Mac用戶)或命令提示符。
  • “更改目錄”,以便終端或命令提示符指向Android SDK中包含的adb程序,例如:
  • 接下來,輸入以下命令:
  • 壹旦#出現在“終端”或“命令提示符”窗口中,輸入下壹個命令:
  • 您的AVD現在將重新啟動,壹旦重新啟動,它將使用新的區域設置。您現在應該可以在此設備上成功運行即時應用程序。

如果全部失敗...

如果上述任何修補程序都不起作用,則可以通過從adb命令觸發即時應用程序組件而不是導航各種Android Studio菜單來獲得壹些有用的結果:

  • 打開終端或命令提示符窗口。
  • 使用cd命令,使終端/命令提示符指向adb程序。
  • 輸入以下命令,確保替換complete-url-path為要使用的URL:

Side Loading Instant App Failed

有時,Android Studio可能會直接拒絕在AVD上加載即時應用程序組件,因為壹些開發人員報告,只要他們嘗試啟動即時應用程序時遇到以下錯誤:

Side loading instant app failed: Reading bundle timed out.

如果您在Android Studio中遇到此錯誤消息,則通常可以通過清除緩存來解決此問題:

  • 從Android Studio工具欄中選擇運行>編輯配置...。
  • 從左側菜單中選擇mylocation-instantapp。
  • 選擇即時應用程序配置(朝向此窗口的底部)。
  • 點擊鉛筆圖標。
  • 選擇清除配置的設備緩存。
Select the Clear provisioned devices cache checkbox then click OK
  • 點擊OK,其次是應用,然後打OK壹次。
  • 嘗試重新啟動您的AVD即時應用程序組件 - 現在應該解決問題。

結論

在本文中,我們研究了如何更新現有的Android項目以支持即時應用程序,通過創建基本功能模塊和即時應用程序模塊,實現App Links,然後在AVD上測試此項目。

此時,您擁有了將即時應用功能添加到現有Android項目需要的所有信息,但有壹個限制:我們只創建了壹個基本功能模塊。這意味著,目前,您只能為每個項目提供壹個即時應用功能。

在本系列的最後壹篇文章中,我們將通過查看如何向MyLocation項目添加額外的功能模塊來改善這壹點。  很快就出來了, 與此同時,請查看我們在Android應用程序開發中的其他壹些精彩帖子!


关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.