MMA301DễKỳ 7Chuyên ngành Cập nhật 24/07/2026

Multiplatform Mobile App Development - Phát triển ứng dụng di động đa nền tảng

Ôn luyện MMA301 – Phát triển ứng dụng di động đa nền tảng với React Native: ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết, luyện thi cuối kỳ hiệu quả. Nội dung bao quát React Native, Expo, component & navigation, styling Flexbox, quản lý state bằng hooks/Redux/Context API, FlatList/SectionList, thông báo đẩy, lưu trữ AsyncStorage/SQLite/Firebase, tích hợp Gemini AI và xuất bản ứng dụng iOS/Android. Môn 3 tín chỉ tại FPT University, tiên quyết FER202.

130Câu hỏi
7Chủ đề

Câu hỏi của môn

44/130 câuCòn 86
25In Bridge architecture, which thread is the place where the native code is executed?4 lựa chọnTrung bình50% trả lời đúng
AJavaScript Thread
BNative Thread
CShadow Thread
DReactNative Thread
Lời giải
Trong kiến trúc Bridge, luồng mà nơi thực thi mã natively được gọi là Native Thread. Điều này có nghĩa là mã natively được thực thi trên một luồng riêng biệt, độc lập với luồng JavaScript. Điều này cho phép mã natively được thực thi một cách hiệu quả và an toàn, mà không ảnh hưởng đến luồng JavaScript. Native Thread được sử dụng để thực thi mã natively, chẳng hạn như mã được viết bằng ngôn ngữ lập trình C hoặc C++, trong khi JavaScript Thread được sử dụng để thực thi mã JavaScript. Shadow Thread và ReactNative Thread không liên quan đến kiến trúc Bridge.
Mở trang câu hỏi này →
AJavaScript Thread
BNative Thread
CShadow Thread
DRender Thread
Lời giải
Trong kiến trúc Bridge, có bốn luồng chính trong kiến trúc React Native. Đó là luồng JavaScript, luồng Native, luồng Shadow và luồng Render. Tuy nhiên, luồng Render không phải là một trong những luồng chính trong kiến trúc Bridge. Luồng Render được sử dụng để thực hiện các tác vụ liên quan đến giao diện người dùng, trong khi các luồng khác được sử dụng để thực hiện các tác vụ khác nhau trong ứng dụng. Vì vậy, câu trả lời đúng là "Render Thread".
Mở trang câu hỏi này →
27What 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
SafeAreaView là một thành phần trong React Native giúp đảm bảo nội dung được render trong giới hạn của vùng an toàn (safe area) trên thiết bị. Vùng an toàn này thường bao gồm các phần không thể chạm vào của thiết bị, chẳng hạn như notch, camera, loa, v.v. Khi sử dụng SafeAreaView, bạn có thể đảm bảo rằng nội dung của ứng dụng không bị che khuất hoặc bị ảnh hưởng bởi các phần này. Điều này giúp cải thiện trải nghiệm người dùng và đảm bảo rằng ứng dụng của bạn luôn được hiển thị một cách rõ ràng và đẹp mắt. Ngoài ra, SafeAreaView cũng giúp bạn dễ dàng tùy chỉnh nội dung của ứng dụng để phù hợp với thiết bị và màn hình của người dùng.
Mở trang câu hỏi này →
AuseReducer always re-renders the component, while useState does not
BuseReducer is designed for more complex state logic and state transitions, while useState is suited for simple state management
CuseReducer cannot be used with functional components, while useState can
DuseReducer is used for global state management, while useState is only for local state
Lời giải
Khi sử dụng React Native, có hai phương thức quản lý trạng thái quan trọng là useReducer và useState. useReducer được thiết kế để quản lý trạng thái phức tạp và các chuyển đổi trạng thái, trong khi useState phù hợp cho việc quản lý trạng thái đơn giản. Điều này có nghĩa là useReducer có thể xử lý các trạng thái phức tạp hơn, chẳng hạn như các trạng thái phụ thuộc vào nhau, trong khi useState chỉ phù hợp cho các trường hợp đơn giản. Ví dụ, nếu bạn cần quản lý một trạng thái có nhiều thuộc tính và các quy tắc phức tạp để chuyển đổi trạng thái, thì useReducer sẽ là lựa chọn tốt hơn. Ngược lại, nếu bạn chỉ cần quản lý một trạng thái đơn giản, chẳng hạn như một checkbox hoặc một input text, thì useState sẽ đủ.
Mở trang câu hỏi này →
AuseReducer
BRedux
CMobX
DStorage
Lời giải
Để quản lý dữ liệu trong một ứng dụng React Native, có nhiều phương pháp khác nhau. Trong số các lựa chọn trên, "Storage" không phải là một phương pháp quản lý dữ liệu. "useReducer", "Redux", và "MobX" là các thư viện phổ biến được sử dụng để quản lý trạng thái trong ứng dụng React Native. "useReducer" là một hook trong React giúp quản lý trạng thái bằng cách sử dụng một hàm giảm giá. "Redux" là một thư viện quản lý trạng thái tập trung, giúp phân chia ứng dụng thành các phần nhỏ hơn và dễ quản lý hơn. "MobX" là một thư viện quản lý trạng thái dựa trên phản ứng, giúp ứng dụng phản ứng với các thay đổi trong dữ liệu. Ngược lại, "Storage" là một phương pháp lưu trữ dữ liệu, chẳng hạn như bộ nhớ đệm hoặc cơ sở dữ liệu, mà không liên quan trực tiếp đến việc quản lý trạng thái trong ứng dụng.
Mở trang câu hỏi này →
AuseNavigationState
BuseRoute
CuseNavigation
DuseFocusEffect
Lời giải
Để truy cập các tham số của đường dẫn trong một thành phần chức năng trong React Navigation, bạn nên sử dụng hook 'useRoute'. Hook này cho phép bạn truy cập vào các tham số của đường dẫn hiện tại và sử dụng chúng trong thành phần của bạn. Ví dụ, nếu bạn có một đường dẫn như '/users/:id', bạn có thể sử dụng 'useRoute' để truy cập vào tham số ':id' và sử dụng nó để tải dữ liệu người dùng từ cơ sở dữ liệu. Điều này giúp bạn có thể xây dựng các ứng dụng di động phức tạp và linh hoạt hơn.
Mở trang câu hỏi này →
ArenderSectionHeader
BrenderItem
CrenderRow
DrenderComponent
Lời giải
SectionList trong React cho phép bạn render từng phần tử trong danh sách của mình bằng cách sử dụng phương thức renderSectionHeader và renderItem. Phương thức renderSectionHeader được sử dụng để render tiêu đề của từng phần tử, trong khi renderItem được sử dụng để render nội dung của từng phần tử. Điều này cho phép bạn có thể tùy chỉnh cách mà danh sách của mình được hiển thị trên màn hình.
Mở trang câu hỏi này →
AAsyncStorage.mergeItem(key, value)
BAsyncStorage.removeItem(key)
CAsyncStorage.getAllKeys()
DAsyncStorage.clearAll()
Lời giải
AsyncStorage là một công cụ được sử dụng để lưu trữ dữ liệu trong ứng dụng React Native. Tuy nhiên, trong các phương thức lưu trữ dữ liệu, có một số phương thức không hợp lệ. Trong các lựa chọn trên, phương thức "AsyncStorage.clearAll()" không phải là một phương thức hợp lệ. Điều này là vì AsyncStorage không hỗ trợ phương thức clearAll(). Thay vào đó, bạn có thể sử dụng phương thức clear() để xóa tất cả dữ liệu trong AsyncStorage. Ngoài ra, các phương thức khác như mergeItem(), removeItem() và getAllKeys() đều là hợp lệ và có thể được sử dụng để lưu trữ và quản lý dữ liệu trong ứng dụng.
Mở trang câu hỏi này →
AkeyExtractor
BextractKey
CitemKey
DgetKey
Lời giải
Trong khi sử dụng FlatList để hiển thị danh sách các item, bạn cần phải cung cấp một hàm key extractor để xác định mỗi item trong danh sách. Hàm này sẽ nhận vào một item và trả về một giá trị duy nhất để xác định item đó. Trong React Native, bạn có thể sử dụng prop keyExtractor của FlatList để chỉ định hàm key extractor. Hàm này sẽ được gọi cho mỗi item trong danh sách và sẽ trả về một giá trị duy nhất để xác định item đó. Ví dụ, nếu bạn có một danh sách các item có id, bạn có thể sử dụng hàm key extractor để trả về id của mỗi item.
Mở trang câu hỏi này →
AonChange
BonValueChange
ConToggle
DonPress
Lời giải
Trong React Native, Switch là một thành phần được sử dụng để tạo ra các nút chuyển đổi. Khi trạng thái của nút chuyển đổi thay đổi, bạn có thể định nghĩa một hàm để thực hiện một hành động cụ thể. Prop được sử dụng để định nghĩa hàm này là 'onValueChange'. Khi bạn sử dụng 'onValueChange', bạn sẽ nhận được giá trị mới của trạng thái switch sau khi nó được thay đổi. Điều này cho phép bạn thực hiện các hành động khác nhau dựa trên trạng thái hiện tại của switch. Ví dụ, bạn có thể sử dụng 'onValueChange' để cập nhật trạng thái của ứng dụng khi người dùng bật hoặc tắt switch.
Mở trang câu hỏi này →
Aflex-direction
Bjustify-content
Calign-items
Dflex-wrap
Lời giải
Để định nghĩa hướng chính của một hộp flex trong React Native, bạn cần sử dụng thuộc tính flex-direction. Thuộc tính này cho phép bạn xác định hướng chính của hộp flex, có thể là từ trái sang phải (tương tự như dòng văn bản), từ phải sang trái, từ trên xuống dưới hoặc từ dưới lên trên. Ví dụ, nếu bạn muốn hộp flex có hướng chính từ trái sang phải, bạn có thể sử dụng thuộc tính flex-direction với giá trị 'row'. Nếu bạn muốn hộp flex có hướng chính từ trên xuống dưới, bạn có thể sử dụng thuộc tính flex-direction với giá trị 'column'.
Mở trang câu hỏi này →
AIt is faster because it makes improvements while compiling code in JavaScript
BIt is also safe and most errors can be caught during integration
CIt makes it easier to write templates if you are good with HTML
DIt requires less memory consumption compared to traditional JavaScript syntax
Lời giải
JSX (JavaScript XML) là một tính năng của React giúp bạn viết mã HTML và JavaScript cùng một lúc. Tuy nhiên, không phải tất cả các lợi ích của JSX đều đúng. Trong các lựa chọn trên, câu trả lời đúng là "It requires less memory consumption compared to traditional JavaScript syntax". Điều này là sai vì JSX thực sự đòi hỏi nhiều bộ nhớ hơn so với syntax JavaScript truyền thống. JSX được biên dịch thành JavaScript trước khi được chạy, điều này có thể dẫn đến việc sử dụng nhiều bộ nhớ hơn. Các lợi ích khác của JSX bao gồm việc giúp bạn viết mã nhanh hơn và dễ dàng hơn, cũng như giúp bạn bắt lỗi sớm hơn trong quá trình tích hợp.
Mở trang câu hỏi này →
Ahorizontal
BscrollDirection
CscrollEnabled
Ddirection
Lời giải
Trong các lựa chọn trên, thuộc tính nào trong ScrollView kiểm soát hướng di chuyển của màn hình? ScrollView là một thành phần quan trọng trong giao diện người dùng của ứng dụng di động. Nó cho phép người dùng di chuyển qua các nội dung trên màn hình. Để kiểm soát hướng di chuyển của màn hình, chúng ta cần sử dụng thuộc tính phù hợp. Trong các lựa chọn trên, thuộc tính "horizontal" được sử dụng để kiểm soát hướng di chuyển của màn hình. Nếu bạn muốn màn hình di chuyển theo chiều ngang, bạn có thể sử dụng thuộc tính này. Ngoài ra, bạn cũng có thể sử dụng thuộc tính "scrollDirection" để kiểm soát hướng di chuyển của màn hình. Tuy nhiên, thuộc tính "scrollEnabled" chỉ kiểm soát khả năng di chuyển của màn hình, không kiểm soát hướng di chuyển. Và thuộc tính "direction" không phải là thuộc tính hợp lệ trong ScrollView. Vì vậy, trong các lựa chọn trên, thuộc tính "horizontal" và "scrollDirection" là hai lựa chọn hợp lệ để kiểm soát hướng di chuyển của màn hình trong ScrollView.
Mở trang câu hỏi này →
38Consider the following code snippet4 lựa chọncó codeDễ100% trả lời đúng
Đề bài
using AsyncStorage in React Native. async function saveData(key, value) {
  try {
    await AsyncStorage.setItem(key, value);
  }
  catch (error) {
    console.error('Error saving data', error);
  }
}
async function readData(key) {
  try {
    const value = await AsyncStorage.getItem(key);
    if (value !== null) {
      console.log('Retrieved value:', value);
    }
  }
  catch (error) {
    console.error('Error reading data', error);
  }
}

