Ngân hàng câu hỏi của chương

Câu hỏi: PRM392 - Chương 5: Service, luồng và xử lý bất đồng bộ

26 câu trắc nghiệm kèm lời giải của môn Mobile Programming - Lập trình di động, xếp theo thứ tự nhập vào ngân hàng.

Danh sách câu hỏi

20/26 câuCòn 6
AWindow Manager Service
BTelephony Manager Service
CDownload Manager Service
DActivity Manager Service
Lời giải
Dịch vụ hệ thống Android nào tham gia vào việc định tuyến các ý định đến các trình nhận phát sóng?
Mở trang câu hỏi này →
AActivity
BService
CBroadcastReceiver
DIntent
Lời giải
Trong hệ điều hành Android, có ba loại thành phần chính: Activity, Service và BroadcastReceiver. BroadcastReceiver là thành phần chịu trách nhiệm nhận và xử lý các tin nhắn từ hệ điều hành hoặc các ứng dụng khác. Khi một ứng dụng muốn gửi một tin nhắn đến BroadcastReceiver, nó sẽ sử dụng Intent, một loại đối tượng được sử dụng để truyền dữ liệu giữa các thành phần trong hệ điều hành. BroadcastReceiver có thể được sử dụng để thực hiện các tác vụ như nhận 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 nhận được tin nhắn từ hệ điều hành hoặc ứng dụng khác.
Mở trang câu hỏi này →
AActivities
BServices
CBroadcast Receivers
DContent Providers
Lời giải
Component xử lý nền (background processing) liên quan đến một ứng dụng thường được thực hiện bởi các Service. Các Service có thể chạy trong nền mà không cần người dùng tương tác với ứng dụng. Điều này cho phép các ứng dụng thực hiện các tác vụ như cập nhật dữ liệu, gửi thông báo, hoặc thực hiện các tác vụ khác mà không làm gián đoạn người dùng. Các Service cũng có thể được sử dụng để thực hiện các tác vụ lặp đi lặp lại mà không cần người dùng tương tác.
Mở trang câu hỏi này →
AA WebClient facade class for simple download/upload operations via HTTP or FTP
BWebRequest and WebResponse classes for high-level control over client-side TCP or UDP operations
CHttpServer for consuming HTTP web APIs and RESTful services
DAll of the others
Lời giải
Các thành phần chính của System.Net.* Namespaces là các lớp giúp thực hiện các hoạt động mạng như tải/xuất dữ liệu qua HTTP hoặc FTP. Lớp WebClient cung cấp một giao diện đơn giản để thực hiện các hoạt động tải/xuất dữ liệu qua HTTP hoặc FTP. Các lớp WebRequest và WebResponse cung cấp một mức độ kiểm soát cao hơn về các hoạt động mạng, bao gồm cả việc kiểm soát các hoạt động TCP hoặc UDP. Lớp HttpServer giúp tiêu thụ các API web HTTP và dịch vụ RESTful. Do đó, tất cả các lựa chọn trên đều là đúng.
Mở trang câu hỏi này →
Aservices
Bsimulator
CEmulator
DIntent
Lời giải
Các lựa chọn sau không có thành phần UI và chạy như một quy trình nền. Các quy trình nền thường được sử dụng để thực hiện các tác vụ không cần người dùng tương tác. Trong hệ điều hành Android, các dịch vụ (services) là một loại quy trình nền. Chúng có thể chạy trong nền mà không cần người dùng tương tác. Ví dụ, một dịch vụ có thể được sử dụng để cập nhật dữ liệu trên máy chủ hoặc gửi thông báo đến người dùng. Một máy mô phỏng (simulator) cũng không có thành phần UI và chạy như một quy trình nền. Nó được sử dụng để mô phỏng thiết bị di động và chạy ứng dụng trên đó. Một máy emulatơ (emulator) cũng không có thành phần UI và chạy như một quy trình nền. Nó được sử dụng để emulat hóa thiết bị di động và chạy ứng dụng trên đó. Tuy nhiên, Intent là một loại thông điệp được sử dụng để giao tiếp giữa các ứng dụng và các thành phần khác trong hệ điều hành Android. Nó không phải là một quy trình nền và không có thành phần UI.
Mở trang câu hỏi này →
AA thread is the smallest unit of execution for sequences of programmed instructions
BA Java thread must be given code to run when it is started
CStarting a thread takes a trivial amount of time and system resources
DStarting a Java thread is the only way to write a concurrent Android app
Lời giải
Các câu hỏi sau đây là đúng về Java threads: A. Một luồng (thread) là đơn vị thực thi nhỏ nhất cho một chuỗi các lệnh lập trình. Điều này đúng vì một luồng có thể thực thi một phần của chương trình độc lập với các luồng khác. B. Một luồng Java phải được cung cấp mã để chạy khi nó được bắt đầu. Điều này đúng vì mỗi luồng cần có một phần mã để thực thi khi nó được tạo ra. C. Bắt đầu một luồng mất một lượng thời gian và tài nguyên hệ thống rất nhỏ. Điều này không đúng vì bắt đầu một luồng có thể mất một lượng thời gian và tài nguyên hệ thống đáng kể, tùy thuộc vào loại luồng và hệ thống. D. Bắt đầu một luồng Java là cách duy nhất để viết một ứng dụng Android đồng thời. Điều này không đúng vì có nhiều cách để viết một ứng dụng Android đồng thời, chẳng hạn như sử dụng các thư viện đồng thời như Executor hoặc Reactor.
Mở trang câu hỏi này →
AbindService
BstartService
CrunService
DlaunchSerview
Lời giải
Để bắt đầu một Service từ ứng dụng Android của bạn, bạn có thể sử dụng các hàm gọi sau. Service là một thành phần quan trọng trong Android, cho phép chạy các tác vụ nền mà không cần phải có sự tương tác trực tiếp với người dùng. Có hai phương thức chính để bắt đầu một Service: - startService: Phương thức này cho phép Service chạy trong nền và không cần phải có sự tương tác với ứng dụng. Khi Service được bắt đầu bằng phương thức này, nó sẽ tiếp tục chạy cho đến khi ứng dụng hoặc Service được dừng lại. - bindService: Phương thức này cho phép Service được liên kết với ứng dụng và có thể nhận được các lệnh hoặc thông tin từ ứng dụng. Khi Service được bắt đầu bằng phương thức này, nó sẽ chỉ chạy khi ứng dụng đang hoạt động và sẽ dừng lại khi ứng dụng bị dừng.
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 →
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 →
AIt is a component that provides a screen within which users can interact in order to do something
BIt expresses requests as intents & passes them between threads and/or processes
CIt's a framework that handles asynchronous requests on demand
DIt is an event handler that responds to system-side broadcast announcement
Lời giải
IntentService là một thành phần trong Android giúp thực hiện các yêu cầu nền (background task) một cách không đồng bộ (asynchronous). Nó thực hiện các yêu cầu này một cách độc lập và không cần phải chờ đợi kết quả. IntentService sử dụng các intent để thực hiện các yêu cầu này và có thể chạy trong nền mà không ảnh hưởng đến giao diện người dùng (UI). Nó cũng có thể được sử dụng để thực hiện các tác vụ lặp đi lặp lại như cập nhật dữ liệu từ mạng hoặc thực hiện các tác vụ khác mà không cần phải chờ đợi người dùng.
Mở trang câu hỏi này →
AWorker thread
BUI thread
CBackground thread
DMain worker
Lời giải
Trong Android, luồng chính (main thread) còn được gọi là luồng giao diện người dùng (UI thread). Luồng này chịu trách nhiệm xử lý các tác vụ liên quan đến giao diện người dùng, chẳng hạn như cập nhật UI, xử lý sự kiện người dùng, v.v. Luồng chính là nơi chạy các mã lệnh của ứng dụng, và nó phải đảm bảo rằng các tác vụ được thực hiện một cách đồng bộ và an toàn. Nếu luồng chính bị chậm hoặc bị treo, nó có thể gây ra các vấn đề về hiệu suất và thậm chí là lỗi ứng dụng.
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 →
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 →
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 →
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 →
Aimplements onBind, onUnbind, onRebind, onCreate, onDestroy methods
Bimplements onStartCommand, onBind, onUnbind, onRebind methods
Cimplements onStartCommand, onBind, onUnbind, onRebind, onCreate, onDestroy methods
Dimplements onCreate, onDestroy methods
Lời giải
Để phát triển một dịch vụ riêng trên Android, bạn cần thực hiện các bước sau. Bước 1: mở rộng lớp Service. Bước 2: bạn cần thực hiện các phương thức sau: onStartCommand, onBind, onUnbind, onRebind, onCreate, onDestroy. Phương thức onStartCommand được gọi khi dịch vụ được bắt đầu, onBind được gọi khi ứng dụng muốn kết nối với dịch vụ, onUnbind và onRebind được gọi khi ứng dụng kết nối và ngắt kết nối với dịch vụ, onCreate được gọi khi dịch vụ được tạo và onDestroy được gọi khi dịch vụ bị hủy. Những phương thức này giúp bạn quản lý và điều khiển dịch vụ của mình một cách hiệu quả.
Mở trang câu hỏi này →
A@Override protected void onHandleIntent(Intent intent) { ... }
B@Override protected void onStartCommand(Intent intent) { ... }
C@Override protected void onCreate(Intent intent) { ... }
D@Override protected void onDestroy(Intent intent) { ... }
Lời giải
Để xử lý các mục đích trong một IntentService, bạn cần sử dụng phương thức onHandleIntent(). Phương thức này được gọi khi IntentService nhận được một Intent mới. Trong phương thức này, bạn có thể thực hiện các hành động cần thiết để xử lý mục đích. Ví dụ, bạn có thể gọi các phương thức của API, thực hiện các tác vụ nền, hoặc gửi thông báo đến người dùng. Phương thức onHandleIntent() được gọi trên một luồng riêng biệt, vì vậy bạn có thể thực hiện các tác vụ tốn thời gian mà không ảnh hưởng đến luồng chính của ứng dụng.
Mở trang câu hỏi này →