Danh sách câu hỏi của đề

Câu hỏi: MMA301 Phát triển ứng dụng di động đa nền tảng – Bộ ôn tập cuối kỳ số 2

50 câu trắc nghiệm kèm lời giải của môn Multiplatform Mobile App Development - Phát triển ứng dụng di động đa nền tảng, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/50 câuCòn 30
ABluetooth
BGPS
CWIFI
DIP Geolocation
Lời giải
Đáp án đúng: "Bluetooth". Câu hỏi tìm phương thức KHÔNG được Geolocation API dùng để xác định vị trí. Geolocation API dựa vào các nguồn mà hệ điều hành cung cấp: GPS từ vệ tinh cho độ chính xác cao ngoài trời, mạng WIFI quanh máy đối chiếu với cơ sở dữ liệu điểm phát, và vị trí suy ra từ địa chỉ IP khi các nguồn kia không có; Bluetooth là kết nối tầm ngắn giữa các thiết bị, không nằm trong các nguồn mà API này dùng. "GPS" là nguồn chính nên được dùng, vì thế không phải đáp án. "WIFI" được dùng để định vị nhanh trong nhà và trong đô thị nên cũng bị loại. "IP Geolocation" là cách ước lượng thô theo địa chỉ mạng, vẫn thuộc các phương thức API dùng, nên không phải phương thức bị hỏi.
Mở trang câu hỏi này →
ALocationPicker
BGeolocation
CLocation
DPicker
Lời giải
Đáp án đúng: "Geolocation". Geolocation API là giao diện chuẩn để lấy vị trí địa lý của thiết bị (vĩ độ, kinh độ, độ chính xác) qua các hàm getCurrentPosition và watchPosition; trong React Native nó có trong thư viện @react-native-community/geolocation và chỉ trả dữ liệu sau khi người dùng cấp quyền vị trí. "LocationPicker" sai vì đây không phải API có sẵn, chỉ là tên thường dùng cho component tự viết để chọn địa điểm trên bản đồ. "Location" là tên module của Expo trong gói expo-location, một gói riêng chứ không phải tên chuẩn của API định vị mà câu hỏi nhắc tới. "Picker" sai vì đây là component chọn một giá trị trong danh sách thả xuống, không liên quan tới định vị.
Mở trang câu hỏi này →
AThe quality of the image or video
BThe format of text displayed on the picker
CWhether the picker accepts images, videos, or both
DThe color of the image picker interface
Lời giải
Đáp án đúng: "Whether the picker accepts images, videos, or both". Trong thư viện chọn ảnh như expo-image-picker hay react-native-image-picker, tuỳ chọn media type (mediaTypes hoặc mediaType) giới hạn loại tệp người dùng được chọn từ thư viện máy hoặc camera: chỉ ảnh, chỉ video, hoặc cả hai. "The quality of the image or video" do một tuỳ chọn riêng là quality đảm nhiệm, nhận số từ 0 tới 1. "The format of text displayed on the picker" sai vì bộ chọn dùng giao diện của hệ điều hành, tuỳ chọn này không đụng tới chữ. "The color of the image picker interface" cũng sai, màu giao diện bộ chọn không do media type quyết định.
Mở trang câu hỏi này →
APicker
BImage
CImagePicker
DView
Lời giải
Đáp án đúng: "ImagePicker". Chụp ảnh bằng camera hoặc chọn ảnh từ thư viện thường được làm qua ImagePicker, ví dụ expo-image-picker với hàm launchCameraAsync hoặc react-native-image-picker với launchCamera; nó mở giao diện camera native của hệ điều hành, xin quyền truy cập rồi trả về URI của ảnh vừa chụp để hiển thị hay tải lên. "Picker" là ô chọn một giá trị trong danh sách nhiều mục, giống dropdown, không liên quan tới camera. "Image" chỉ hiển thị ảnh từ nguồn có sẵn như tệp cục bộ qua require hoặc đường dẫn uri, tự nó không chụp được ảnh. "View" là vùng chứa cơ bản để bố cục và áp style, tương tự thẻ div trên web, không có khả năng truy cập camera.
Mở trang câu hỏi này →
AAsyncStorage.mergeItem(key, value)
BAsyncStorage.removeItem(key)
CAsyncStorage.getAllKeys()
DAsyncStorage.clearAll()
Lời giải
Đáp án đúng: "AsyncStorage.clearAll()". Câu hỏi tìm phương thức KHÔNG có trong AsyncStorage. Phương thức xoá toàn bộ dữ liệu của AsyncStorage tên là clear(), không có clearAll(), nên gọi AsyncStorage.clearAll() sẽ báo lỗi hàm không tồn tại. "AsyncStorage.mergeItem(key, value)" là phương thức có thật, gộp một chuỗi JSON mới vào giá trị JSON đang lưu ở khoá đó, nên không phải đáp án. "AsyncStorage.removeItem(key)" có thật, xoá một cặp khoá–giá trị, nên cũng bị loại. "AsyncStorage.getAllKeys()" có thật, trả về mảng mọi khoá mà ứng dụng đã lưu, nên không phải phương thức bị hỏi.
Mở trang câu hỏi này →
AIt reduces energy consumption.
BIt increases the accuracy of location data.
CIt decreases the accuracy of location data.
DIt has no effect on location accuracy.
Lời giải
Đáp án đúng: "It increases the accuracy of location data.". enableHighAccuracy là tuỳ chọn truyền vào getCurrentPosition hoặc watchPosition; khi đặt true, thiết bị ưu tiên GPS thay vì chỉ ước lượng qua Wi-Fi hay trạm di động, nên toạ độ chính xác hơn, đổi lại tốn pin hơn và có thể lâu hơn mới có kết quả. "It reduces energy consumption." sai vì GPS tốn năng lượng hơn, nên bật tuỳ chọn này làm tăng mức tiêu thụ pin. "It decreases the accuracy of location data." sai vì đi ngược ý nghĩa của tuỳ chọn; muốn tiết kiệm pin với độ chính xác thấp hơn thì đặt false. "It has no effect on location accuracy." sai vì tuỳ chọn này đổi nguồn định vị được dùng nên ảnh hưởng trực tiếp tới độ chính xác, dù ở trong nhà nơi GPS yếu thì chênh lệch có thể nhỏ.
Mở trang câu hỏi này →
ATo bridge JavaScript and native code
BTo create a new JavaScript bridge
CTo delete an existing bridge
DTo update a bridge
Lời giải
Đáp án đúng: "To bridge JavaScript and native code". Trong kiến trúc cũ của React Native trên iOS, RCTBridge là lớp Objective-C quản lý cầu nối: nó nạp bundle JavaScript, khởi tạo các native module được đăng ký và chuyển thông điệp đã tuần tự hoá giữa thread JavaScript và mã native theo cả hai chiều. "To create a new JavaScript bridge" nhầm vai trò: cầu nối chính là đối tượng RCTBridge tạo ra lúc khởi động, mục đích của lớp không phải sinh thêm cầu nối. "To delete an existing bridge" chỉ là thao tác dọn dẹp khi huỷ, không phải lý do lớp này tồn tại. "To update a bridge" cũng chỉ là thao tác vòng đời như nạp lại bundle, không mô tả chức năng nối hai thế giới.
Mở trang câu hỏi này →
AAdding a basic button to the app
BIntegrating with a platform-specific API like Google Play services
CDisplaying static text content
DAdjusting padding and margin of elements
Lời giải
Đáp án đúng: "Integrating with a platform-specific API like Google Play services". Native Module cần đến khi JavaScript phải gọi một API riêng của nền tảng mà React Native chưa bọc sẵn, như Google Play services, SDK thanh toán, cảm biến hay phần cứng đặc thù; khi đó ta viết mã Java/Kotlin hoặc Objective-C/Swift rồi export phương thức cho JS gọi. "Adding a basic button to the app" đã có sẵn Button, Pressable, TouchableOpacity trong lõi React Native nên không cần mã native. "Displaying static text content" chỉ cần component Text. "Adjusting padding and margin of elements" làm bằng thuộc tính style như padding, margin trong StyleSheet, hoàn toàn ở phía JavaScript; cả ba việc này đều là thao tác giao diện cơ bản đã được React Native hỗ trợ sẵn.
Mở trang câu hỏi này →
A@JavaScriptMethod
B@ReactMethod
C@NativeMethod
D@CallableMethod
Lời giải
Đáp án đúng: "@ReactMethod". Trong Native Module Android, lớp module kế thừa ReactContextBaseJavaModule, đặt tên qua getName(), và mỗi phương thức muốn JavaScript gọi được phải gắn annotation @ReactMethod; phương thức đó trả kết quả qua Callback hoặc Promise vì lời gọi qua Bridge là bất đồng bộ. "@JavaScriptMethod" không phải annotation có trong React Native, tên nghe hợp lý nhưng không tồn tại. "@NativeMethod" cũng không tồn tại, dù gợi đến mã gốc. "@CallableMethod" không phải annotation của React Native, phương thức chỉ gắn nó sẽ không được đưa ra JavaScript. Bên iOS, vai trò tương ứng là macro RCT_EXPORT_METHOD.
Mở trang câu hỏi này →
ACreating a Java class that extends ReactContextBaseJavaModule
BRegistering the module in a Package class that implements ReactPackage
CAdding the native module to the MainApplication.java file
DModifying the AndroidManifest.xml to declare the native module
Lời giải
Đáp án đúng: "Modifying the AndroidManifest.xml to declare the native module". AndroidManifest.xml khai báo activity, service, receiver và quyền của ứng dụng; Native Module không phải thành phần Android nên không cần khai báo ở đó. Chỉ khi module cần quyền đặc biệt như camera hay vị trí thì mới thêm uses-permission, nhưng đó là khai báo quyền chứ không phải khai báo module. "Creating a Java class that extends ReactContextBaseJavaModule" là bước bắt buộc: lớp này chứa logic, đặt tên qua getName và phơi phương thức bằng @ReactMethod. "Registering the module in a Package class that implements ReactPackage" cũng bắt buộc, vì createNativeModules của Package trả danh sách module cho React Native. "Adding the native module to the MainApplication.java file" là bước thêm Package vào getPackages để React Native nạp lúc khởi động; với thư viện có autolinking bước này tự động, còn module tự viết trong app thì phải tự thêm.
Mở trang câu hỏi này →
AJavaScript lacks flexibility.
BJavaScript makes apps more expensive.
CJavaScript has lower security standards.
DJavaScript reduces community support.
Lời giải
Đáp án đúng: "JavaScript has lower security standards.". Mã JavaScript của ứng dụng React Native được đóng thành một bundle nằm trong gói cài đặt; dù đã rút gọn hoặc biên dịch sang bytecode của Hermes, kẻ xấu vẫn có thể giải nén và đọc lại logic, khoá API hay chuỗi bí mật dễ hơn nhiều so với mã native, và các gói npm bên thứ ba còn mở thêm rủi ro chuỗi cung ứng; vì vậy JavaScript bị xem là điểm yếu bảo mật, buộc phải giữ bí mật ở máy chủ hoặc Keychain/Keystore. "JavaScript lacks flexibility." sai vì linh hoạt chính là thế mạnh của JavaScript. "JavaScript makes apps more expensive." sai vì dùng chung một mã JavaScript cho hai nền tảng còn giảm chi phí. "JavaScript reduces community support." sai vì cộng đồng JavaScript thuộc loại lớn nhất.
Mở trang câu hỏi này →
AIt allows developers to handle data binding more securely.
BIt simplifies the division of application functions into independent blocks.
CIt limits the app to a single platform.
DIt reduces the number of third-party plugins needed.
Lời giải
Đáp án đúng: "It simplifies the division of application functions into independent blocks.". Kiến trúc mô-đun (modular architecture) của React Native xoay quanh component: mỗi chức năng được tách thành khối độc lập có props đầu vào rõ ràng, có thể phát triển, kiểm thử và tái sử dụng riêng rồi ghép lại thành màn hình, nhờ đó ứng dụng dễ mở rộng và bảo trì. "It allows developers to handle data binding more securely." lệch chủ đề: React dùng luồng dữ liệu một chiều qua props và state, còn độ an toàn của dữ liệu không do việc chia module quyết định. "It limits the app to a single platform." sai vì React Native nhắm tới chạy đa nền tảng trên iOS và Android. "It reduces the number of third-party plugins needed." cũng không đúng, vì số thư viện cần dùng tuỳ vào tính năng của app chứ không giảm đi nhờ chia module.
Mở trang câu hỏi này →
ArenderSectionHeader receives an element directly from the data array (i.e., the data of all sections combined) and returns a React Element to display.
BrenderItem receives an element from the data array of each individual section and renders a React Element, representing that item in the section.
CBoth props (renderItem and renderSectionHeader) receive an element from the sections array and handle them in the same way.
DrenderSectionHeader receives an element from the sections array to create and display the header for that section.
Lời giải
Đáp án đúng gồm hai ý: "renderItem receives an element from the data array of each individual section and renders a React Element, representing that item in the section." và "renderSectionHeader receives an element from the sections array to create and display the header for that section.". SectionList hiển thị danh sách chia nhóm: prop sections là mảng các đối tượng nhóm, mỗi nhóm có tiêu đề và mảng data riêng; renderItem được gọi cho từng phần tử trong data của từng nhóm, còn renderSectionHeader được gọi một lần cho mỗi đối tượng trong sections để vẽ tiêu đề nhóm. Phát biểu "receives an element directly from the data array (i.e., the data of all sections combined)" sai vì tiêu đề nhóm nhận đối tượng section chứ không nhận phần tử dữ liệu, và không có mảng gộp mọi nhóm. Phát biểu "Both props (renderItem and renderSectionHeader) receive an element from the sections array" sai vì hai prop nhận hai loại dữ liệu khác nhau và có vai trò khác nhau.
Mở trang câu hỏi này →
AStack Navigator
BTab Navigator
CDrawer Navigator
DBottom Sheet Navigator
Lời giải
Đáp án đúng: "Stack Navigator". Stack Navigator của React Navigation quản lý màn hình như một chồng: mỗi lần navigate thì đẩy màn mới lên, quay lại thì gỡ màn trên cùng xuống, và màn chỉ được dựng khi cần; vì không có thanh điều hướng nào phải hiển thị cùng lúc mọi màn, số màn có thể tăng lên 10 hay nhiều hơn mà giao diện không rối, nên đây là lựa chọn dễ mở rộng nhất. "Tab Navigator" hợp với ba đến năm mục chính luôn hiện trên thanh tab; nhồi 10 tab thì thanh quá chật và người dùng khó chọn. "Drawer Navigator" hợp làm menu cho các khu vực cấp cao, nhưng 10 mục đã thành một danh sách dài, và nó không có sẵn lối đi tiến lùi giữa các màn chi tiết. "Bottom Sheet Navigator" không phải bộ điều hướng dựng sẵn của React Navigation; bottom sheet là tấm trượt từ đáy dùng cho thao tác phụ, không phải nơi tổ chức cả chục màn hình. Trong thực tế, app nhiều màn thường kết hợp: drawer hoặc tab cho vài khu vực chính, mỗi khu vực lồng một stack chứa các màn bên trong.
Mở trang câu hỏi này →
ADeploying an app to the Play Store
BInstantly seeing UI changes during development
COptimizing app performance on low-end devices
DAccessing native camera APIs
Lời giải
Đáp án đúng: "Instantly seeing UI changes during development". Hot reloading (nay là Fast Refresh) cho phép lưu tệp là thấy thay đổi giao diện ngay trên máy ảo hay điện thoại, thường giữ nguyên state hiện tại của component, nên lập trình viên chỉnh style, bố cục hay chữ mà không phải build lại hay thao tác lại từ đầu tới màn hình đang làm. "Deploying an app to the Play Store" sai vì phát hành lên cửa hàng cần build bản release, hoàn toàn nằm ngoài cơ chế nạp nóng lúc phát triển. "Optimizing app performance on low-end devices" sai vì hot reloading chỉ phục vụ chế độ phát triển, không ảnh hưởng hiệu năng bản phát hành. "Accessing native camera APIs" sai vì truy cập camera cần thư viện hoặc Native Module; thay đổi mã native còn đòi build lại, hot reloading không giúp được.
Mở trang câu hỏi này →
16What is the purpose of SafeAreaView component?4 lựa chọnTrung bình
AThe purpose of SafeAreaView is to render content within the safe area boundaries of a device
BSafeAreaView automatically adjusts the font size of text elements to ensure readability in different screen sizes
CSafeAreaView provides a secure environment for rendering sensitive user data
DAll of the above
Lời giải
Đáp án đúng: "The purpose of SafeAreaView is to render content within the safe area boundaries of a device". SafeAreaView tự thêm phần đệm sao cho nội dung nằm trong vùng an toàn, tránh bị tai thỏ, thanh trạng thái, góc bo màn hình và home indicator che mất (bản lõi của React Native chỉ có tác dụng trên iOS 11 trở lên). Phát biểu "automatically adjusts the font size of text elements" sai vì SafeAreaView chỉ đổi phần đệm quanh nội dung, cỡ chữ do style và cài đặt trợ năng của máy quyết định. Phát biểu "provides a secure environment for rendering sensitive user data" hiểu nhầm chữ safe là an toàn bảo mật, trong khi ở đây safe chỉ vùng hiển thị không bị che. "All of the above" sai vì hai phát biểu vừa bác không đúng.
Mở trang câu hỏi này →
17How would you apply the FlatList component to render a list of items efficiently?4 lựa chọnTrung bình67% trả lời đúng
ABy using a ScrollView component with a map function to render each item
BBy defining a custom renderItem function and passing it to the FlatList component
CBy manually iterating over the list of items and rendering each item individually
DBy using a ListView component provided by third-party libraries
Lời giải
Đáp án đúng: "By defining a custom renderItem function and passing it to the FlatList component". FlatList nhận mảng data và hàm renderItem; với mỗi mục, FlatList gọi renderItem với đối tượng chứa item và index để lấy phần tử cần vẽ, kèm keyExtractor để có key ổn định. Điểm mạnh là ảo hoá (virtualization): chỉ các mục gần vùng nhìn thấy được render, mục đã cuộn xa bị gỡ khỏi bộ nhớ, nên danh sách dài vẫn mượt. "By using a ScrollView component with a map function to render each item" render toàn bộ mục ngay một lúc, danh sách càng dài càng tốn bộ nhớ và chậm. "By manually iterating over the list of items and rendering each item individually" về bản chất cũng là tự lặp và dựng hết, đánh mất cơ chế ảo hoá cùng các tối ưu như initialNumToRender, windowSize mà FlatList cung cấp. "By using a ListView component provided by third-party libraries" không hợp lý vì ListView là component cũ đã bị gỡ khỏi React Native và được chính FlatList thay thế, không cần tìm tới thư viện ngoài.
Mở trang câu hỏi này →
18Which component is used to display a block of text?4 lựa chọnTrung bình67% trả lời đúng
AText
BTextView
CTextComponent
DTextInput
Lời giải
Đáp án đúng: "Text". Text là component lõi để hiển thị chữ, hỗ trợ lồng nhau, định dạng (fontSize, fontWeight), xử lý chạm qua onPress và giới hạn số dòng bằng numberOfLines; trong React Native mọi chuỗi chữ bắt buộc nằm trong Text, đặt chuỗi trần trong View sẽ báo lỗi. "TextView" là widget hiển thị chữ của Android gốc, React Native dùng ở tầng dưới nhưng không cung cấp component tên đó. "TextComponent" không phải component có trong React Native. "TextInput" dùng để người dùng nhập chữ, không phải để hiển thị một khối văn bản tĩnh.
Mở trang câu hỏi này →
AView is a basic container component, playing a similar role to the <div> tag in HTML, used to contain other components.
BView is a leaf component and cannot contain any child components inside.
CView is only used to display plain text and does not support layout or applying styles.
DView is mainly used to create layouts and apply style properties to the child components it contains.
Lời giải

