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

184/271 câuCòn 87
ASystem broadcasts are sent by the system; custom broadcasts are sent by apps
BSystem broadcasts handle UI updates; custom broadcasts handle background tasks
CSystem broadcasts are for network operations; custom broadcasts are for file operations
DSystem broadcasts are less secure than custom broadcasts
Lời giải
Trong Android, hệ thống broadcast và broadcast tùy chỉnh là hai loại broadcast khác nhau. Hệ thống broadcast được gửi bởi hệ thống, chẳng hạn như khi có sự kiện mới xảy ra như khi một ứng dụng được cài đặt hoặc khi một thiết bị mới được kết nối. Trong khi đó, broadcast tùy chỉnh được gửi bởi các ứng dụng, thường để thông báo về một sự kiện cụ thể nào đó. Ví dụ, một ứng dụng có thể gửi broadcast tùy chỉnh khi người dùng đăng nhập thành công hoặc khi người dùng thực hiện một hành động cụ thể nào đó. Sự khác biệt chính giữa hệ thống broadcast và broadcast tùy chỉnh là nguồn gốc của chúng. Hệ thống broadcast được gửi bởi hệ thống, trong khi broadcast tùy chỉnh được gửi bởi các ứng dụng.
Mở trang câu hỏi này →
ATo provide key capabilities to developers
BTo configure the entire project
CTo enhance security
DTo handle notifications
Lời giải
Tập tin build.gradle ở mức dự án có mục đích chính là cấu hình toàn bộ dự án. Nó chứa các thông tin quan trọng như các module phụ thuộc, các thư viện sử dụng, cấu hình build, v.v. Mục đích chính của tập tin này là giúp cho quá trình xây dựng dự án trở nên dễ dàng và hiệu quả hơn. Nó cho phép các nhà phát triển cấu hình lại dự án theo nhu cầu của mình, từ việc chọn các module phụ thuộc đến việc cấu hình các tùy chọn build.
Mở trang câu hỏi này →
ASystem Apps
BUser Apps
CLinux Kernel
DJava API Framework
Lời giải
Hệ điều hành Android được xây dựng trên nền tảng Linux, vì vậy nhân Linux Kernel là phần cốt lõi của hệ điều hành này. Nhân Linux Kernel chịu trách nhiệm quản lý các tài nguyên hệ thống, bao gồm bộ nhớ, CPU và các thiết bị ngoại vi. Nó cũng cung cấp các dịch vụ cơ bản như quản lý file, mạng và các dịch vụ khác. Nhân Linux Kernel được viết bằng ngôn ngữ C và được sử dụng rộng rãi trong nhiều hệ điều hành khác nhau. Vì vậy, nhân Linux Kernel là phần cốt lõi của hệ điều hành Android và là lựa chọn đúng.
Mở trang câu hỏi này →
ATo provide pre-built applications for Android devices
BTo offer a set of tools and libraries for developing Android apps.
CTo manage the Android operating system updates.
DTo simulate Android hardware for testing purposes.
Lời giải
Bộ công cụ phát triển phần mềm Android (Android Software Development Kit - SDK) là một bộ công cụ quan trọng giúp các nhà phát triển tạo ra các ứng dụng Android. Bộ công cụ này cung cấp một bộ công cụ và thư viện để giúp các nhà phát triển xây dựng, thử nghiệm và phân phối các ứng dụng Android. Với SDK, các nhà phát triển có thể tạo ra các ứng dụng tùy chỉnh, hiệu suất cao và an toàn cho các thiết bị Android. Bộ công cụ này cũng cung cấp các công cụ để giúp các nhà phát triển thử nghiệm và tối ưu hóa các ứng dụng của họ.
Mở trang câu hỏi này →
AManages system and user apps
BProvides a way to access hardware-specific features
CManages memory allocation
DProvides runtime environment
Lời giải
Câu hỏi này yêu cầu bạn xác định vai trò chính của Hardware Abstraction Layer (HAL) trong Android. HAL là một phần quan trọng của hệ điều hành Android, giúp tạo ra một lớp trừu tượng giữa phần mềm và phần cứng. Điều này cho phép các nhà phát triển ứng dụng Android truy cập vào các tính năng và khả năng của thiết bị mà không cần phải biết chi tiết về phần cứng cụ thể. Ví dụ, HAL có thể cung cấp cách truy cập vào camera, GPS, cảm biến, v.v. Mục đích chính của HAL là cung cấp một cách thống nhất để truy cập vào các tính năng và khả năng của thiết bị, giúp các nhà phát triển ứng dụng Android có thể tập trung vào việc phát triển ứng dụng mà không cần phải lo lắng về chi tiết về phần cứng.
Mở trang câu hỏi này →
AServices are more suitable for long-running background tasks
BActivities are better for handling background operations
CServices can run indefinitely even when the user is not interacting with the app
DActivities provide better performance for background tasks
Lời giải
So sánh hiệu quả của việc sử dụng Services cho các tác vụ nền so với Activities. Các Services phù hợp hơn cho các tác vụ nền dài hạn vì chúng có thể chạy liên tục mà không cần phải chờ đợi phản hồi từ người dùng. Điều này giúp giảm tải cho các Activity chính và cải thiện hiệu suất của ứng dụng. Ngoài ra, các Services cũng có thể chạy trong nền ngay cả khi người dùng không tương tác với ứng dụng, giúp đảm bảo rằng các tác vụ nền được thực hiện một cách liên tục.
Mở trang câu hỏi này →
AA Floating Context Menu affects a single item, while a Contextual Action Mode can affect multiple selected items.
BA Floating Context Menu appears as a popup, while a Contextual Action Mode appears as a temporary action bar.
CA Floating Context Menu is invoked by a long press, while a Contextual Action Mode is invoked by selecting multiple items.
DAll of the others.
Lời giải
Floating Context Menu và Contextual Action Mode là hai loại menu ngữ cảnh khác nhau trong thiết kế giao diện người dùng. Floating Context Menu là một loại menu ngữ cảnh nổi lên khi người dùng nhấn giữ vào một mục cụ thể, cho phép thực hiện các hành động liên quan đến mục đó. Ngược lại, Contextual Action Mode là một loại menu ngữ cảnh tạm thời xuất hiện khi người dùng chọn nhiều mục, cho phép thực hiện các hành động liên quan đến các mục đã chọn. Floating Context Menu chỉ ảnh hưởng đến một mục duy nhất, trong khi Contextual Action Mode có thể ảnh hưởng đến nhiều mục đã chọn. Floating Context Menu xuất hiện như một popup, trong khi Contextual Action Mode xuất hiện như một hành động tạm thời trên thanh trạng thái. Floating Context Menu được kích hoạt bằng cách nhấn giữ, trong khi Contextual Action Mode được kích hoạt bằng cách chọn nhiều mục.
Mở trang câu hỏi này →
ATo display a scrolling list of elements
BTo manage a collection of database records
CTo capture user input text
DTo display a single image from the web
Lời giải
RecyclerView trong Android phát triển được sử dụng để hiển thị danh sách các yếu tố có khả năng cuộn. Nó được thiết kế để hiển thị danh sách các yếu tố có số lượng lớn, chẳng hạn như danh sách các bài viết, danh sách các sản phẩm, v.v. RecyclerView cho phép bạn hiển thị danh sách các yếu tố một cách hiệu quả và linh hoạt, đồng thời cũng cho phép bạn tùy chỉnh giao diện và hành vi của danh sách theo nhu cầu của mình. Ngoài ra, RecyclerView cũng hỗ trợ các tính năng như lưu trữ trạng thái, hiệu suất cao và khả năng tùy chỉnh cao.
Mở trang câu hỏi này →
ATextView
BEditText
CImageView
DCheckBox
Lời giải
Để hiển thị hình ảnh trong RecyclerView, bạn cần sử dụng một thành phần đặc biệt trong phương thức onBindViewHolder của adapter. Thành phần này có nhiệm vụ hiển thị hình ảnh và giúp người dùng dễ dàng nhận biết hình ảnh trong danh sách. Trong các lựa chọn, thành phần ImageView là lựa chọn đúng. Nó cho phép bạn hiển thị hình ảnh từ nguồn khác nhau như URL, nguồn nội bộ hoặc nguồn từ cơ sở dữ liệu. Ngoài ra, bạn cũng có thể sử dụng các thuộc tính khác của ImageView để tùy chỉnh kích thước, màu sắc và các tính năng khác của hình ảnh.
Mở trang câu hỏi này →
ATo change the visible image by setting a Drawable object
BTo change the visible image by setting a drawable resource ID
CTo change the visible image by setting a URI
DTo change the visible image by setting a Bitmap object
Lời giải
Métodu setImageDrawable() trong lớp ImageView được sử dụng để thay đổi hình ảnh hiện thị bằng cách đặt một đối tượng Drawable. Đối tượng này có thể là một hình ảnh được tạo sẵn trong ứng dụng hoặc một hình ảnh được tải từ nguồn khác. Khi gọi phương thức này, hình ảnh hiện tại sẽ bị thay thế bởi hình ảnh mới được đặt. Điều này cho phép người dùng thay đổi hình ảnh được hiển thị trong ImageView mà không cần phải tạo lại toàn bộ giao diện.
Mở trang câu hỏi này →
ALinearLayout, FrameLayout, StaggredGridLayout
BFrameLayout, GridLayout, ConstraintLayout
CLinearLayout, GridLayout, StaggredGridLayout
DConstraintLayout, GridLayout, StaggredGridLayout
Lời giải
RecyclerView cung cấp ba loại bố cục mặc định để người dùng lựa chọn. Trong số các lựa chọn đó, có ba loại bố cục được đề cập trong câu hỏi: LinearLayout, FrameLayout và StaggeredGridLayout. Tuy nhiên, cần lưu ý rằng RecyclerView không hỗ trợ FrameLayout và ConstraintLayout như một loại bố cục mặc định. FrameLayout thường được sử dụng để chứa một widget duy nhất, trong khi ConstraintLayout là một loại bố cục phức tạp hơn và thường được sử dụng trong các ứng dụng phức tạp hơn. Vì vậy, câu trả lời đúng cho câu hỏi này là LinearLayout, GridLayout và StaggeredGridLayout.
Mở trang câu hỏi này →
AInitializes the Google Play Services.
BLoads the Google Map API key.
CNotifies when the map is ready to be used.
DAdds the map fragment to the layout.
Lời giải
Lớp OnMapReadyCallback là một giao diện trong Google Maps Android API, được sử dụng để thông báo khi bản đồ đã sẵn sàng để sử dụng. Khi bạn tạo một đối tượng GoogleMap, nó sẽ được gọi khi bản đồ đã được tải và sẵn sàng để sử dụng. Trong phương thức này, bạn có thể thêm các marker, polyline, circle, polygon, v.v. vào bản đồ. Nó cũng cho phép bạn thay đổi các thuộc tính của bản đồ như zoom, rotate, v.v. Ngoài ra, bạn cũng có thể sử dụng phương thức này để tải các dữ liệu từ server và hiển thị chúng trên bản đồ.
Mở trang câu hỏi này →
A<MapView>
B<MapFragment>
C<fragment>
D<GoogleMap>
Lời giải

