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

144/271 câuCòn 127
AActivity.onStop()
BActivity.onDestroy()
CActivity.onPause()
DActivity.onShutdown()
Lời giải
Để lưu dữ liệu chưa được lưu và giải phóng tài nguyên đang được sử dụng bởi một ứng dụng Android, chúng ta cần sử dụng phương thức phù hợp. Trong số các lựa chọn trên, Activity.onPause() là phương thức được sử dụng để tạm dừng hoạt động của ứng dụng, giúp lưu dữ liệu chưa được lưu và giải phóng tài nguyên. Phương thức này được gọi khi ứng dụng chuyển sang nền, giúp đảm bảo dữ liệu được lưu và ứng dụng được giải phóng tài nguyên để tránh lãng phí. Tuy nhiên, cần lưu ý rằng phương thức này không đảm bảo dữ liệu được lưu hoàn toàn, vì ứng dụng có thể bị hủy bỏ bất cứ lúc nào. Vì vậy, cần sử dụng phương thức này kết hợp với việc lưu dữ liệu vào bộ nhớ đệm hoặc cơ sở dữ liệu để đảm bảo dữ liệu được lưu an toàn.
Mở trang câu hỏi này →
AAndroid delivers an explicit intent to a target component without consulting filters in the AndroidManifest.xml file
BImplicit intents are typically used to interact with components residing in other apps
CExplicit intents are typically used to interact with components residing in other apps
DAndroid delivers an implicit intent to a target component only if it matches one of its intent filters in the AndroidManifest.xml file
Lời giải
Các câu hỏi sau đây nói về ý định ngầm định và ý định rõ ràng trong Android. Ý định rõ ràng là một cách thức để giao tiếp giữa các thành phần trong cùng một ứng dụng. Trong khi đó, ý định ngầm định được sử dụng để giao tiếp giữa các ứng dụng khác nhau. Ví dụ, khi bạn muốn mở một ứng dụng khác từ ứng dụng hiện tại, bạn sẽ sử dụng ý định ngầm định. Ý định ngầm định sẽ được gửi đến hệ thống Android, và hệ thống sẽ tìm kiếm các ứng dụng có thể đáp ứng yêu cầu đó. Nếu có ứng dụng nào đáp ứng được yêu cầu đó, hệ thống sẽ mở ứng dụng đó. Ngược lại, nếu không có ứng dụng nào đáp ứng được yêu cầu đó, hệ thống sẽ không thể mở ứng dụng đó. Ý định rõ ràng, ngược lại, sẽ được gửi trực tiếp đến ứng dụng mục tiêu mà không cần phải tìm kiếm các ứng dụng khác. Vì vậy, ý định rõ ràng thường được sử dụng để giao tiếp giữa các thành phần trong cùng một ứng dụng.
Mở trang câu hỏi này →
AGridLayoutManager
BRecyclingManager
CLinearLayoutManager
DCircularLayoutManager
Lời giải
RecyclerView trong Android là một công cụ mạnh mẽ để hiển thị danh sách dữ liệu. Để sắp xếp và trình bày dữ liệu trong RecyclerView, chúng ta cần sử dụng LayoutManager. Có hai LayoutManager được đề cập trong câu hỏi này: GridLayoutManager và LinearLayoutManager. GridLayoutManager cho phép sắp xếp dữ liệu theo dạng lưới, trong khi LinearLayoutManager cho phép sắp xếp dữ liệu theo dạng dọc hoặc ngang. CircularLayoutManager và RecyclingManager không phải là LayoutManager hợp lệ trong RecyclerView.
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
Thứ ba, để thông báo cho các hoạt động tự động khi dữ liệu thay đổi. Khi dữ liệu được cập nhật, content provider sẽ thông báo cho các hoạt động liên quan, giúp đảm bảo rằng ứng dụng của bạn luôn có dữ liệu mới nhất.
Mở trang câu hỏi này →
ARowsFragment()
BPreferenceFragment()
CDialogFragment()
DListFragment()
Lời giải
Fragment là một lớp cơ bản trong Android dùng để thêm một số tính năng vào ứng dụng. ListFragment là một lớp con của Fragment, nó được thiết kế để hiển thị một danh sách các mục theo chiều dọc và được quản lý bởi một adapter. Adapter là một lớp dùng để kết nối dữ liệu với giao diện người dùng. ListFragment thường được sử dụng để hiển thị danh sách các mục như danh sách sản phẩm, danh sách bài viết, v.v. Nó cung cấp một số phương thức để tùy chỉnh giao diện và hành vi của danh sách.
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 tại các giai đoạn khác nhau của vòng đời của một hoạt động hoặc fragment. Trong các lựa chọn trên, phương thức onCreate() được gọi khi hoạt động hoặc fragment được tạo mới. Phương thức onStart() được gọi khi hoạt động hoặc fragment được thêm vào màn hình và sẵn sàng để hiển thị. Phương thức onPause() được gọi khi hoạt động hoặc fragment không còn là hoạt động chính và sẽ bị tạm dừng. 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. Phương thức onDraw() được gọi để vẽ nội dung trên màn hình, còn phương thức onClick() được gọi khi một nút hoặc một phần tử khác được nhấn.
Mở trang câu hỏi này →
AContent Providers
BAll of the others
CActivities
DServices
Lời giải
Các thành phần của ứng dụng Android là những phần quan trọng giúp tạo nên một ứng dụng Android hoàn chỉnh. Trong số các lựa chọn trên, có ba thành phần chính của ứng dụng Android: Activities, Services và Content Providers. Activities là các màn hình giao diện người dùng của ứng dụng, nơi người dùng tương tác với ứng dụng. Services là các tiến trình chạy nền giúp thực hiện các tác vụ nền, không cần người dùng tương tác. Content Providers là các lớp dữ liệu giúp ứng dụng truy cập và sử dụng dữ liệu từ các nguồn khác nhau. Vì vậy, tất cả các lựa chọn trên đều là các thành phần của ứng dụng Android.
Mở trang câu hỏi này →
ABound Services have a user interface, while Started Services don't.
BBound Services can't run in the background, while Started Services can.
CBound Services can be bound to by multiple clients, while Started Services can't.
DStarted Services are always started with an explicit start command, while Bound Services are started implicitly.
Lời giải
Trong Android, Bound Service và Started Service (unbound) là hai loại dịch vụ khác nhau. Bound Service là một dịch vụ có thể được kết nối bởi nhiều ứng dụng khác nhau, trong khi Started Service chỉ có thể được khởi chạy bởi một ứng dụng duy nhất. Bound Service thường được sử dụng để thực hiện các tác vụ phức tạp, chẳng hạn như tải dữ liệu từ internet, trong khi Started Service thường được sử dụng để thực hiện các tác vụ đơn giản, chẳng hạn như gửi thông báo. Bound Service có thể được kết nối và giải phóng khi cần thiết, trong khi Started Service sẽ tiếp tục chạy cho đến khi nó bị hủy bỏ. Điều này giúp cho Bound Service tiết kiệm tài nguyên hệ thống và tăng hiệu suất.
Mở trang câu hỏi này →
A@Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return mDB.update(values, selection, selectionArgs); }
B@Override public void update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return mDB.update(values, selection, selectionArgs); }
C@Override public boolean update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return mDB.update(values, selection, selectionArgs); }
D@Override public long update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return mDB.update(values, selection, selectionArgs); }
Lời giải

