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

164/271 câuCòn 107
ADynamically added Fragments do not affect the Activity's lifecycle; thus, developers need not consider the Activity state when adding or removing Fragments.
BFragments added dynamically must be managed carefully during the Activity's lifecycle events, such as configuration changes, to prevent memory leaks or crashes due to lost context.
CDynamically adding Fragments to an Activity is discouraged as it complicates the Activity's lifecycle and makes the app more prone to errors.
DThe FragmentManager handles all complications arising from the Activity's lifecycle changes, so developers do not need to manually manage Fragments added dynamically.
Lời giải
Khi thêm Fragment vào Activity theo cách động, các nhà phát triển cần phải xem xét kỹ lưỡng về vòng đời của Activity để tránh các lỗi tiềm ẩn. Các Fragment được thêm vào động phải được quản lý cẩn thận trong các sự kiện vòng đời của Activity, chẳng hạn như thay đổi cấu hình, để ngăn chặn các lỗi do mất mát ngữ cảnh hoặc rò rỉ bộ nhớ. Điều này đặc biệt quan trọng khi Fragment được thêm vào hoặc loại bỏ trong quá trình hoạt động của Activity. Nếu không quản lý đúng cách, các Fragment có thể bị mất ngữ cảnh hoặc bị loại bỏ không đúng cách, dẫn đến các lỗi nghiêm trọng như rò rỉ bộ nhớ hoặc thậm chí là sự cố ứng dụng.
Mở trang câu hỏi này →
AonCreateView()
BonAttach()
ConPause()
DonDetach()
Lời giải
Khi thực hiện các nhiệm vụ chạy trong thời gian dài trong một phần tử (fragment), chúng ta cần tránh sử dụng phương thức nào? Câu trả lời đúng là "onCreateView()". Phương thức này được gọi khi phần tử được tạo và có thể gây ra các vấn đề về hiệu suất nếu thực hiện các nhiệm vụ chạy trong thời gian dài. Các phương thức khác như "onAttach()", "onPause()" và "onDetach()" không nên tránh sử dụng trong trường hợp này vì chúng không liên quan trực tiếp đến việc tạo phần tử. Tuy nhiên, cần lưu ý rằng "onPause()" thường được sử dụng để tạm dừng các hoạt động khi phần tử không còn hoạt động, nhưng nó không phải là phương thức chính để tránh sử dụng trong trường hợp này.
Mở trang câu hỏi này →
Aandroid.permission.INTERNET
Bandroid.permission.CAMERA
Candroid.permission.SEND_SMS
Dandroid.permission.ACCESS_FINE_LOCATION
Lời giải
Trong Android, các ứng dụng cần được cấp quyền truy cập vào các tính năng hệ thống để hoạt động bình thường. Một số quyền truy cập được coi là bình thường và được cấp cho các ứng dụng mà không cần sự cho phép của người dùng. Ví dụ, quyền truy cập Internet là một quyền bình thường vì hầu hết các ứng dụng đều cần kết nối Internet để tải dữ liệu hoặc gửi yêu cầu. Ngược lại, quyền truy cập camera, gửi tin nhắn SMS và truy cập vị trí chính xác không phải là bình thường và cần được người dùng cho phép trước khi được cấp quyền.
Mở trang câu hỏi này →
AshouldShowRequestPermissionRationale()
BisPermissionGranted()
CPermissionDenied()
DisPermissionGrantedByUser()
Lời giải
Để kiểm tra xem người dùng đã từ chối yêu cầu cấp quyền trước đó hay chưa, bạn cần gọi đến phương thức shouldShowRequestPermissionRationale() của lớp ActivityCompat. Phương thức này sẽ trả về kết quả là true nếu người dùng đã từ chối yêu cầu cấp quyền trước đó, và false nếu yêu cầu cấp quyền chưa được thực hiện. Điều này giúp bạn có thể đưa ra quyết định về cách tiếp cận khi yêu cầu cấp quyền. Ví dụ, nếu người dùng đã từ chối yêu cầu cấp quyền trước đó, bạn có thể hiển thị thông báo giải thích tại sao bạn cần quyền đó, hoặc đưa ra lựa chọn khác để người dùng có thể cấp quyền.
Mở trang câu hỏi này →
ATo allow the app to access the device's camera.
BTo enable the app to make network calls.
CTo permit the app to read user contacts.
DTo allow the app to access the device's location.
Lời giải
Mục đích của việc thêm android.permission.INTERNET vào file AndroidManifest.xml là để cho phép ứng dụng của bạn truy cập internet và thực hiện các yêu cầu mạng. Điều này cho phép ứng dụng của bạn gửi yêu cầu đến các dịch vụ mạng, tải dữ liệu từ internet và thực hiện các hoạt động mạng khác. Nếu bạn không thêm quyền truy cập internet vào file AndroidManifest.xml, ứng dụng của bạn sẽ không thể thực hiện các yêu cầu mạng và sẽ không thể hoạt động đúng cách. Vì vậy, việc thêm android.permission.INTERNET vào file AndroidManifest.xml là rất quan trọng để đảm bảo ứng dụng của bạn có thể truy cập internet và thực hiện các yêu cầu mạng một cách hiệu quả.
Mở trang câu hỏi này →
AThread
BAsyncTask
CHandler
DExecutorService
Lời giải
Để trả kết quả lại cho luồng giao diện (UI thread), chúng ta cần sử dụng một phương thức phù hợp. Trong các lựa chọn, Handler là phương thức được sử dụng rộng rãi và hiệu quả. Handler cho phép chúng ta gửi tin nhắn (message) từ một luồng (thread) khác đến luồng giao diện, giúp cập nhật giao diện một cách an toàn và hiệu quả. Điều này đặc biệt quan trọng khi chúng ta cần cập nhật giao diện trong một ứng dụng đa luồng (multi-threaded).
Mở trang câu hỏi này →
ATo perform long-running operations in the background
BTo publish progress updates to the UI thread
CTo initialize the task before execution
DTo handle the results of the background computation
Lời giải
Mục đích của phương thức onProgressUpdate() trong AsyncTask là để xuất bản các bản cập nhật tiến trình lên luồng UI. Phương thức này cho phép bạn cập nhật giao diện người dùng trong khi quá trình chạy nền đang thực hiện. Điều này đặc biệt hữu ích khi bạn cần thông báo cho người dùng về tiến trình của một tác vụ phức tạp, chẳng hạn như tải tập tin hoặc tải dữ liệu từ mạng. Phương thức onProgressUpdate() nhận một tham số, đó là một mảng các giá trị mà bạn muốn xuất bản. Bạn có thể sử dụng phương thức publishProgress() để xuất bản các giá trị này. Phương thức onProgressUpdate() sẽ được gọi trên luồng UI, vì vậy bạn có thể sử dụng nó để cập nhật giao diện người dùng mà không cần phải xử lý các vấn đề về luồng.
Mở trang câu hỏi này →
AonStart()
BonResume()
ConCreate()
DonDestroy()
Lời giải
Khi một Service được tạo lần đầu tiên thông qua startService() hoặc bindService(), phương thức được gọi là onCreate(). Phương thức này được gọi khi Service được tạo mới và trước khi Service bắt đầu hoạt động. Trong phương thức này, bạn có thể thực hiện các bước cần thiết để chuẩn bị cho Service hoạt động, chẳng hạn như khởi tạo các biến, tải dữ liệu từ cơ sở dữ liệu, v.v. Phương thức onCreate() cũng được gọi khi Service bị khởi động lại sau khi bị dừng.
Mở trang câu hỏi này →
ASTART_STICKY
BSTART_NOT_STICKY
CSTART_REDELIVER_INTENT
DSTART_RETAIN_INTENT
Lời giải
Khi một Service bị hệ thống giết, phương thức onStartCommand() sẽ được gọi lại để khởi động lại Service. Tuy nhiên, nếu muốn Service được khởi động lại mà không giữ nguyên Intent ban đầu, thì phương thức onStartCommand() cần trả về giá trị nào?
Mở trang câu hỏi này →
AonPause() and onStop()
BonResume() and onStart()
ConDestroy() and onCreate()
DonRestart() and onVisible()
Lời giải
Khi một hoạt động (activity) không còn được hiển thị trên màn hình, các phương thức callback sau sẽ được gọi. Trước hết, hoạt động sẽ được tạm dừng, phương thức onPause() sẽ được gọi. Sau đó, hoạt động sẽ không còn được hiển thị và phương thức onStop() sẽ được gọi. Điều này cho phép hệ thống tiết kiệm tài nguyên và giảm thiểu việc sử dụng bộ nhớ. Các phương thức khác như onResume() và onStart() sẽ được gọi khi hoạt động được hiển thị trở lại, còn onDestroy() và onCreate() sẽ được gọi khi hoạt động bị hủy và tạo mới lần lượt.
Mở trang câu hỏi này →
ABy accessing the Intent object directly.
BBy using the getIntent() method to get the Intent object and then extracting the data using methods like getStringExtra(), getIntExtra(),...
CBy reading a file.
DBy using Shared Preferences.
Lời giải
Để lấy dữ liệu được gửi qua Intent trong Activity nhận, bạn có thể sử dụng phương thức getIntent() để lấy đối tượng Intent và sau đó trích xuất dữ liệu bằng các phương thức như getStringExtra(), getIntExtra(),... Ví dụ, nếu bạn muốn lấy dữ liệu được gửi qua Intent dưới dạng chuỗi, bạn có thể sử dụng getStringExtra() như sau: String data = getIntent().getStringExtra("key"); Trong đó "key" là tên khóa được sử dụng để gửi dữ liệu. Phương thức này cho phép bạn lấy dữ liệu được gửi qua Intent một cách dễ dàng và hiệu quả.
Mở trang câu hỏi này →
156The types of intents in android is\are:4 lựa chọn
AExplicit intents and Implicit intents
BForeground Intents and Background Intents
CStart intents and Do Intents
DAll of the others
Lời giải
Trong Android, có hai loại ý định (intent) chính: ý định rõ ràng (Explicit intent) và ý định không rõ ràng (Implicit intent). Ý định rõ ràng là khi chúng ta biết rõ ứng dụng nào sẽ xử lý ý định đó. Ví dụ, khi chúng ta sử dụng Intent để mở ứng dụng điện thoại, chúng ta biết rõ ứng dụng điện thoại sẽ được mở. Ngược lại, ý định không rõ ràng là khi chúng ta không biết rõ ứng dụng nào sẽ xử lý ý định đó. Ví dụ, khi chúng ta sử dụng Intent để mở một ứng dụng nào đó, nhưng chúng ta không biết rõ ứng dụng đó là gì. Trong trường hợp này, hệ điều hành sẽ tự động tìm kiếm ứng dụng nào có thể xử lý ý định đó và mở ứng dụng đó.
Mở trang câu hỏi này →
AToast.makeText(context, "Message", Toast.LENGTH_SHORT).show();
BToast.show(context, "Message", Toast.LENGTH_SHORT).makeText();
CToast.display(context, "Message", Toast.LENGTH_SHORT).show();
DToast.message(context, "Message", Toast.LENGTH_SHORT).show();
Lời giải
Để hiển thị một thông báo ngắn cho người dùng trong một hoạt động Android, chúng ta sử dụng phương thức Toast.makeText(). Phương thức này yêu cầu ba tham số: ngữ cảnh (context), thông báo (message) và thời gian hiển thị (duration). Trong trường hợp này, chúng ta sử dụng Toast.LENGTH_SHORT để hiển thị thông báo trong một khoảng thời gian ngắn. Phương thức Toast.makeText() được sử dụng rộng rãi trong lập trình Android để hiển thị thông báo cho người dùng.
Mở trang câu hỏi này →
AAppCompatActivity
BFragmentActivity
CActivityCompat
DServiceCompat
Lời giải
Một hoạt động trong Android thường được mở rộng từ lớp AppCompatActivity. AppCompatActivity là một lớp cơ sở được thiết kế để hỗ trợ các hoạt động phức tạp hơn, bao gồm cả các hoạt động có giao diện người dùng được thiết kế theo kiểu Material Design. Nó cung cấp các tính năng như hỗ trợ các widget được thiết kế theo kiểu Material Design, hỗ trợ các hoạt động có menu, hỗ trợ các hoạt động có fragment, v.v. AppCompatActivity cũng cung cấp các phương thức để tương tác với các hoạt động khác, chẳng hạn như gọi các hoạt động khác, nhận dữ liệu từ các hoạt động khác, v.v. Vì vậy, khi tạo một hoạt động mới, bạn thường sẽ mở rộng từ AppCompatActivity để có thể tận dụng các tính năng và phương thức được cung cấp bởi lớp này.
Mở trang câu hỏi này →
AToast Notification
BStatus Bar Notification
CDialog Notification
DPopup Notification
Lời giải
Trong các loại thông báo trên Android, Popup Notification không phải là một loại thông báo chính thức. Toast Notification là một loại thông báo ngắn gọn, thường được sử dụng để thông báo cho người dùng về một sự kiện nhỏ. Status Bar Notification là loại thông báo được hiển thị trong thanh trạng thái của thiết bị. Dialog Notification là loại thông báo được hiển thị như một hộp thoại, cho phép người dùng tương tác với thông báo. Popup Notification, mặc dù có tên tương tự, nhưng không phải là một loại thông báo được hỗ trợ bởi Android. Thay vào đó, nó thường được sử dụng để mô tả các loại thông báo khác như Dialog Notification.
Mở trang câu hỏi này →
AUse NotificationManager.createChannel()
BUse NotificationChannel constructor and NotificationManager.createNotificationChannel()
CUse NotificationCompat.Builder
DUse NotificationManager.createNotification()
Lời giải
Để tạo một kênh thông báo trong Android 8.0 (API level 26) hoặc cao hơn, bạn cần sử dụng NotificationChannel và NotificationManager.createNotificationChannel(). Đầu tiên, bạn cần tạo một đối tượng NotificationChannel bằng cách sử dụng NotificationChannel constructor. Sau đó, bạn cần tạo một đối tượng NotificationManager và gọi phương thức createNotificationChannel() để tạo kênh thông báo. Bạn cũng cần cung cấp các thông tin như ID kênh, tên kênh, mô tả kênh và mức độ ưu tiên kênh. Sau khi tạo kênh thông báo, bạn có thể sử dụng kênh này để tạo thông báo.
Mở trang câu hỏi này →
161What is a Notification Channel?4 lựa chọn
AA way to group notifications by type
BA method to send data between activities
CA UI element to display messages
DA channel to communicate with external devices
Lời giải
Một kênh thông báo (Notification Channel) là một cách thức để nhóm và quản lý các thông báo trên thiết bị di động. Nó cho phép người dùng chọn cách thức nhận thông báo từ ứng dụng, chẳng hạn như thông báo âm thanh, thông báo trên màn hình khóa, hoặc thông báo trên thanh thông báo. Kênh thông báo giúp người dùng có thể kiểm soát và tùy chỉnh cách thức nhận thông báo từ ứng dụng, từ đó giúp người dùng có trải nghiệm tốt hơn khi sử dụng ứng dụng.
Mở trang câu hỏi này →
AA component that handles user interactions
BA component that listens for system or custom broadcasts
CA service that performs background tasks
DA layout manager for RecyclerView
Lời giải
Một Broadcast Receiver trong Android là một thành phần quan trọng giúp ứng dụng của bạn lắng nghe các tin nhắn hệ thống hoặc tùy chỉnh. Nó cho phép ứng dụng của bạn phản ứng với các sự kiện như khi người dùng bật hoặc tắt điện thoại, khi có tin nhắn mới, hoặc khi ứng dụng khác gửi một tin nhắn hệ thống. Broadcast Receiver có thể được sử dụng để thực hiện các tác vụ như gửi thông báo, cập nhật dữ liệu, hoặc thực hiện các hành động khác khi ứng dụng của bạn không đang hoạt động. Để sử dụng Broadcast Receiver, bạn cần tạo một lớp mới extends BroadcastReceiver và override phương thức onReceive() để xử lý tin nhắn nhận được.
Mở trang câu hỏi này →
AsendBroadcast(Intent)
BsendOrderedBroadcast(Intent, String)
CsendStickyBroadcast(Intent)
DsendBroadcastAsUser(Intent, UserHandle)
Lời giải
Để gửi một tin nhắn có thứ tự (ordered broadcast), cho phép bạn kiểm soát thứ tự trong đó các Broadcast Receiver nhận được tin nhắn, bạn cần sử dụng phương thức sendOrderedBroadcast(Intent, String). Phương thức này cho phép bạn chỉ định một chuỗi (String) để xác định thứ tự nhận tin nhắn. Điều này khác với phương thức sendBroadcast(Intent), nơi mà các Broadcast Receiver nhận tin nhắn không theo thứ tự. Ngoài ra, sendStickyBroadcast(Intent) và sendBroadcastAsUser(Intent, UserHandle) không đáp ứng yêu cầu này.
Mở trang câu hỏi này →
AStatic registration in the manifest
BDynamic registration in code
CUsing sendBroadcast()
DUsing sendStickyBroadcast()
Lời giải
Để có thể xử lý các loại phát sóng khác nhau một cách linh hoạt nhất, chúng ta cần sử dụng phương pháp đăng ký phát sóng trong mã nguồn. Phương pháp này cho phép chúng ta đăng ký phát sóng trong thời gian chạy, giúp chúng ta có thể dễ dàng thêm hoặc xóa các loại phát sóng mà không cần phải thay đổi mã nguồn. Điều này giúp tăng cường tính linh hoạt và dễ dàng bảo trì hệ thống. Ngoài ra, phương pháp này cũng cho phép chúng ta có thể kiểm soát và quản lý các loại phát sóng một cách hiệu quả hơn.
Mở trang câu hỏi này →