Để thêm một bản đồ Google vào một layout Android, bạn cần sử dụng thẻ XML <fragment>. Thẻ này cho phép bạn thêm các yếu tố UI khác nhau vào layout của mình, bao gồm cả bản đồ Google. Khi sử dụng thẻ <fragment>, bạn cần thêm một thẻ <com.google.android.gms.maps.MapFragment> bên trong nó để hiển thị bản đồ Google. Điều này cho phép bạn dễ dàng thêm và quản lý các yếu tố UI khác nhau trong layout của mình.

Mở trang câu hỏi này →
AMapView
BGoogleMap
CMapFragment
DLocationManager
Lời giải
Khi sử dụng Google Maps API trong Android, lớp chính mà bạn tương tác với là GoogleMap. GoogleMap là một lớp quan trọng trong thư viện Google Maps Android API, cung cấp các phương thức để hiển thị bản đồ, thêm các marker, đường cong, hình dạng và các tính năng khác. Để sử dụng GoogleMap, bạn cần thêm thư viện Google Maps Android API vào dự án của mình và tạo một đối tượng GoogleMap trong Activity hoặc Fragment của mình. Sau đó, bạn có thể sử dụng các phương thức của GoogleMap để tùy chỉnh bản đồ và thêm các tính năng khác.
Mở trang câu hỏi này →
Aandroid.permission.READ_EXTERNAL_STORAGE
Bandroid.permission.WRITE_EXTERNAL_STORAGE
Candroid.permission.CAMERA
Dandroid.permission.SEND_SMS
Lời giải
Để một ứng dụng Android có thể ghi vào bộ nhớ ngoài, ứng dụng đó cần có quyền truy cập vào bộ nhớ ngoài. Trong danh sách các quyền được liệt kê, quyền "android.permission.WRITE_EXTERNAL_STORAGE" là quyền cho phép ứng dụng ghi vào bộ nhớ ngoài. Điều này có nghĩa là ứng dụng có thể lưu trữ dữ liệu của mình vào bộ nhớ ngoài, chẳng hạn như bộ nhớ đệm, thẻ nhớ hoặc bộ nhớ USB. Quyền này rất quan trọng vì nó cho phép ứng dụng lưu trữ dữ liệu lớn và truy cập vào bộ nhớ ngoài một cách dễ dàng. Tuy nhiên, quyền này cũng có thể gây ra vấn đề bảo mật nếu không được sử dụng một cách cẩn thận.
Mở trang câu hỏi này →
AString value = pref.getString("key", "default");
BString value = pref.getString("key", "null");
CString value = pref.getString("key", "empty");
DString value = pref.getString("key", "none");
Lời giải