Để thực hiện phương thức update() trong một Content Provider, bạn cần sử dụng phương thức update() của cơ sở dữ liệu. Phương thức update() này sẽ cập nhật các giá trị trong cơ sở dữ liệu dựa trên các điều kiện lọc được cung cấp. Trong phương thức update() của Content Provider, bạn cần sử dụng các tham số sau: uri (mô tả URI của bản ghi cần cập nhật), ContentValues (mô tả các giá trị cần cập nhật), selection (mô tả điều kiện lọc), và selectionArgs (mô tả các tham số của điều kiện lọc). Phương thức update() của Content Provider sẽ trả về số lượng bản ghi được cập nhật. Ví dụ, phương thức update() có thể được thực hiện như sau: @Override

Lời giải
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    return mDB.update(values, selection, selectionArgs);
}

Phương thức này sẽ cập nhật các giá trị trong cơ sở dữ liệu dựa trên các điều kiện lọc được cung cấp và trả về số lượng bản ghi được cập nhật.

Mở trang câu hỏi này →
ATo manage app preferences and settings
BTo fetches data that the app requests from a repository
CTo send notifications to users
DTo draw UI components on the screen
Lời giải
Một Content Provider trong Android là một lớp phần mềm giúp quản lý và cung cấp dữ liệu cho các ứng dụng khác. Mục đích chính của Content Provider là cung cấp dữ liệu cho các ứng dụng khác khi chúng yêu cầu. Điều này cho phép các ứng dụng khác nhau chia sẻ dữ liệu và sử dụng dữ liệu từ nhau mà không cần phải lưu trữ dữ liệu đó trong mỗi ứng dụng riêng biệt. Ví dụ, một ứng dụng có thể sử dụng Content Provider để truy cập dữ liệu liên hệ của người dùng từ ứng dụng khác. Content Provider cũng giúp bảo vệ dữ liệu bằng cách kiểm soát quyền truy cập vào dữ liệu và đảm bảo rằng dữ liệu được sử dụng một cách hợp pháp.
Mở trang câu hỏi này →
Apublic static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH);
Bpublic static final Uri CONTENT_URI = Uri.parse("http://" + AUTHORITY + "/" + CONTENT_PATH);
Cpublic static final Uri CONTENT_URI = Uri.parse("file://" + AUTHORITY + "/" + CONTENT_PATH);
Dpublic static final Uri CONTENT_URI = Uri.parse("data://" + AUTHORITY + "/" + CONTENT_PATH);
Lời giải

