Android onCreate hoặc onStartCommand để bắt đầu dịch vụ


105

Thông thường khi tôi tạo một dịch vụ Android, tôi thực hiện onCreatephương pháp này, nhưng trong dự án cuối cùng của tôi, điều này không hoạt động. Tôi đã thử triển khai onStartCommandvà điều này dường như hoạt động.

Câu hỏi đặt ra là: khi tôi phải triển khai một dịch vụ thì phương pháp nào được yêu cầu? Tôi phải thực hiện những phương pháp nào? onCreate, onStartCommandhoặc cả hai? Và vai trò của từng loại là gì?


onCreateluôn luôn được gọi bất kể
IgorGanapolsky

Câu trả lời:


189

onCreate()được gọi khi Serviceđối tượng được khởi tạo (tức là: khi dịch vụ được tạo ). Bạn nên làm những việc trong phương thức này mà bạn chỉ cần làm một lần (ví dụ: khởi tạo một số biến, v.v.). onCreate()sẽ chỉ được gọi một lần cho mỗi đối tượng được khởi tạo .

Bạn chỉ cần triển khai onCreate()nếu bạn thực sự muốn / cần khởi tạo thứ gì đó chỉ một lần .

onStartCommand()được gọi mỗi khi khách hàng bắt đầu sử dụng dịch vụ startService(Intent intent). Điều này có nghĩa là nó onStartCommand()có thể được gọi nhiều lần. Bạn nên thực hiện những việc cần thiết trong phương pháp này mỗi khi khách hàng yêu cầu điều gì đó từ dịch vụ của bạn. Điều này phụ thuộc rất nhiều vào những gì dịch vụ của bạn làm và cách nó giao tiếp với khách hàng (và ngược lại).

Nếu bạn không triển khai onStartCommand()thì bạn sẽ không thể nhận được bất kỳ thông tin nào từ Intentkhách hàng chuyển đến onStartCommand()và dịch vụ của bạn có thể không thực hiện được bất kỳ công việc hữu ích nào.


6
Có thể tồn tại hai phiên bản của cùng một Dịch vụ trong một ứng dụng không?
jacktrades

1
@jacktrades Về mặt lý thuyết và theo tài liệu: Không. Tuy nhiên, dường như có một số lỗi trong Android mà thực sự trong một số trường hợp nhất định, nó sẽ tạo ra nhiều phiên bản của một Dịch vụ. Tuy nhiên, như tôi đã nói, đây là một lỗi và chúng tôi không thể tái tạo nó một cách đáng tin cậy theo ý muốn. Tại sao cậu lại hỏi?
David Wasser

3
@Mr_and_Mrs_D Không có lỗi chính thức nào được báo cáo theo như tôi biết. Tuy nhiên, có một số báo cáo về điều này đang xảy ra và tôi có một ứng dụng mà tôi biết rằng nó đang xảy ra. Tôi đã không thể giảm vấn đề thành một cái gì đó nhỏ và có thể lặp lại nên tôi đã không tự mình gửi lỗi. Tài liệu không nêu rõ ràng rằng các dịch vụ là đơn lẻ, nhưng rất rõ ràng rằng đó là mục đích. Nhìn vào các tài liệu cho 'startService () `: nêu rõ rằng nếu dịch vụ chưa được chạy, nó sẽ được tạo ra và bắt đầu, nếu nó đang chạy nó vẫn chạy
David Wasser

6
@Diffy Khi bạn gọi startService(), nếu dịch vụ không chạy, Android sẽ tạo một thể hiện của lớp dịch vụ (đây là một đối tượng dịch vụ) và sau đó sẽ gọi onCreate()đối tượng đó. Sau đó nó sẽ gọi onStartCommand()đối tượng đó. Nếu một thời gian sau, bạn gọi lại startService(), nếu dịch vụ vẫn đang chạy, Android sẽ không tạo đối tượng dịch vụ mới. Thay vào đó, nó sẽ chỉ gọi onStartCommand()đối tượng dịch vụ hiện có. Rõ chưa?
David Wasser

1
Tôi mến bạn! (y) làm việc như ma thuật (y) rất đơn giản và giải thích tốt
Hilton Khadka

11

Dịch vụ hoạt động giống như Hoạt động Bất cứ điều gì bạn muốn associatemột lần với một dịch vụ sẽ hoạt động onCreategiống như khởi tạo

và bất cứ khi nào serviceđược gọi bằng startService . onStartCommandsẽ được gọi. và bạn có thể chuyển bất kỳ hành động nào để thực hiện. như đối với máy nghe nhạc, Bạn có thể phát, tạm dừng, ngừng sử dụng hành động

Và bạn thực hiện bất kỳ operation in servicehành động nào bằng cách gửi một hành động và nhận nó trênonStartCommand

onCreate hoạt động như một Constructor.

Chỉnh sửa ngắn gọn

onCreate()chỉ cuộc gọi lần đầu tiên bạn bắt đầu ServiceTrong khi onStartCommand()cuộc gọi mỗi khi bạn gọi startServicelại. Nó cho phép bạn thiết lập một hành động như phát, dừng, tạm dừng nhạc.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

Vì vậy, khi tôi gọi một dịch vụ bằng startService (ý định), liệu onCreate () sẽ không được gọi? Tôi nghi ngờ không hiểu 'đối tượng dịch vụ' là gì bởi vì tôi đã luôn bắt đầu một dịch vụ bằng startSevice (ý định).
Diffy

Bạn đã đúng nhanh chóng các đối tượng dịch vụ hoặc Có lẽ bạn không có các dịch vụ trong biểu hiện của bạn
Zar E Ahmer

bắt đầu dịch vụ như startService (Intent mới (this, ServiceName.class));
Zar E Ahmer

Nhưng phương pháp này có được gọi là khởi tạo dịch vụ không? Sau đó, đối tượng dịch vụ ở đâu?
Diffy

nó là một cách gọi Hoạt động và Dịch vụ sử dụng ý định chịu trách nhiệm mở Hoạt động và Dịch vụ trong Android. Những gì bạn muốn làm với đối tượng dịch vụ, bạn cũng có thể làm với mục đích. i có nghĩa là thông qua dữ liệu với Dịch vụ
Zar E Ahmer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.