Để lấy dữ liệu từ Shared Preferences trong Android, bạn cần sử dụng phương thức getString() của SharedPreferences. Phương thức này yêu cầu hai tham số: key (chìa khóa) và defaultValue (giá trị mặc định). Nếu giá trị được lưu trữ dưới key không tồn tại, phương thức sẽ trả về defaultValue. Ví dụ, bạn muốn lấy giá trị của key "key", nhưng giá trị này chưa được lưu trữ, thì bạn có thể sử dụng phương thức như sau: String value = pref.getString("key", "default");. Trong ví dụ này, "default" là giá trị mặc định sẽ được trả về nếu giá trị được lưu trữ dưới key "key" không tồn tại.

Mở trang câu hỏi này →
AIt indicates that the external storage is not available.
BIt indicates that the external storage is available for read and write operations.
CIt indicates that the external storage is available for read-only operations.
DIt indicates that the external storage is permanently removed.
Lời giải
Trạng thái MEDIA_MOUNTED trong lưu trữ ngoại vi có ý nghĩa quan trọng trong việc xác định khả năng truy cập và sử dụng của lưu trữ này. Khi một thiết bị lưu trữ ngoại vi được kết nối và trạng thái của nó là MEDIA_MOUNTED, điều đó có nghĩa là thiết bị này đã sẵn sàng để sử dụng và có thể thực hiện các hoạt động đọc và ghi dữ liệu. Điều này cho phép các ứng dụng di động truy cập và sử dụng dữ liệu trên thiết bị lưu trữ ngoại vi một cách hiệu quả. Trạng thái này cũng cho phép các ứng dụng di động thực hiện các hoạt động như sao chép, xóa và cập nhật dữ liệu trên thiết bị lưu trữ ngoại vi.
Mở trang câu hỏi này →
Đề bài
new String[] {
  KEY_ID, COL1, COL2
}

; Cursor allRows =

Đề bài
myDatabase.query(true, DATABASE_TABLE, result_columns, null, null, null, null, null, null);

Which of the following prints out the values of COL1 column correctly if the result is not empty?

Aif (cursor.moveToFirst()) { do { System.out.println(cursor.getString(1)); } while (cursor.moveToNext()); }
Bdo { System.out.println(cursor.getString(0)); } while (cursor.moveToNext());
Cif (cursor.moveToFirst()) { do { System.out.println(cursor.getString(0)); } while (cursor.moveToNext()); }
Dif (cursor != null) { do { System.out.println(cursor.getString(1)); } while (!cursor.isNull()); }
Lời giải

Để in ra giá trị của cột COL1 trong kết quả không trống, chúng ta cần sử dụng phương thức getString() với chỉ số vị trí cột trong mảng result_columns. Trong trường hợp này, COL1 nằm ở vị trí thứ 1 trong mảng, vì KEY_ID và COL1 được đặt trước COL2. Do đó, chúng ta cần sử dụng chỉ số 1 trong phương thức getString(). Ngoài ra, chúng ta cần kiểm tra xem con trỏ của Cursor đã được đặt vào vị trí đầu tiên hay chưa bằng phương thức moveToFirst(). Nếu đã được đặt vào vị trí đầu tiên, chúng ta mới có thể bắt đầu lặp qua các hàng trong kết quả bằng phương thức do-while. Vì vậy, câu trả lời đúng là:

