PRM392Chưa đoKỳ 7Chuyên ngành Cập nhật 24/07/2026

Mobile Programming - Lập trình di động

Ôn luyện PRM392 – Lập trình di động (Mobile Programming) với ngân hàng câu hỏi trắc nghiệm Android có giải thích chi tiết, luyện thi cuối kỳ hiệu quả. Nội dung bao quát Activity, Fragment, RecyclerView, Intent, Service, BroadcastReceiver, lưu trữ SharedPreferences/SQLite và gọi API/Retrofit. Môn 3 tín chỉ tại FPT University, tiên quyết PRO192, lập trình bằng Java trên Android Studio.

271Câu hỏi
9Chủ đề

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

244/271 câuCòn 27
AThe ViewModel manages the UI state and interacts with the Model.
BThe ViewModel directly manipulates the View's UI elements.
CThe ViewModel handles user input events.
DThe ViewModel is responsible for data persistence.
Lời giải
Trong kiến trúc MVVM, ViewModel đóng vai trò quan trọng trong việc quản lý trạng thái giao diện người dùng và tương tác với Model. Nó giúp tách biệt logic kinh doanh và logic giao diện, tạo điều kiện thuận lợi cho việc phát triển và bảo trì ứng dụng. ViewModel nhận dữ liệu từ Model và xử lý dữ liệu đó, sau đó cập nhật trạng thái giao diện người dùng. Điều này giúp giảm thiểu sự phụ thuộc vào giao diện và tăng cường khả năng tái sử dụng mã nguồn. Ngoài ra, ViewModel cũng giúp kiểm soát luồng dữ liệu và đảm bảo rằng dữ liệu được cập nhật một cách đồng bộ.
Mở trang câu hỏi này →
A@Body
B@PostBody
C@Json
D@RequestBody
Lời giải

Để xác định một cơ thể JSON trong một yêu cầu POST bằng Retrofit, bạn cần sử dụng annotation '@Body'. Annotation này cho phép bạn truyền một đối tượng Java sang phương thức API của Retrofit. Khi sử dụng '@Body', bạn cần tạo một lớp Java có phương thức toString() để chuyển đổi đối tượng thành JSON. Ví dụ, nếu bạn muốn gửi một đối tượng User sang API, bạn cần tạo một lớp User với phương thức toString() như sau:

Lời giải
public class User {
private String name;
private int age;

@Override

Lời giải
public String toString() {
return "User {name='" + name + "', age=" + age + "}";
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

}

Sau đó, bạn có thể sử dụng '@Body' để gửi đối tượng User sang API như sau: @POST("/users")

Lời giải
Call<User> createUser(@Body User user);

Bằng cách sử dụng '@Body', bạn có thể dễ dàng gửi các đối tượng Java sang API của Retrofit.

Mở trang câu hỏi này →
Aclear()
BremoveMarker()
CremovePolyline()
DresetMap()
Lời giải
Để xóa tất cả các dấu chấm, đường cong, hình đa giác và lớp phủ khỏi bản đồ Google Map, bạn cần sử dụng phương thức nào? Trong các phương thức sau, phương thức nào có thể thực hiện được việc này?
Mở trang câu hỏi này →
Đề bài
new NotificationChannel(channelId, name, importance);
AcreateNotificationChannel(channel)
BaddNotificationChannel(channel)
CsetNotificationChannel(channel)
DbuildNotificationChannel(channel)
Lời giải
Để tạo một kênh thông báo, bạn cần sử dụng phương thức tạo kênh thông báo. Phương thức này được sử dụng để tạo một đối tượng NotificationChannel mới. Trong ví dụ này, bạn cần sử dụng phương thức createNotificationChannel để tạo một kênh thông báo mới. Phương thức này chấp nhận ba tham số: channelId, name và importance. Tham số channelId là ID duy nhất của kênh thông báo, name là tên của kênh thông báo và importance là mức độ quan trọng của kênh thông báo. Phương thức này được sử dụng để tạo một kênh thông báo mới và nó sẽ được sử dụng để hiển thị thông báo trên thiết bị di động.
Mở trang câu hỏi này →
ATo store large datasets
BTo store private primitive data in key-value pairs
CTo manage SQLite databases
DTo send data over the network
Lời giải
Shared Preferences là một công cụ được sử dụng trong Android development để lưu trữ dữ liệu cơ bản, như số nguyên, chuỗi, boolean, v.v. trong các cặp khóa-giá trị. Nó được sử dụng để lưu trữ dữ liệu cá nhân, như cài đặt người dùng, trạng thái ứng dụng, v.v. Shared Preferences cho phép bạn lưu trữ dữ liệu trong một tệp tin XML, và bạn có thể đọc và viết dữ liệu từ tệp tin này. Nó được sử dụng rộng rãi trong các ứng dụng Android để lưu trữ dữ liệu cơ bản và dễ dàng truy cập.
Mở trang câu hỏi này →
ABy calling the `createNotificationChannel()` method on the NotificationManager class.
BBy constructing a NotificationChannel object and passing it to the `createNotificationChannel()` method on the NotificationManager class.
CBy adding a <notification-channel> tag in the AndroidManifest.xml file.
DBy setting a channel attribute in the <notification> tag in the layout XML file.
Lời giải
Để tạo một kênh thông báo trong Android, bạn cần thực hiện các bước sau. Trước hết, bạn cần tạo một đối tượng NotificationChannel bằng cách sử dụng phương thức NotificationChannel(String channelId, String channelName, int importance). Sau đó, bạn cần gọi phương thức createNotificationChannel() trên đối tượng NotificationManager để tạo kênh thông báo. Điều này cho phép bạn quản lý các thông báo của ứng dụng của mình và cung cấp cho người dùng khả năng kiểm soát các thông báo.
Mở trang câu hỏi này →
ANotification channels allow users to manage and control notification behavior for each category of notifications.
BNotification channels are used to define the layout of notification cards.
CNotification channels determine the priority of notifications.
DNotification channels handle the delivery of notifications to the device.
Lời giải
Tính quan trọng của kênh thông báo trong Android là gì? Kênh thông báo cho phép người dùng quản lý và kiểm soát hành vi thông báo cho mỗi loại thông báo. Điều này giúp người dùng dễ dàng nhận biết và quản lý các loại thông báo khác nhau, chẳng hạn như thông báo từ ứng dụng trò chơi, ứng dụng mạng xã hội hoặc ứng dụng email. Kênh thông báo cũng cho phép người dùng tùy chỉnh mức độ ưu tiên và cách hiển thị thông báo, giúp họ có thể tập trung vào những thông báo quan trọng nhất.
Mở trang câu hỏi này →
AA path to a webpage or file, structured as file:// or http://.
BA path to the data of a Content Provider, structured as content://<authority>/<path>/<id>.
CA path to the internal database, accessible only by the originating application.
DA path to a resource on the server, used to call APIs.
Lời giải

URI nội dung (Content URI) là một loại URI được sử dụng để truy cập dữ liệu từ một Content Provider. Nó được cấu trúc theo dạng content:// <authority> / <path> / <id>, nơi <authority> là tên của Content Provider, <path> là đường dẫn đến dữ liệu và <id> là ID của dữ liệu cụ thể. Ví dụ, nếu bạn muốn truy cập dữ liệu từ Content Provider có tên là 'com.example.provider' và đường dẫn đến dữ liệu là 'users', thì URI nội dung sẽ là content://com.example.provider/users/1, nơi 1 là ID của dữ liệu cụ thể. URI nội dung được sử dụng rộng rãi trong các ứng dụng di động để truy cập và quản lý dữ liệu từ các Content Provider khác nhau.

Mở trang câu hỏi này →
Asocket(), connect(), read(), write(), close()
Bsocket(), bind(), listen(), accept(), write(), read(), close()
Csocket(), bind(), listen(), read(), write(), close()
Dsocket(), accept(), connect(), write(), read(), close()
Lời giải
Để thiết lập kết nối và bắt đầu trao đổi dữ liệu từ máy chủ, chúng ta cần thực hiện các bước theo thứ tự như sau. Trước hết, chúng ta tạo một socket bằng phương thức socket(). Sau đó, chúng ta gắn địa chỉ IP và số cổng vào socket bằng phương thức bind(). Tiếp theo, chúng ta đặt socket vào trạng thái lắng nghe bằng phương thức listen(). Khi một yêu cầu kết nối đến, máy chủ sẽ chấp nhận kết nối bằng phương thức accept(). Sau khi thiết lập kết nối thành công, chúng ta có thể gửi dữ liệu từ máy chủ đến máy khách bằng phương thức write() và nhận dữ liệu từ máy khách bằng phương thức read(). Cuối cùng, khi kết thúc quá trình trao đổi dữ liệu, chúng ta cần đóng socket bằng phương thức close().
Mở trang câu hỏi này →
Abind()
Blisten()
Cconnect()
Daccept()
Lời giải
Để một socket của client thực hiện kết nối đến một server tại một địa chỉ IP và cổng cụ thể, chúng ta sử dụng phương thức connect(). Phương thức này cho phép client socket gửi yêu cầu kết nối đến server socket. Khi client socket gọi phương thức connect(), nó sẽ gửi một gói tin yêu cầu kết nối đến server socket. Nếu server socket cho phép kết nối, nó sẽ trả lại một gói tin chấp nhận kết nối và quá trình kết nối sẽ được thiết lập. Phương thức connect() là một trong những phương thức quan trọng nhất trong việc thiết lập kết nối giữa client và server.
Mở trang câu hỏi này →
AIt fills the entire layout vertically.
BIt makes the TextView disappear.
CIt assigns equal space to the TextView alongside other components with weight.
DIt changes the orientation to horizontal.
Lời giải
Khi thêm android:layout_weight="1" vào một TextView trong một LinearLayout có chiều hướng dọc, điều này sẽ giúp TextView chiếm một phần không gian trong layout theo tỷ lệ. Nếu có nhiều View khác trong layout cũng có android:layout_weight="1", chúng sẽ được phân bổ không gian đều nhau. Điều này có nghĩa là TextView sẽ chiếm một phần không gian bằng nhau với các View khác trong layout. Tuy nhiên, nếu có View khác có android:layout_weight khác 1, nó sẽ chiếm phần không gian khác nhau. Điều này giúp bạn có thể phân bổ không gian trong layout một cách linh hoạt và dễ dàng.
Mở trang câu hỏi này →
AsetOnEditorActionListener
BaddTextChangedListener
CsetOnFocusChangeListener
DsetOnKeyListener
Mở trang câu hỏi này →
AAlign a chain of Views in one of two directions.
BDistribute space evenly between Views in a chain.
CConnect Views to their parent.
DCreate a linear layout.
Lời giải
Trong ConstraintLayout, chuỗi (chain) được sử dụng để sắp xếp và liên kết các View với nhau. Một chuỗi có thể được sử dụng để căn chỉnh một nhóm View theo một trong hai hướng (hướng dọc hoặc ngang). Ngoài ra, chuỗi cũng có thể được sử dụng để phân phối không gian đều giữa các View trong chuỗi. Điều này giúp tạo ra một bố cục đẹp mắt và dễ sử dụng. Ví dụ, bạn có thể sử dụng chuỗi để căn chỉnh một nhóm View theo hướng dọc và phân phối không gian đều giữa chúng.
Mở trang câu hỏi này →
ADialogFragment
BListFragment
CPreferenceFragment
DFragment
Lời giải
Để hiển thị một màn hình cài đặt với nhiều tùy chọn cho phép người dùng thay đổi các thiết lập của ứng dụng, Fragment subclass phù hợp nhất là PreferenceFragment. PreferenceFragment là một loại Fragment được thiết kế để hiển thị và quản lý các tùy chọn của ứng dụng, bao gồm các mục như cài đặt chung, cài đặt âm thanh, cài đặt mạng, v.v. Nó cho phép người dùng dễ dàng truy cập và thay đổi các thiết lập của ứng dụng mà không cần phải chuyển đổi giữa các màn hình khác nhau. PreferenceFragment cũng cung cấp các tính năng như lưu trữ và tải lại các tùy chọn, giúp người dùng có thể dễ dàng quản lý các thiết lập của ứng dụng.
Mở trang câu hỏi này →
AINSERT
BUPDATE
CDELETE
DSELECT
Lời giải
Để lấy dữ liệu từ một bảng trong cơ sở dữ liệu, bạn cần sử dụng lệnh SQL phù hợp. Trong bốn lựa chọn trên, chỉ có lệnh SELECT mới đáp ứng được yêu cầu này. Lệnh INSERT dùng để thêm mới dữ liệu, lệnh UPDATE dùng để cập nhật dữ liệu đã tồn tại và lệnh DELETE dùng để xóa dữ liệu khỏi bảng. Vì vậy, lệnh SELECT là lựa chọn đúng để lấy dữ liệu từ một bảng.
Mở trang câu hỏi này →
ATo send push notifications
BTo store structured data locally in a lightweight database
CTo manage user preferences
DTo build UI layouts
Lời giải
SQLite là một cơ sở dữ liệu nhẹ được sử dụng trong Android để lưu trữ dữ liệu có cấu trúc cục bộ. Mục đích chính của SQLite là cung cấp một cách dễ dàng để lưu trữ và truy xuất dữ liệu trong ứng dụng Android mà không cần phải kết nối đến một cơ sở dữ liệu bên ngoài. SQLite cho phép bạn tạo và quản lý các bảng, thêm, cập nhật và xóa dữ liệu, cũng như thực hiện các truy vấn phức tạp để lấy dữ liệu. Điều này giúp cho việc phát triển ứng dụng Android trở nên dễ dàng hơn và hiệu quả hơn. SQLite thường được sử dụng để lưu trữ dữ liệu người dùng, như thông tin đăng nhập, cài đặt ứng dụng, v.v.
Mở trang câu hỏi này →
ARequest the permission.
BDesign your app UX to be self-explanatory.
CDeclare the permission in your app's manifest file.
DWait for the user to request a specific action.
Lời giải
Bước đầu tiên trong quy trình xử lý quyền cho ứng dụng Android là gì? Để bắt đầu, bạn cần khai báo quyền trong tệp manifest.xml của ứng dụng. Tệp này chứa thông tin cơ bản về ứng dụng, bao gồm quyền cần thiết. Khi khai báo quyền, bạn cần chỉ định quyền đó có thể được sử dụng ở cấp độ nào: cấp độ ứng dụng (app), cấp độ hoạt động (activity) hoặc cấp độ dịch vụ (service). Sau khi khai báo quyền, bạn có thể yêu cầu quyền này khi ứng dụng được chạy.
Mở trang câu hỏi này →
AINTERNET, because it allows the application to access the network.
BCAMERA, because it allows the application to access the camera and may capture images without the user's knowledge.
CVIBRATE, because it causes vibration on the device.
DSET_WALLPAPER, because it can change the user interface.
Lời giải
Trong danh sách các nhóm quyền, nhóm nào được coi là "mạo hiểm" và tại sao? Các nhóm quyền được liệt kê bao gồm INTERNET, CAMERA, VIBRATE và SET_WALLPAPER. Trong số đó, nhóm CAMERA được coi là "mạo hiểm" vì nó cho phép ứng dụng truy cập vào camera và có thể chụp ảnh mà không cần sự đồng ý của người dùng. Điều này có thể gây ra hậu quả nghiêm trọng nếu ứng dụng không được kiểm soát và sử dụng một cách hợp lý. Vì vậy, nhóm CAMERA được coi là "mạo hiểm" và cần được sử dụng một cách cẩn thận.
Mở trang câu hỏi này →
AAdd a <uses-permission> tag as a child tag of the <manifest> tag in AndroidManifest.xml
BAdd a <add-permission> tag as a child tag of the <manifest> tag in AndroidManifest.xml.
CAdd a <uses-permission> tag as a child tag of the <application> tag in AndroidManifest.xml.
DAdd a <permission> tag as a child tag of the <application> tag in AndroidManifest.xml
Lời giải

Để thêm quyền truy cập vào ứng dụng của bạn, bạn cần thêm thẻ <uses-permission> như một thẻ con của thẻ <manifest> trong AndroidManifest.xml. Điều này cho phép ứng dụng của bạn truy cập các quyền hệ thống cần thiết để hoạt động. Ví dụ, nếu ứng dụng của bạn cần truy cập camera, bạn cần thêm thẻ

Lời giải
<uses-permission android:name="android.permission.CAMERA"/>

như một thẻ con của thẻ <manifest>. Điều này giúp bảo đảm rằng ứng dụng của bạn không vi phạm các quy định bảo mật và quyền riêng tư của người dùng.

Mở trang câu hỏi này →
AIt is a subclass of the Service class.
BIt can interact directly with the user interface.
CIt handles requests using a worker thread.
DIt automatically stops itself when it runs out of work.
Lời giải
IntentService là một lớp dịch vụ trong Android được sử dụng để thực hiện các tác vụ nền. Nó là một lớp con của lớp Service và được thiết kế để xử lý các yêu cầu trong một luồng làm việc riêng biệt. Điều này giúp tránh các vấn đề về hiệu suất và đảm bảo rằng các tác vụ nền được thực hiện một cách hiệu quả. IntentService có thể được sử dụng để thực hiện các tác vụ như tải dữ liệu từ mạng, xử lý hình ảnh, v.v. Nó tự động dừng lại khi không còn tác vụ nào cần thực hiện. Tuy nhiên, một điều quan trọng cần lưu ý là IntentService không thể tương tác trực tiếp với giao diện người dùng.
Mở trang câu hỏi này →