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

84/271 câuCòn 187
Anew Intent()
Bnew Intent(Context context, Class<?> class)
Cnew Intent(String action, Uri uri)
Dnew Intent(String action)
Lời giải
Để tạo một Intent mới có thể nhận biết rõ ràng, bạn cần sử dụng phương thức constructor phù hợp. Có bốn phương thức constructor khác nhau trong lớp Intent, mỗi phương thức đều có mục đích và cách sử dụng khác nhau. Phương thức constructor đầu tiên là new Intent(), nó được sử dụng để tạo một Intent mới mà không có thông tin cụ thể nào. Tuy nhiên, điều này không phải là một ý tưởng hay vì Intent mới tạo ra sẽ không thể nhận biết được. Phương thức constructor thứ hai là new Intent(Context context, Class<?> class), nó được sử dụng để tạo một Intent mới có thể nhận biết rõ ràng. Trong phương thức này, bạn cần cung cấp một đối tượng Context và một lớp Class. Đối tượng Context đại diện cho ứng dụng đang chạy, trong khi lớp Class đại diện cho hoạt động mà Intent muốn khởi chạy. Phương thức constructor thứ ba là new Intent(String action, Uri uri), nó được sử dụng để tạo một Intent mới có thể nhận biết rõ ràng. Trong phương thức này, bạn cần cung cấp một chuỗi hành động (action) và một URI (Uniform Resource Identifier). Chuỗi hành động đại diện cho hành động mà Intent muốn thực hiện, trong khi URI đại diện cho dữ liệu mà Intent muốn truy cập. Phương thức constructor thứ tư là new Intent(String action), nó được sử dụng để tạo một Intent mới có thể nhận biết rõ ràng. Trong phương thức này, bạn cần cung cấp một chuỗi hành động (action). Chuỗi hành động đại diện cho hành động mà Intent muốn thực hiện. Tóm lại, để tạo một Intent mới có thể nhận biết rõ ràng, bạn nên sử dụng phương thức constructor new Intent(Context context, Class<?> class). Phương thức này cung cấp thông tin đầy đủ về Intent, giúp nó có thể được nhận biết và xử lý một cách chính xác.
Mở trang câu hỏi này →
AThe onReceive() hook method in a receiver is called back in the UI thread
BAn app can send an intent to any receiver registered via registerReceiver or the AndroidManifest.xml file
CThe intent namespace is global
DsendBroadcast() allows any other app to receive broadcast intents
Lời giải
Khi sử dụng tính năng phát sóng (broadcast intents) trong Android, có một số lý do khiến cho vấn đề bảo mật trở nên nghiêm trọng. Thứ nhất, bất kỳ ứng dụng nào cũng có thể gửi một yêu cầu phát sóng đến bất kỳ ứng dụng nhận (receiver) nào đã được đăng ký qua phương thức registerReceiver hoặc qua tệp AndroidManifest.xml. Điều này cho phép các ứng dụng độc hại có thể gửi các yêu cầu phát sóng không mong muốn đến các ứng dụng khác, gây ra các vấn đề bảo mật. Thứ hai, không gian tên (namespace) của các yêu cầu phát sóng là toàn cầu, điều này có nghĩa là bất kỳ ứng dụng nào cũng có thể sử dụng các tên tương tự để gửi các yêu cầu phát sóng. Cuối cùng, phương thức sendBroadcast() cho phép bất kỳ ứng dụng nào nhận được các yêu cầu phát sóng, điều này có thể dẫn đến các vấn đề bảo mật nếu các ứng dụng không được kiểm soát chặt chẽ.
Mở trang câu hỏi này →
AA message that provides a screen within which users can interact in order to do something
BA component that runs in the background to perform long-running operations or access remote resources
CAn event handler that responds to system-side broadcast announcements
DA message that describes an action to perform or an event that has occurred
Lời giải
Trong Android, một ý định (intent) là một thông điệp mô tả một hành động cần thực hiện hoặc một sự kiện đã xảy ra. Ý định được sử dụng để giao tiếp giữa các thành phần trong ứng dụng hoặc giữa ứng dụng và hệ điều hành. Nó cung cấp thông tin về hành động cần thực hiện, chẳng hạn như mở một trang web, gửi một tin nhắn hoặc gọi một số điện thoại. Ý định cũng có thể được sử dụng để phản hồi các sự kiện hệ thống, chẳng hạn như khi một ứng dụng được khởi động hoặc khi một thiết bị được kết nối. Ý định được gửi giữa các thành phần thông qua một giao diện gọi là Context, và nó được xử lý bởi các thành phần có thể thực hiện hành động được mô tả trong ý định.
Mở trang câu hỏi này →
AComboBox
BList
CSpinner
DDropList
Lời giải
Trong Android, có một số loại control có thể được sử dụng để tạo ra một danh sách lựa chọn. Tuy nhiên, để tạo ra một dropdownlist, chúng ta cần sử dụng Spinner. Spinner là một loại control được thiết kế để hiển thị một danh sách các lựa chọn và cho phép người dùng chọn một lựa chọn từ danh sách đó. Nó được sử dụng rộng rãi trong các ứng dụng di động Android để tạo ra các menu và các danh sách lựa chọn.
Mở trang câu hỏi này →
Amanifest
Baction
Capplication
Dactivity
Lời giải