Lời giải
if (cursor.moveToFirst()) {
  do {
    System.out.println(cursor.getString(1));
  }
  while (cursor.moveToNext());
}
Mở trang câu hỏi này →
ATransactions ensure atomicity; either all operations succeed, or none do.
BTransactions improve database performance.
CTransactions are required by Android's SQLite implementation.
DTransactions simplify database code.
Lời giải
Khi thực hiện nhiều hoạt động trên cơ sở dữ liệu, việc sử dụng các giao dịch (transactions) được khuyến nghị rộng rãi vì lý do đảm bảo tính nguyên tử (atomicity). Điều này có nghĩa là nếu một trong các hoạt động không thành công, toàn bộ giao dịch sẽ bị hủy bỏ và không có thay đổi nào sẽ được lưu lại trong cơ sở dữ liệu. Điều này giúp duy trì tính toàn vẹn và ổn định của dữ liệu. Ngoài ra, giao dịch cũng giúp đảm bảo tính nhất quán (consistency) của dữ liệu, ngăn chặn các tình huống không mong muốn như dữ liệu bị trùng lặp hoặc không hợp lệ. Vì vậy, việc sử dụng giao dịch là một phần quan trọng trong việc quản lý cơ sở dữ liệu và đảm bảo tính tin cậy của ứng dụng.
Mở trang câu hỏi này →
AView
BModel
CController
DPresenter
Lời giải
Trong kiến trúc MVC, logic kinh doanh nên được xử lý ở đâu? Để trả lời câu hỏi này, chúng ta cần hiểu rõ chức năng của từng thành phần trong kiến trúc MVC. View (Trình bày) chịu trách nhiệm hiển thị dữ liệu, Model (Mô hình) chịu trách nhiệm lưu trữ và xử lý dữ liệu, Controller (Quản lý) chịu trách nhiệm điều hướng và xử lý logic kinh doanh, còn Presenter (Trình bày viên) là một thành phần bổ sung trong kiến trúc MVP (Model-View-Presenter), có chức năng tương tự như Controller trong kiến trúc MVC. Tuy nhiên, trong kiến trúc MVC, logic kinh doanh nên được xử lý ở Controller, vì Controller là thành phần chịu trách nhiệm điều hướng và xử lý logic kinh doanh. Vì vậy, phương pháp nên tránh khi xử lý logic kinh doanh trong kiến trúc MVC là View.
Mở trang câu hỏi này →