What will be the output if saveData('username', 'john_doe') is called, followed by readData('username'), assuming no errors occur?

ARetrieved value: john_doe
BError reading data [error object]
CError saving data [error object]
DNo output, as AsyncStorage operations are non-blocking and asynchronous
Lời giải
Khi gọi hàm saveData('username', 'john_doe') và sau đó gọi hàm readData('username'), chúng ta sẽ thấy output là 'Retrieved value: john_doe'. Điều này là vì hàm saveData sẽ lưu trữ giá trị 'john_doe' vào AsyncStorage với key là 'username'. Sau đó, hàm readData sẽ đọc giá trị từ AsyncStorage và in ra console với giá trị vừa được lưu trữ. Nếu không có lỗi xảy ra, hàm readData sẽ trả về giá trị được lưu trữ, vì vậy output sẽ là 'Retrieved value: john_doe'.
Mở trang câu hỏi này →
ATouchableNativeFeedback
BTouchableOpacity
CTouchableHighlight
DTouchableWithoutFeedback
Lời giải
Trong lập trình di động, đặc biệt là Android, việc xử lý chạm (touch) là một phần quan trọng của giao diện người dùng. Để giúp các view phản ứng đúng cách với các chạm, chúng ta cần sử dụng một thành phần cụ thể. Trong các lựa chọn đã cho, thành phần nào là một wrapper giúp các view này phản ứng đúng cách với các chạm?
Mở trang câu hỏi này →
ALocationPicker
BGeolocation
CLocation
DPicker
Lời giải
Để xác định vị trí của người dùng, chúng ta cần sử dụng một nền tảng API phù hợp. Trong số các lựa chọn đã cho, nền tảng API được sử dụng để bắt được dữ liệu vị trí của người dùng là Geolocation. Geolocation là một tính năng của trình duyệt web, cho phép nó xác định vị trí của thiết bị dựa trên thông tin từ các nguồn khác nhau như GPS, Wi-Fi, mạng di động và các thông tin khác. Nó cung cấp cho người dùng khả năng xác định vị trí của mình và cung cấp dữ liệu vị trí cho các ứng dụng web. Vì vậy, trong trường hợp này, Geolocation là lựa chọn đúng.
Mở trang câu hỏi này →
41Which of the following are iOS components?4 lựa chọnTrung bình50% trả lời đúng
ADrawerLayoutAndroid
BTouchableNativeFeedback
CInputAccessoryView
DSafeAreaView
Lời giải
Câu hỏi này yêu cầu bạn xác định các thành phần iOS trong danh sách lựa chọn. Để trả lời câu hỏi này, bạn cần biết về các thành phần Android và iOS. DrawerLayoutAndroid là một thành phần Android, vì vậy nó không phải là một thành phần iOS. TouchableNativeFeedback cũng là một thành phần Android, vì vậy nó cũng không phải là một thành phần iOS. InputAccessoryView và SafeAreaView là hai thành phần iOS. InputAccessoryView được sử dụng để thêm một bộ phận phụ vào phía trên của một màn hình, trong khi SafeAreaView được sử dụng để đảm bảo rằng một thành phần luôn nằm trong vùng an toàn của màn hình. Vì vậy, câu trả lời đúng cho câu hỏi này là InputAccessoryView và SafeAreaView.
Mở trang câu hỏi này →
AuseNavigation
BuseRoute
CuseFocusEffect
DuseIsFocused
Lời giải
Để thực hiện một hành động chỉ khi màn hình đầu tiên được mount trong React Navigation, bạn có thể sử dụng hook nào sau đây?
Mở trang câu hỏi này →
43Which method is used again whenever there is any change in the state or props?4 lựa chọnTrung bình60% trả lời đúng
Arender()
BshouldComponentUpdate()
Cconstructor()
DgetSnapshotBeforeUpdate()
Lời giải
Khi có bất kỳ thay đổi nào trong trạng thái hoặc thuộc tính của một thành phần React, phương thức nào được sử dụng lại để cập nhật giao diện?
Mở trang câu hỏi này →
AonChangeText={text => setText(text)}
BonChangeText=text => setText(text)
ConChangeText={text => setTextValue(text)}
DonChangeText={text = setText(text)}
Lời giải
Để sử dụng onChangeText và setText cùng nhau trong một TextInput component, chúng ta cần hiểu rõ về cách sử dụng các hàm này. onChangeText là một hàm được gọi khi người dùng nhập vào văn bản mới trong TextInput. Hàm này nhận vào một tham số là text, đại diện cho văn bản mới được nhập vào. setText là một hàm được sử dụng để cập nhật giá trị của một biến. Để sử dụng onChangeText và setText cùng nhau, chúng ta cần sử dụng một hàm mũi tên (arrow function) để chuyển đổi text thành một giá trị có thể được sử dụng bởi setText. Ví dụ, onChangeText={text => setText(text)} là một cách sử dụng đúng. Trong ví dụ này, hàm mũi tên nhận vào text và sử dụng setText để cập nhật giá trị của biến. Các ví dụ khác như onChangeText=text => setText(text) hoặc onChangeText={text => setTextValue(text)} không chính xác vì chúng không sử dụng hàm mũi tên đúng cách. Ví dụ cuối cùng onChangeText={text = setText(text)} không chính xác vì nó sử dụng dấu = sai, thay vì sử dụng dấu => để định nghĩa hàm mũi tên.
Mở trang câu hỏi này →