Trong AndroidManifest.xml, phần tử gốc được gọi là <manifest>. Đây là phần tử quan trọng nhất trong tệp này, nơi chứa thông tin về ứng dụng như tên, phiên bản, quyền và các thành phần khác. Phần tử <manifest> đóng vai trò như một vỏ bọc cho tất cả các phần tử khác trong tệp, bao gồm <application>, <activity>, <service>, <receiver> và <provider>. Nó cung cấp thông tin cơ bản về ứng dụng và giúp hệ thống quản lý các thành phần của ứng dụng.

Mở trang câu hỏi này →
Ashared preferences
Binternal storage
Cexternal storage
DSd card
Lời giải
Trong lập trình di động, việc lưu trữ dữ liệu là một phần quan trọng. Có nhiều cách lưu trữ dữ liệu khác nhau, bao gồm Shared Preferences, Internal Storage, External Storage và SD Card. Tuy nhiên, không phải tất cả các cách lưu trữ đều cần có sự cho phép của người dùng. Cụ thể, Shared Preferences và Internal Storage không cần có sự cho phép của người dùng để lưu trữ dữ liệu. Shared Preferences là một cơ sở dữ liệu nhỏ gọn được sử dụng để lưu trữ các giá trị nhỏ như chuỗi, số nguyên, v.v. Internal Storage là bộ nhớ trong của thiết bị di động, nơi mà ứng dụng có thể lưu trữ dữ liệu của mình mà không cần có sự cho phép của người dùng. Điều này giúp ứng dụng có thể lưu trữ dữ liệu một cách nhanh chóng và dễ dàng mà không cần phải hỏi ý kiến của người dùng.
Mở trang câu hỏi này →
ATo synchronize local data with remote data
BTo offer complex data to other apps
CTo notify activities automatically when data changes
DTo enable long-duration operations to execute in the background
Lời giải
Một content provider là một lớp trung gian giúp các ứng dụng chia sẻ dữ liệu với nhau. Sử dụng content provider có nhiều lý do. Thứ nhất, nó giúp đồng bộ hóa dữ liệu cục bộ với dữ liệu từ xa. Điều này cho phép các ứng dụng cập nhật dữ liệu của họ một cách tự động và đồng bộ. Thứ hai, content provider cung cấp dữ liệu phức tạp cho các ứng dụng khác. Điều này cho phép các ứng dụng khác truy cập và sử dụng dữ liệu mà không cần phải lưu trữ dữ liệu đó trong ứng dụng của họ. Thứ ba, content provider có thể tự động thông báo cho các hoạt động khi dữ liệu thay đổi. Điều này giúp các ứng dụng cập nhật dữ liệu của họ một cách tự động và không cần phải kiểm tra dữ liệu thường xuyên.
Mở trang câu hỏi này →
72How is R file generated?4 lựa chọn
AAutomatically
BManually
CEmulated
DRandomly
Lời giải
R file được tạo ra theo cách tự động. Khi bạn tạo một dự án mới trong RStudio, chương trình sẽ tự động tạo một file R có tên tương tự như tên dự án. File này thường có nội dung cơ bản như các lệnh nhập dữ liệu, tạo dữ liệu mẫu, và các lệnh cơ bản khác. Ngoài ra, khi bạn chạy các lệnh R trong môi trường RStudio, chương trình cũng sẽ tự động tạo các file R khác nhau để lưu trữ các kết quả và dữ liệu tạm thời. Vì vậy, R file thường được tạo ra một cách tự động và không cần phải tạo thủ công.
Mở trang câu hỏi này →
AsetMarker
BaddMarker
Csetpoint
DaddPoint
Lời giải

Để thêm một dấu hiệu (marker) vào bản đồ Google, chúng ta cần sử dụng phương pháp phù hợp. Trong các lựa chọn trên, phương pháp được sử dụng phổ biến nhất là "addMarker". Phương pháp này cho phép chúng ta thêm một dấu hiệu vào vị trí cụ thể trên bản đồ Google. Để sử dụng phương pháp này, chúng ta cần cung cấp thông tin về vị trí và nội dung của dấu hiệu. Ví dụ, chúng ta có thể sử dụng phương pháp "addMarker" như sau:

Lời giải
map.addMarker({
  lat: 10.823, lng: 106.629, title:

'Dấu hiệu', icon: 'red-dot' });. Phương pháp này rất hữu ích khi chúng ta cần thêm nhiều dấu hiệu vào bản đồ Google.

Mở trang câu hỏi này →
AImplement publishProgress(). Call publishProgress().
BImplement publishProgress(). Call onProgressUpdate().
CImplement onProgressUpdate(). Call publishProgress().
DImplement onProgressUpdate(). Call onProgressUpdate().
Lời giải
Để báo cáo tiến độ của công việc được thực hiện bởi một AsyncTask, bạn cần thực hiện một số bước cụ thể. Đầu tiên, bạn cần triển khai phương thức onProgressUpdate() trong lớp con của AsyncTask. Phương thức này sẽ được gọi khi tiến độ của công việc thay đổi. Sau đó, trong phương thức doInBackground() của AsyncTask, bạn cần gọi phương thức publishProgress() để báo cáo tiến độ. Phương thức publishProgress() sẽ gửi thông tin tiến độ đến phương thức onProgressUpdate() để cập nhật giao diện người dùng. Điều này cho phép bạn theo dõi tiến độ của công việc và cập nhật giao diện người dùng một cách chính xác.
Mở trang câu hỏi này →
AonCreate()
BonDraw()
ConClick()
DonStart()
EonPause()
Lời giải
Các phương thức trong vòng đời hoạt động và fragment là những phương thức được gọi khi một hoạt động hoặc fragment được tạo ra, bắt đầu, tạm dừng hoặc bị hủy. Trong các lựa chọn trên, onCreate() là phương thức được gọi khi một hoạt động hoặc fragment được tạo ra lần đầu tiên. onStart() là phương thức được gọi khi một hoạt động hoặc fragment bắt đầu chạy. onPause() là phương thức được gọi khi một hoạt động hoặc fragment tạm dừng chạy. Các phương thức khác như onDraw() và onClick() không phải là phương thức trong vòng đời hoạt động và fragment.
Mở trang câu hỏi này →
AURL
BInteger
CLong
DVoid
Lời giải
Trong trường hợp này, khi bạn định nghĩa một lớp AsyncTask như sau: private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> thì giá trị được truyền vào phương thức doInBackground() sẽ là Long. Điều này có nghĩa là phương thức doInBackground() sẽ trả về một giá trị kiểu Long. Tuy nhiên, bạn cần lưu ý rằng phương thức doInBackground() có thể trả về bất kỳ giá trị nào mà bạn muốn, không nhất thiết phải là Long. Trong trường hợp này, bạn đã định nghĩa rằng phương thức doInBackground() sẽ trả về một giá trị kiểu Long.
Mở trang câu hỏi này →
ALinearLayoutManager
BGridLayoutManager
CCircularLayoutManager
DStaggeredGridLayoutManager
Lời giải
Trong RecyclerView, các LayoutManager chịu trách nhiệm đo lường và sắp xếp vị trí của các item. Các LayoutManager phổ biến bao gồm LinearLayoutManager, GridLayoutManager và StaggeredGridLayoutManager. - LinearLayoutManager cho phép sắp xếp các item theo chiều dọc hoặc chiều ngang. - GridLayoutManager cho phép sắp xếp các item theo dạng lưới. - StaggeredGridLayoutManager cho phép sắp xếp các item theo dạng lưới với kích thước khác nhau. Vì vậy, các LayoutManager này đều có thể đo lường và sắp xếp vị trí của các item trong RecyclerView.
Mở trang câu hỏi này →
ADynamic
BOrdered
CStatic
DNormal
Lời giải
Các cơ chế phát sóng Android Intent là những cách mà ứng dụng có thể gửi thông điệp đến các ứng dụng khác. Có hai loại cơ chế phát sóng được nhắc đến trong câu hỏi. Trước hết, chúng ta có 'Ordered' (Được sắp xếp), đó là cơ chế phát sóng mà các ứng dụng nhận được thông điệp sẽ được xử lý theo thứ tự. Ví dụ, khi bạn gửi một thông điệp đến các ứng dụng khác để yêu cầu cập nhật dữ liệu, các ứng dụng sẽ được xử lý theo thứ tự và chỉ có ứng dụng đầu tiên được xử lý sẽ trả lời. Thứ hai, chúng ta có 'Normal' (Bình thường), đó là cơ chế phát sóng mà các ứng dụng nhận được thông điệp sẽ được xử lý đồng thời. Ví dụ, khi bạn gửi một thông điệp đến các ứng dụng khác để yêu cầu cập nhật dữ liệu, các ứng dụng sẽ được xử lý đồng thời và có thể trả lời cùng lúc. Cả hai cơ chế phát sóng này đều được sử dụng rộng rãi trong các ứng dụng Android.
Mở trang câu hỏi này →
AfinishActivity()
Bfinish()
Cdestroy()
Dstop()
Lời giải
Để đóng một hoạt động, bạn có thể sử dụng phương thức finish(). Phương thức này sẽ đóng hoạt động hiện tại và đưa người dùng trở về màn hình trước đó. Phương thức finish() thường được sử dụng khi bạn muốn đóng một hoạt động và không muốn lưu lại trạng thái của hoạt động đó. Ví dụ, nếu bạn có một hoạt động để nhập thông tin và người dùng đã nhập xong thông tin, bạn có thể sử dụng phương thức finish() để đóng hoạt động nhập thông tin và đưa người dùng trở về màn hình chính. Ngoài ra, bạn cũng có thể sử dụng phương thức finish() để đóng hoạt động và đưa người dùng trở về màn hình trước đó khi người dùng nhấn nút quay lại.
Mở trang câu hỏi này →
Apublic void callMethod()
Bpublic void callMethod(View view)
Cprivate void callMethod(View view)
Dpublic boolean callMethod(View view)
Lời giải
Để sử dụng thuộc tính android:onClick trong XML, bạn cần tạo một phương thức trong lớp Activity tương ứng. Phương thức này phải có tên trùng với tên phương thức được chỉ định trong thuộc tính android:onClick. Ngoài ra, phương thức này phải có một tham số của loại View, đại diện cho nút được nhấn.
Mở trang câu hỏi này →
AAn adapter can use multiple ViewHolder classes to hold headers and various types of data.
BYou can have exactly one view holder for data and one view holder for a header.
CA RecyclerView supports multiple types of headers, but the data has to be uniform.
DWhen adding a header, you subclass RecyclerView to insert the header at the correct position.
Lời giải
ViewHolder là một lớp quan trọng trong RecyclerView, giúp tăng hiệu suất và giảm thiểu việc tạo mới các View. Khi sử dụng ViewHolder, chúng ta có thể sử dụng nhiều lớp ViewHolder khác nhau để giữ các tiêu đề và các loại dữ liệu khác nhau. Điều này cho phép chúng ta linh hoạt hơn trong việc thiết kế và xây dựng giao diện người dùng của mình. Ví dụ, chúng ta có thể sử dụng một lớp ViewHolder để giữ các tiêu đề, và một lớp khác để giữ các loại dữ liệu khác nhau. Điều này giúp giảm thiểu việc tạo mới các View và tăng hiệu suất của ứng dụng.
Mở trang câu hỏi này →
Afinish()
BendActivity()
CdestroyActivity()
Lời giải
Khi nhấn nút Back mềm trên thiết bị Android, phương thức được gọi đầu tiên là finish(). Phương thức này được sử dụng để hủy hoạt động hiện tại và quay lại màn hình trước đó trong ứng dụng. Tuy nhiên, nó không hủy hoàn toàn hoạt động, mà chỉ hủy hoạt động hiện tại và giữ lại trạng thái của hoạt động trước đó. Điều này giúp ứng dụng có thể quay lại hoạt động trước đó khi cần thiết. Phương thức finish() thường được sử dụng trong các trường hợp như hủy hoạt động khi người dùng nhấn nút Back, hoặc khi người dùng muốn quay lại màn hình trước đó trong ứng dụng.
Mở trang câu hỏi này →
AonPause()
BonVisible()
ConDestroy()
DonStart()
Lời giải
Lifecycle của một hoạt động (activity) trong Android bao gồm các phương thức khác nhau được gọi tại các giai đoạn khác nhau của hoạt động. Để làm cho một hoạt động trở nên nhìn thấy (visible), cần gọi phương thức nào?
Mở trang câu hỏi này →
AStart other Android components
BShow a dialog
CRegister other receivers
DPop up toast messages
EAll of the others
Lời giải
Trong phương thức onReceive() của lớp Receiver, có thể thực hiện các hành động sau: - Bắt đầu các thành phần Android khác như Service, Activity, IntentService... - Hiển thị thông báo Toast - Đăng ký các Receiver khác - Thực hiện các hành động khác như gửi tin nhắn, cập nhật dữ liệu... Tuy nhiên, không thể hiển thị dialog trong phương thức này vì nó không được chạy trên luồng chính của ứng dụng. Mục đích của phương thức onReceive() là xử lý các sự kiện nhanh chóng và không tốn thời gian, vì vậy các hành động cần được thực hiện một cách nhanh chóng và hiệu quả.
Mở trang câu hỏi này →