本教學課程的第7章使用原生Android行動應用程式來使用AEM內容服務中的內容。
本教學課程使用 簡單原生Android行動應用程式 來使用和顯示AEM Content Services公開的事件內容。
使用 Android 基本上不重要,且耗用的行動應用程式可在任何行動平台(例如iOS)的任何架構中編寫。
Android可用來進行教學課程,因為能夠在Windows、macOs和Linux上執行Android模擬器,其普及程度,而且可以以Java的形式撰寫,這是AEM開發人員非常了解的語言。
本教學課程的Android行動應用程式為not旨在指示如何建置Android行動應用程式或傳達Android開發最佳實務,而非說明如何從行動應用程式使用AEM內容服務。
如果未在上執行AEM Publish http://localhost:4503 可在行動應用程式的 Settings 指向屬性AEM Publish主機/連接埠。
本節重點說明最互動且依賴AEM Content Services的Android行動應用程式程式碼及其JSON輸出。
載入時,行動應用程式會 HTTP GET
to /content/wknd-mobile/en/api/events.model.json
即AEM Content Services端點,設定為提供內容以驅動行動應用程式。
因為事件API的可編輯範本(/content/wknd-mobile/en/api/events.model.json
)已鎖定,則行動應用程式可以編碼,以在JSON回應中的特定位置中尋找特定資訊。
HTTP GET
請求AEM發佈於 /content/wknd-mobile/en/api/events.model.json
收集要填入行動應用程式UI的內容。以下是行動應用程式中程式碼的精餾程式 MainActivity
負責叫用AEM Content Services以收集推動行動應用程式體驗的內容。
protected void onCreate(Bundle savedInstanceState) {
...
// Create the custom objects that will map the JSON -> POJO -> View elements
final List<ViewBinder> viewBinders = new ArrayList<>();
viewBinders.add(new LogoViewBinder(this, getAemHost(), (ImageView) findViewById(R.id.logo)));
viewBinders.add(new TagLineViewBinder(this, (TextView) findViewById(R.id.tagLine)));
viewBinders.add(new EventsViewBinder(this, getAemHost(), (RecyclerView) findViewById(R.id.eventsList)));
...
initApp(viewBinders);
}
private void initApp(final List<ViewBinder> viewBinders) {
final String aemUrl = getAemUrl(); // -> http://localhost:4503/content/wknd-mobile/en/api/events.mobile.json
JsonObjectRequest request = new JsonObjectRequest(aemUrl, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
for (final ViewBinder viewBinder : viewBinders) {
viewBinder.bind(response);
}
}
},
...
);
}
onCreate(..)
是行動應用程式的初始化連結,並註冊3個自訂 ViewBinders
負責剖析JSON並將值系結至 View
元素。
initApp(...)
接著會被呼叫,這會向AEM Publish上的AEM Content Services端點提出HTTPGET要求,以收集內容。 收到有效的JSON回應時,JSON回應會傳遞至每個 ViewBinder
負責剖析JSON並將其系結至行動裝置 View
元素。
接下來,我們將查看 LogoViewBinder
,此方法相當簡單,但會強調數個重要考量。
public class LogoViewBinder implements ViewBinder {
...
public void bind(JSONObject jsonResponse) throws JSONException, IOException {
final JSONObject components = jsonResponse.getJSONObject(":items").getJSONObject("root").getJSONObject(":items");
if (components.has("image")) {
final Image image = objectMapper.readValue(components.getJSONObject("image").toString(), Image.class);
final String imageUrl = aemHost + image.getSrc();
Glide.with(context).load(imageUrl).into(logo);
} else {
Log.d("WKND", "Missing Logo");
}
}
}
第一行 bind(...)
透過索引鍵向下導覽JSON回應 :items →根→:items 代表元件所新增的AEM Layout Container。
在此會檢查名為 影像,代表影像元件(同樣地,此節點名稱→ JSON金鑰為穩定)。 如果此物件存在,則會讀取並對應至 自訂影像POJO 通過傑克森 ObjectMapper
程式庫。 以下探討影像POJO。
最後,標誌 src
會使用 Glide 協助程式庫。
請注意,我們必須提供AEM結構、主機和連接埠(透過 aemHost
)以AEM Content Services形式發佈至AEM Publish例項只會提供JCR路徑(ie. /content/dam/wknd-mobile/images/wknd-logo.png
)到參考的內容。
若為選用項目,請使用 Jackson ObjectMapper 或其他程式庫(例如Gson)提供的類似功能,可協助將複雜的JSON結構對應至Java POJO,而不需直接處理原生JSON物件本身。 在這個簡單的案例中,我們會將 src
鍵 image
JSON物件,至 src
屬性(透過 @JSONProperty
註解。
package com.adobe.aem.guides.wknd.mobile.android.models;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Image {
@JsonProperty(value = "src")
private String src;
public String getSrc() {
return src;
}
}
事件POJO需要從JSON物件中選取更多資料點,這項技術的優點多於簡單影像,我們只想要 src
.
現在您已了解AEM Content Services如何促進原生行動體驗,運用您所學到的內容執行下列步驟,並查看行動應用程式中反映的變更。
在每個步驟後,提取並重新整理行動應用程式,並驗證行動體驗的更新。
您已完成AEM Headless教學課程!
若要深入了解AEM Content Services和AEM as a Headless CMS,請造訪Adobe的其他檔案和啟用資料: