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

224/271 câuCòn 47
AExplicit intents specify the exact activity to start, while implicit intents declare a general action to perform.
BExplicit intents are used for internal app communication, while implicit intents are used for external communication.
CExplicit intents require user interaction, while implicit intents do not.
DExplicit intents are faster than implicit intents
Lời giải
Trong Android, các ý định rõ ràng (explicit intents) và các ý định không rõ ràng (implicit intents) là hai loại ý định khác nhau. Các ý định rõ ràng là loại ý định mà bạn biết chính xác hoạt động nào sẽ được bắt đầu. Ví dụ, nếu bạn muốn mở ứng dụng điện thoại, bạn có thể sử dụng ý định rõ ràng để bắt đầu hoạt động của ứng dụng điện thoại. Ngược lại, các ý định không rõ ràng là loại ý định mà bạn chỉ khai báo một hành động chung mà bạn muốn thực hiện. Ví dụ, nếu bạn muốn chia sẻ một hình ảnh, bạn có thể sử dụng ý định không rõ ràng để bắt đầu hoạt động chia sẻ hình ảnh. Tóm lại, các ý định rõ ràng được sử dụng để bắt đầu một hoạt động cụ thể, trong khi các ý định không rõ ràng được sử dụng để thực hiện một hành động chung.
Mở trang câu hỏi này →
AonStart()
BonCreate()
ConResume()
DonActivityCreate()
Lời giải
Trong vòng đời của một Activity, phương thức đầu tiên được gọi là onCreate(). Phương thức này được gọi khi Activity được tạo mới và trước khi nó được hiển thị trên màn hình. Trong onCreate(), bạn có thể thực hiện các bước cần thiết để chuẩn bị cho Activity, chẳng hạn như tạo các thành phần giao diện người dùng, tải dữ liệu từ cơ sở dữ liệu, v.v. Phương thức này cũng là nơi bạn có thể gọi setContentView() để đặt layout cho Activity. Sau khi gọi onCreate(), Activity sẽ được hiển thị trên màn hình và các phương thức khác trong vòng đời sẽ được gọi theo thứ tự nhất định.
Mở trang câu hỏi này →
AStart an Activity
BStart a Service
CDeliver Broadcast
DAll of the above
Lời giải
Trong một ứng dụng Android, Intents có thể thực hiện các hành động sau. Đầu tiên, Intents có thể khởi động một Activity. Ví dụ, bạn có thể sử dụng Intent để chuyển sang một màn hình mới trong ứng dụng của mình. Thứ hai, Intents có thể khởi động một Service. Một Service là một phần của ứng dụng chạy trong nền, thực hiện các tác vụ như tải dữ liệu từ mạng hoặc cập nhật dữ liệu trên thiết bị. Cuối cùng, Intents có thể gửi Broadcast. Broadcast là một loại tin nhắn được gửi đến các ứng dụng khác trên thiết bị, cho phép chúng thực hiện các hành động cụ thể. Vì vậy, Intents có thể thực hiện tất cả các hành động trên.
Mở trang câu hỏi này →
ATo send broadcasts.
BTo receive and handle broadcasts.
CTo manage application lifecycle events.
DTo handle user input.
Lời giải
Một BroadcastReceiver là một lớp trong Android có vai trò quan trọng trong việc nhận và xử lý các tin nhắn (broadcasts) được gửi bởi hệ điều hành hoặc các ứng dụng khác. Mục đích chính của BroadcastReceiver là nhận và xử lý các tin nhắn này, chẳng hạn như khi một ứng dụng được cài đặt hoặc gỡ bỏ, khi một thiết bị kết nối hoặc rời khỏi mạng Wi-Fi, v.v. BroadcastReceiver có thể được sử dụng để thực hiện các hành động cụ thể khi nhận được tin nhắn, chẳng hạn như hiển thị thông báo, cập nhật dữ liệu, hoặc thực hiện các tác vụ khác. Trong tổng thể, mục đích của BroadcastReceiver là giúp các ứng dụng tương tác với hệ điều hành và các ứng dụng khác thông qua các tin nhắn.
Mở trang câu hỏi này →
209Which IDE is Android app development?4 lựa chọn
AEclipse
BAndroid Studio
CVisual Studio
DNetBeans
Lời giải
IDE (Integrated Development Environment) là một công cụ hỗ trợ lập trình viên tạo ra các ứng dụng di động Android. Để chọn đúng IDE cho Android app development, chúng ta cần xem xét các lựa chọn đã cho. Eclipse là một IDE phổ biến, nhưng nó không được thiết kế đặc biệt cho Android app development. Visual Studio là một IDE mạnh mẽ, nhưng nó chủ yếu được sử dụng cho Windows và web app. NetBeans là một IDE mở rộng, nhưng nó cũng không được thiết kế đặc biệt cho Android app development. Android Studio, do Google phát triển, được thiết kế đặc biệt cho Android app development và là lựa chọn hàng đầu cho lập trình viên muốn tạo ra các ứng dụng di động Android.
Mở trang câu hỏi này →
AActivity
BService
CBroadcast Receiver
DContent Provider
Lời giải
Để thực hiện một tác vụ chạy trong nền mà không chặn luồng chính, bạn nên sử dụng một trong những thành phần sau. Tuy nhiên, trong trường hợp này, thành phần phù hợp nhất là Service. Service cho phép bạn chạy một tác vụ trong nền mà không chặn luồng chính, giúp ứng dụng vẫn hoạt động trơn tru và không bị gián đoạn. Điều này đặc biệt quan trọng khi bạn cần thực hiện một tác vụ chạy trong thời gian dài mà không muốn ảnh hưởng đến trải nghiệm người dùng. Ngoài ra, Service cũng cho phép bạn thực hiện các tác vụ như cập nhật dữ liệu, gửi thông báo, v.v. mà không cần phải chặn luồng chính.
Mở trang câu hỏi này →
AServices
BBroadcast Receivers
CActivities
DContent Providers
Lời giải
Trong Android, có một số thành phần giúp tạo nên giao diện người dùng (UI) của ứng dụng. Tuy nhiên, thành phần nào cung cấp giao diện người dùng tập trung vào một nhiệm vụ cụ thể mà người dùng có thể thực hiện?
Mở trang câu hỏi này →
A1,2,3,4,5,6
B3,1,2,4,5,6
C1,2,3,4,5,6
D5,3,2,1,4,6
Lời giải
Quá trình phát triển ứng dụng có 6 giai đoạn chính. Đầu tiên, bạn cần tạo dự án trong Android Studio và chọn một template phù hợp (giao diện 5). Tiếp theo, bạn cần định nghĩa một layout cho mỗi màn hình có các thành phần UI (giao diện người dùng) (giao diện 3). Sau đó, bạn cần viết mã nguồn sử dụng ngôn ngữ lập trình Java (giao diện 2). Tiếp theo, bạn cần xây dựng và chạy ứng dụng trên các thiết bị thực tế và ảo (giao diện 1). Sau đó, bạn cần kiểm tra và sửa lỗi logic và giao diện của ứng dụng (giao diện 4). Cuối cùng, bạn cần xuất bản ứng dụng bằng cách tạo gói APK cuối cùng và phân phối nó thông qua các kênh như Google Play (giao diện 6).
Mở trang câu hỏi này →
ATo test the app on real devices only.
BTo simulate an Android device environment for testing and debugging.
CTo compile the app's code.
DTo deploy the app to a Google Play Store.
Lời giải
Một emulátor trong phát triển Android có mục đích chính là mô phỏng môi trường thiết bị Android để thử nghiệm và sửa lỗi. Điều này cho phép các nhà phát triển thử nghiệm và kiểm tra ứng dụng của họ trên nhiều loại thiết bị và phiên bản Android khác nhau mà không cần phải có nhiều thiết bị thực tế. Emulátor cũng giúp các nhà phát triển tìm ra và sửa lỗi sớm hơn, tiết kiệm thời gian và công sức. Ngoài ra, emulátor còn giúp các nhà phát triển thử nghiệm và kiểm tra ứng dụng của họ trên các phiên bản Android mới mà không cần phải chờ đợi thiết bị thực tế được cập nhật.
Mở trang câu hỏi này →
AFloating Context Menu
BContextual Action Mode
COptions Menu
DPopup Menu
Lời giải
Để cho phép người dùng chọn nhiều mục trong RecyclerView và thực hiện một hành động nhóm, bạn nên sử dụng Contextual Action Mode. Contextual Action Mode cho phép người dùng chọn nhiều mục và thực hiện một hành động nhóm bằng cách sử dụng một menu hành động. Điều này rất hữu ích khi bạn cần cho phép người dùng thực hiện một hành động nhóm trên nhiều mục trong RecyclerView. Ví dụ, bạn có thể cho phép người dùng chọn nhiều mục và sau đó xóa chúng cùng một lúc. Floating Context Menu và Popup Menu không phù hợp cho mục đích này vì chúng chỉ cho phép người dùng chọn một mục tại một thời điểm. Options Menu cũng không phù hợp vì nó chỉ cho phép người dùng chọn một hành động tại một thời điểm.
Mở trang câu hỏi này →
ABy reusing cell layouts
BBy eliminating the need for an adapter
CBy automatically sorting list items
DBy enabling swipe-to-delete functionality
Lời giải
RecyclerView giúp cải thiện hiệu suất so với ListView truyền thống bằng cách tái sử dụng layouts của ô (cell). Khi bạn di chuyển qua danh sách, ListView sẽ tạo mới một layout cho mỗi ô, dẫn đến lãng phí tài nguyên và giảm hiệu suất. Ngược lại, RecyclerView chỉ tạo mới layout cho ô khi nó được hiển thị trên màn hình. Khi ô bị loại khỏi màn hình, RecyclerView sẽ tái sử dụng layout đó cho ô mới. Điều này giúp giảm thiểu lãng phí tài nguyên và cải thiện hiệu suất. Ngoài ra, RecyclerView cũng cung cấp các tính năng như hỗ trợ các loại layout phức tạp và hỗ trợ các loại dữ liệu phức tạp.
Mở trang câu hỏi này →
ALinearLayoutManager
BGridLayoutManager
CStaggeredGridLayoutManager
DStackLayoutManager
Lời giải
Để một RecyclerView hiển thị các mục trong một định dạng lưới, bạn cần sử dụng một loại quản lý bố cục phù hợp. Trong các lựa chọn trên, GridLayoutManager và StaggeredGridLayoutManager đều có thể giúp bạn đạt được mục tiêu này. GridLayoutManager cho phép bạn tạo một lưới với các ô đều nhau, trong khi StaggeredGridLayoutManager cho phép bạn tạo một lưới với các ô có kích thước khác nhau. Cả hai loại quản lý bố cục này đều hỗ trợ tính linh hoạt và dễ dàng sử dụng, giúp bạn có thể tạo ra một giao diện người dùng hấp dẫn và chuyên nghiệp.
Mở trang câu hỏi này →
Aandroid.permission.INTERNET
Bandroid.permission.BLUETOOTH
Candroid.permission.CAMERA
Dandroid.permission.READ_CONTACTS
Lời giải
Để Google Maps hoạt động trên ứng dụng Android, bạn cần thêm các quyền sau vào file AndroidManifest.xml. Trước hết, bạn cần có quyền truy cập Internet để tải dữ liệu từ Google Maps. Quyền này được biểu diễn bởi android.permission.INTERNET. Ngoài ra, một số ứng dụng có thể yêu cầu quyền truy cập Bluetooth, camera hoặc danh bạ, nhưng đối với Google Maps, quyền Internet là đủ.
Mở trang câu hỏi này →
AACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION
BINTERNET and ACCESS_WIFI_STATE
CWRITE_EXTERNAL_STORAGE
DACCESS_NETWORK_STATE
Lời giải
Để truy cập vị trí điện thoại và sử dụng Google Maps, bạn cần có các quyền truy cập sau: ACCESS_COARSE_LOCATION hoặc ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION cho phép ứng dụng biết được vị trí của bạn với độ chính xác khoảng vài trăm mét, trong khi ACCESS_FINE_LOCATION cho phép ứng dụng biết được vị trí của bạn với độ chính xác cao hơn, thường là vài mét. Điều này giúp ứng dụng Google Maps có thể hiển thị chính xác vị trí của bạn trên bản đồ.
Mở trang câu hỏi này →
ASQLiteDatabase
BSQLiteOpenHelper
CCursor
DContentValues
Lời giải
Để chèn một bản ghi vào cơ sở dữ liệu SQLite, bạn cần sử dụng lớp nào để biên dịch câu lệnh SQL? Câu trả lời đúng là lớp SQLiteDatabase. Lớp này cho phép bạn thực hiện các phương thức CRUD (Create, Read, Update, Delete) trên cơ sở dữ liệu SQLite. Để chèn một bản ghi, bạn cần sử dụng phương thức insert() của lớp SQLiteDatabase. Phương thức này yêu cầu bạn cung cấp một đối tượng ContentValues để chứa dữ liệu của bản ghi. Đối tượng ContentValues là một lớp được sử dụng để lưu trữ các giá trị của một bản ghi trong cơ sở dữ liệu. Nó cho phép bạn thêm, sửa, xóa các giá trị của một bản ghi một cách dễ dàng. Vì vậy, để chèn một bản ghi vào cơ sở dữ liệu SQLite, bạn cần sử dụng lớp SQLiteDatabase và phương thức insert() của nó.
Mở trang câu hỏi này →
AInternal Storage
BExternal Storage
CShared Preferences
DRoom database
Lời giải
Trong Android, có nhiều phương pháp lưu trữ cặp giá trị khóa-giá trị (key-value pairs). Tuy nhiên, phương pháp được sử dụng phổ biến nhất là Shared Preferences. Shared Preferences cho phép lưu trữ dữ liệu nhỏ như chuỗi, số nguyên, boolean, v.v. trong một tệp tin XML. Phương pháp này được sử dụng rộng rãi trong các ứng dụng Android để lưu trữ thông tin người dùng, như cài đặt, trạng thái ứng dụng, v.v. Ngoài ra, Shared Preferences cũng cho phép lưu trữ dữ liệu trong bộ nhớ cache, giúp tăng tốc độ truy xuất dữ liệu. Tuy nhiên, phương pháp này cũng có một số hạn chế, chẳng hạn như giới hạn kích thước dữ liệu và không phù hợp với dữ liệu lớn.
Mở trang câu hỏi này →
AonCreate() and onDestroy()
BonStart() and onStop()
ConStart() and onResume()
DonCreate() and onUpgrade()
EonCreate() and onDestroy()
Lời giải
Khi tạo một lớp mở rộng SQLiteOpenHelper, chúng ta thường phải thực hiện các phương thức đặc biệt để quản lý cơ sở dữ liệu SQLite. Hai phương thức quan trọng mà chúng ta nên ghi đè (override) là onCreate() và onUpgrade(). Phương thức onCreate() được gọi khi ứng dụng đầu tiên truy cập cơ sở dữ liệu. Trong phương thức này, chúng ta có thể tạo bảng và tạo dữ liệu mẫu. Phương thức onUpgrade() được gọi khi phiên bản cơ sở dữ liệu được nâng cấp. Chúng ta có thể sử dụng phương thức này để cập nhật cấu trúc bảng và dữ liệu khi phiên bản cơ sở dữ liệu thay đổi. Bằng cách ghi đè các phương thức này, chúng ta có thể quản lý cơ sở dữ liệu SQLite một cách hiệu quả và linh hoạt.
Mở trang câu hỏi này →
AMVP allows for easier unit testing by decoupling the View and the Model through the Presenter
BMVP is officially recommended by Google
CMVP supports asynchronous data loading natively
DMVP is simpler and requires less code
Lời giải
MVP (Model-View-Presenter) có thể được ưa chuộng hơn so với MVC (Model-View-Controller) trong phát triển Android vì một số lý do. Trước hết, MVP cho phép đơn vị kiểm tra dễ dàng hơn bằng cách tách rời View và Model thông qua Presenter. Điều này giúp giảm thiểu sự phụ thuộc giữa các lớp và tăng cường tính linh hoạt trong việc thay đổi hoặc sửa đổi mã. Ngoài ra, MVP cũng hỗ trợ tải dữ liệu bất đồng bộ một cách tự nhiên, giúp ứng dụng trở nên mượt mà và hiệu quả hơn. Tuy nhiên, không phải tất cả các lý do đều đúng. MVP không phải là cách được Google khuyến nghị chính thức và nó không đơn giản hơn so với MVC. Vì vậy, đáp án đúng là: MVP cho phép đơn vị kiểm tra dễ dàng hơn bằng cách tách rời View và Model thông qua Presenter.
Mở trang câu hỏi này →
Đề bài
public class LoginController {
  private LoginView view;
  private LoginModel model;
  public LoginController(LoginView view, LoginModel model) {
    this.view = view;
    this.model = model;
  }
  public void performLogin(String username, String password) {
    if (model.isValidUser(username, password)) {
      view.showLoginSuccess();
    }
    else {
      view.showLoginError();
    }
  }
}
AThe Controller handles user input and updates the View based on the Model's data
BThe Controller directly updates the Model
CThe View handles the business logic
DThe Model updates the View directly
Lời giải
Trong kiến trúc MVC, lớp Controller đóng vai trò là trung gian giữa lớp View và lớp Model. Nó nhận dữ liệu từ lớp View, xử lý dữ liệu và sau đó cập nhật lớp View dựa trên dữ liệu từ lớp Model. Trong ví dụ này, lớp LoginController nhận dữ liệu từ lớp LoginView, gọi phương thức isValidUser() của lớp LoginModel để xác thực thông tin đăng nhập và sau đó cập nhật lớp LoginView dựa trên kết quả. Điều này cho thấy lớp Controller đang xử lý dữ liệu và cập nhật lớp View dựa trên dữ liệu từ lớp Model.
Mở trang câu hỏi này →
AViewModel
BActivity
CService
DBroadcastReceiver
Lời giải
Trong mô hình MVC (Model-View-Controller), Controller đóng vai trò là lớp trung gian giữa Model và View, chịu trách nhiệm xử lý các yêu cầu từ View và cập nhật Model. Trong Android, lớp tương tự như Controller là Activity. Activity là lớp chính của ứng dụng Android, chịu trách nhiệm quản lý vòng đời của ứng dụng, xử lý các sự kiện và cập nhật giao diện người dùng. Activity cũng có thể tương tác với các lớp khác như Service, BroadcastReceiver và ViewModel để thực hiện các tác vụ phức tạp hơn.
Mở trang câu hỏi này →