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
Mở trang câu hỏi này →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?
A
ActivityB
ServiceC
BroadcastReceiverD
IntentLời giải
Mở trang câu hỏi này →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.
AActivities
BServices
CBroadcast Receivers
DContent Providers
Lời giải
Mở trang câu hỏi này →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.
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
Mở trang câu hỏi này →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.
A
servicesB
simulatorC
EmulatorD
IntentLời giải
Mở trang câu hỏi này →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.
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
Mở trang câu hỏi này →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.
7Which of the following function calls can be used to start a Service from your Android application?4 lựa chọn
A
bindServiceB
startServiceC
runServiceD
launchServiewLời giải
Mở trang câu hỏi này →Để 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.
AImplement publishProgress(). Call publishProgress().
BImplement publishProgress(). Call onProgressUpdate().
CImplement onProgressUpdate(). Call publishProgress().
DImplement onProgressUpdate(). Call onProgressUpdate().
Lời giải
Mở trang câu hỏi này →Để 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.
A
URLB
IntegerC
LongD
VoidLời giải
Mở trang câu hỏi này →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.
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
Mở trang câu hỏi này →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.
AWorker thread
BUI thread
CBackground thread
DMain worker
Lời giải
Mở trang câu hỏi này →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.
12What is the primary difference between a Bound Service and a Started Service (unbound) in Android?4 lựa chọn
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
Mở trang câu hỏi này →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.
A
ThreadB
AsyncTaskC
HandlerD
ExecutorServiceLời giải
Mở trang câu hỏi này →Để 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).
14Which of the following correctly describes the purpose of the onProgressUpdate() method in an AsyncTask?4 lựa chọn
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ở trang câu hỏi này →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.
15Which method is called when a Service is first created through startService() or bindService()?4 lựa chọn
A
onStart()B
onResume()C
onCreate()D
onDestroy()Lời giải
Mở trang câu hỏi này →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.
A
START_STICKYB
START_NOT_STICKYC
START_REDELIVER_INTENTD
START_RETAIN_INTENTLời giải
Mở trang câu hỏi này →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?
A
AppCompatActivityB
FragmentActivityC
ActivityCompatD
ServiceCompatLời giải
Mở trang câu hỏi này →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.
18Evaluate the effectiveness of using Services for background tasks compared to Activities:4 lựa chọn
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
Mở trang câu hỏi này →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.
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
Mở trang câu hỏi này →Để 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ả.
20How do you handle intents in an IntentService?4 lựa chọn
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
Mở trang câu hỏi này →Để 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.