Trong lập trình Android, một Content URI (URI nội dung) là một địa chỉ duy nhất để truy cập vào dữ liệu trong cơ sở dữ liệu. Để định nghĩa một Content URI trong một lớp Contract, bạn cần sử dụng phương thức Uri.parse() và xây dựng một chuỗi URI theo định dạng 'content://authority/path'. Ví dụ, nếu bạn muốn truy cập vào dữ liệu ở đường dẫn '/example' trong cơ sở dữ liệu có tên là 'com.example.app', bạn có thể định nghĩa Content URI như sau:

Lời giải
public static final Uri CONTENT_URI = Uri.parse("content://com.example.app/example");

. Điều này cho phép các ứng dụng khác truy cập vào dữ liệu của bạn thông qua ContentResolver.

Mở trang câu hỏi này →
AIt sends data to the client.
BIt receives data from the client.
CIt listens for a connection to be made to the socket and accepts it.
DIt ses the connection with the client.
Lời giải
Khi thiết lập kết nối giữa một client và một server sử dụng socket, mục đích của phương thức accept() trong socket server-side là để lắng nghe khi một kết nối được tạo đến socket và chấp nhận nó. Phương thức accept() sẽ chờ đợi cho đến khi một client kết nối đến server và khi đó nó sẽ tạo ra một kết nối mới với client đó. Kết nối này sẽ được tạo ra thông qua một socket mới, được gọi là socket kết nối. Socket kết nối này sẽ được sử dụng để truyền dữ liệu giữa client và server. Phương thức accept() đóng vai trò quan trọng trong việc thiết lập và quản lý kết nối giữa client và server.
Mở trang câu hỏi này →
137What is a Socket in networking?4 lựa chọn
AA protocol for securing network communication
BAn endpoint for sending and receiving data across a network
CA type of network cable
DA device for connecting multiple Ethernet cables
Lời giải
Một Socket trong mạng lưới là một điểm kết nối (endpoint) quan trọng cho việc gửi và nhận dữ liệu (data) qua mạng lưới. Nó là một phần quan trọng của giao thức truyền thông mạng lưới (network communication protocol). Socket hoạt động như một cổng giao tiếp giữa các thiết bị mạng lưới, cho phép chúng gửi và nhận dữ liệu một cách an toàn và hiệu quả. Mỗi Socket có một địa chỉ duy nhất, giúp xác định vị trí của nó trên mạng lưới. Điều này cho phép các thiết bị mạng lưới khác liên lạc với Socket một cách chính xác và hiệu quả. Socket được sử dụng rộng rãi trong nhiều ứng dụng mạng lưới, bao gồm cả các ứng dụng web, ứng dụng di động và các ứng dụng khác.
Mở trang câu hỏi này →
AIt initiates a connection to another socket
BIt passively waits for a connection from a client
CIt sends data to a connected socket
DIt reads data from a connected socket
Lời giải
Trong socket programming, phương thức accept() đóng vai trò quan trọng trong việc xử lý kết nối từ khách hàng. Khi một socket được tạo thành một server, nó sẽ sử dụng phương thức accept() để chờ đợi một kết nối từ một client. Khi một client kết nối đến server, phương thức accept() sẽ được gọi để xác nhận và xử lý kết nối đó. Phương thức accept() sẽ trả về một đối tượng socket mới, đại diện cho kết nối giữa server và client. Đối tượng socket này có thể được sử dụng để gửi và nhận dữ liệu giữa server và client. Tóm lại, phương thức accept() giúp server passively chờ đợi và xử lý kết nối từ khách hàng.
Mở trang câu hỏi này →
APalette pane
BAttributes tab
CComponent Tree
DDesign and Text tabs
Lời giải
Trong Android Studio Layout Editor, có một số tab giúp bạn dễ dàng thiết kế và chỉnh sửa layout cho ứng dụng của mình. Để chuyển đổi giữa Design và Text view, bạn cần chọn tab phù hợp. Palette pane là nơi bạn có thể chọn các thành phần UI để thêm vào layout của mình. Attributes tab cho phép bạn chỉnh sửa các thuộc tính của các thành phần UI đã chọn. Component Tree là nơi bạn có thể xem cấu trúc của layout và chỉnh sửa các thành phần UI. Tuy nhiên, để chuyển đổi giữa Design và Text view, bạn cần chọn Design và Text tabs. Tab này cho phép bạn xem layout của mình dưới dạng thiết kế và dưới dạng mã nguồn. Điều này giúp bạn dễ dàng chỉnh sửa và tùy chỉnh layout của mình.
Mở trang câu hỏi này →
AfindViewById(R.id.textViewId).setText("Hello World");
BTextView.setText(R.id.textViewId, "Hello World");
CfindViewById(R.id.textViewId).text = "Hello World";
DsetTextView(R.id.textViewId, "Hello World");
Lời giải
Để thay đổi nội dung của một TextView có ID là textViewId bằng "Hello World" một cách lập trình, bạn cần sử dụng phương thức setText() trên đối tượng TextView đã được tìm thấy bằng findViewById(). Cụ thể, bạn cần thực hiện các bước sau: 1. Tìm kiếm đối tượng TextView có ID là textViewId bằng findViewById(R.id.textViewId). 2. Sử dụng phương thức setText() để đặt nội dung "Hello World" cho đối tượng TextView vừa tìm thấy. Ví dụ, bạn có thể sử dụng mã sau: findViewById(R.id.textViewId).setText("Hello World"); Lưu ý rằng các phương thức khác như TextView.setText(R.id.textViewId, "Hello World") hoặc findViewById(R.id.textViewId).text = "Hello World"; hoặc setTextView(R.id.textViewId, "Hello World") không phải là cách đúng đắn để thực hiện việc này trong lập trình Android.
Mở trang câu hỏi này →
AIntent intent = new Intent(this, PhotoActivity.class); startActivityForResult(intent, TEXT_REQUEST);
BIntent intent = new Intent(this, PhotoActivity.class); startActivityForResult(intent, REQUEST_CODE);
CIntent intent = new Intent(this, PhotoActivity.class); startActivityForResult(intent, PHOTO_REQUEST);
DIntent intent = new Intent(this, PhotoActivity.class); startActivityForResult(intent, TEXT_CODE);
Lời giải