Đáp án đúng gồm hai ý: "View is a basic container component, playing a similar role to the <div> tag in HTML, used to contain other components." và "View is mainly used to create layouts and apply style properties to the child components it contains.". View là component nền tảng, ánh xạ sang UIView trên iOS và android.view.View trên Android; nó chứa được bao nhiêu con tuỳ ý, là flex container để bố cục, nhận style như padding, backgroundColor, borderRadius, và chính các style căn chỉnh của View quyết định vị trí các con bên trong. "View is a leaf component and cannot contain any child components inside." sai vì View chính là khung chứa, hầu hết màn hình React Native là cây các View lồng nhau. "View is only used to display plain text and does not support layout or applying styles." sai vì View không hiển thị chữ trực tiếp, chữ phải nằm trong Text, còn bố cục và style lại là công dụng chính của View.

Mở trang câu hỏi này →
AtrackColor
BthumbColor
ConColor
DoffColor
Lời giải
Đáp án đúng: "trackColor". trackColor nhận đối tượng có hai khoá false và true để tô phần rãnh (track) của Switch theo trạng thái; khoá true là màu rãnh khi công tắc đang bật, khoá false là màu khi tắt. "thumbColor" đổi màu núm tròn (thumb) trượt trên rãnh, không phải màu rãnh. "onColor" không tồn tại trong API của Switch; màu khi bật được khai báo qua khoá true của trackColor. "offColor" cũng không tồn tại; màu khi tắt đặt bằng khoá false của trackColor, và trên iOS còn có ios_backgroundColor cho nền khi tắt.
Mở trang câu hỏi này →