Để tạo một phương thức trong một Activity để bắt đầu một Activity khác gọi là PhotoActivity và nhận lại kết quả sử dụng một Intent rõ ràng, chúng ta cần sử dụng phương thức startActivityForResult(). Phương thức này yêu cầu hai tham số: Intent và mã yêu cầu. Trong trường hợp này, chúng ta đã tạo một Intent mới để bắt đầu PhotoActivity và sử dụng mã yêu cầu PHOTO_REQUEST. Mã yêu cầu này được sử dụng để nhận lại kết quả từ PhotoActivity. Vì vậy, câu trả lời đúng là: Intent intent = new Intent(this, PhotoActivity.class); startActivityForResult(intent, PHOTO_REQUEST);

Mở trang câu hỏi này →
AsetOnTouchListener() allows handling detailed touch interactions like pressing, moving, or lifting a finger.
BsetOnTouchListener() is always more efficient than other listeners.
CsetOnTouchListener() is required for all touch-related events.
DsetOnTouchListener() is simpler to implement.
Lời giải
Khi chọn sử dụng setOnTouchListener() thay vì một loại nghe lẻ như setOnClickListener(), bạn có thể xử lý các tương tác chạm chi tiết như nhấn, di chuyển hoặc nhấc ngón tay. Điều này cho phép bạn có khả năng phản ứng linh hoạt hơn với các hành động của người dùng. Ví dụ, bạn có thể xác định xem người dùng đang nhấn, di chuyển hay nhấc ngón tay trên màn hình, từ đó có thể thực hiện các hành động phù hợp. Điều này đặc biệt hữu ích khi bạn cần tạo ra các ứng dụng có tính tương tác cao, chẳng hạn như trò chơi hoặc ứng dụng chỉnh sửa hình ảnh.
Mở trang câu hỏi này →
Đề bài
return? Button myButton = (Button) findViewById(R.id.my_button);
AView
BObject
CButton
DR.id
Lời giải
Khi tìm kiếm một thành phần UI trong Android bằng cách sử dụng findViewById(R.id.my_button), nó sẽ trả về một đối tượng thuộc lớp View. Lớp View là lớp cơ sở cho tất cả các thành phần UI trong Android, bao gồm cả Button, TextView, ImageView, v.v. Vì vậy, khi chúng ta tìm kiếm một Button bằng cách sử dụng findViewById(R.id.my_button), nó sẽ trả về một đối tượng thuộc lớp View, chứ không phải là Button hoặc Object. Điều này là vì Button là một lớp con của lớp View, và Object là lớp cơ sở của tất cả các lớp trong Java.
Mở trang câu hỏi này →
AaddFragment()
BcommitFragment()
CbeginTransaction()
DaddToBackStack()
Lời giải
Để thêm một phần tử động vào một hoạt động, bạn cần sử dụng phương thức transaction. Phương thức này cho phép bạn thêm, xóa hoặc thay đổi các phần tử trong hoạt động mà không cần phải khởi tạo lại toàn bộ hoạt động. Trong trường hợp này, phương thức transaction được sử dụng để thêm một phần tử động vào hoạt động.
Mở trang câu hỏi này →