2011-09-05 19 views
33

Ứng dụng của tôi cần lấy một số dữ liệu từ web vào một thời điểm cụ thể mỗi ngày. Vì vậy, tôi sử dụng một AlarmManager để sắp xếp các nhiệm vụ và hoạt động ok.Tôi có nên sử dụng PendingIntent.getService() hoặc getBroadcast với AlarmManager không?

Nhưng khi xem xét các ví dụ khác nhau, có vẻ như có hai cách để xử lý với AlarmManager khi nói đến mục đích đang chờ xử lý.

Một lần sử dụng PendingIntent.getBroadcast() để gọi bộ thu phát sóng khi báo thức tắt và bên trong bộ thu đó dịch vụ thực hiện công việc thực được bắt đầu.

Cách tiếp cận khác là sử dụng PendingIntent.getService() và gọi trực tiếp dịch vụ khi báo thức đó tắt.

Ai đó có thể giải thích cho tôi sự khác biệt giữa hai cách tiếp cận để tôi có thể quyết định người nào phải dựa vào?

EDIT: Một câu hỏi nữa là nơi lấy khóa thức khi sử dụng getService()?

Ví dụ, khi sử dụng BroadcastReceiver Tôi có dòng sau trong onReceive():

WakeReminderIntentService.acquireStaticLock(context); 

Làm thế nào tôi nên được các khóa trỗi dậy nếu tôi thay vì gọi cho dịch vụ trực tiếp như:

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); 

Tôi có nên đơn giản nhận được nó từ bên trong dịch vụ thay thế không?

+0

Nó thực sự không quan trọng bằng cách này hay cách khác. Bạn có thể sử dụng IntentService hoặc Service hoặc Broadcast cục bộ hoặc toàn cục. Bạn sẽ có thể làm như vậy trong tất cả chúng. –

Trả lời

16

Một lần sử dụng PendingIntent.getBroadcast() để gọi broadcast receiver khi báo thức tắt và bên trong mà người nhận dịch vụ thực hiện công việc thực tế được bắt đầu.

nó có thêm một bước trong vụ khởi đầu hơn

phương pháp khác là sử dụng PendingIntent.getService() và gọi cho dịch vụ trực tiếp khi báo động mà đi off.

thì bạn nên sử dụng phương pháp thứ hai là nó được giảm thêm một bước trong thực hiện ..

+1

"sau đó bạn nên sử dụng phương pháp thứ hai vì nó đang giảm một bước của bạn trong thực hiện": Nếu đó là sự khác biệt duy nhất, chắc chắn có.Nhưng tôi đã tự hỏi nếu có một sự khác biệt tinh tế hơn, một cái gì đó có thể ảnh hưởng đến hiệu suất vv – marlar

+0

Tôi không nghĩ rằng có bất cứ điều gì khác mà sẽ ảnh hưởng đến hiệu suất .. –

+0

Cảm ơn. Vui lòng xem câu hỏi được cập nhật của tôi. – marlar

11

Đọc chỉnh sửa của bạn tôi đoán bạn phát hiện ra bản thân: Nếu bạn muốn chắc chắn rằng dịch vụ của bạn được bắt đầu khi sử dụng AlarmManager, bạn nên đi đường vòng của lần đầu tiên gửi đến người nhận và có được khóa đánh thức ở đó. Nếu không, điện thoại sẽ ngủ trước khi dịch vụ được yêu cầu được khởi chạy. Đó là những gì javadoc of AlarmManager nói và tôi cũng đọc nó trong bài đăng bởi Google engineer.

Vì vậy, bây giờ để chỉnh sửa của bạn: Khi nào để lấy khóa? Toàn bộ điểm sử dụng thiết bị thu là lấy khóa trong phương thức onReceive() của thiết bị thu, vì Android sẽ không rơi vào giấc ngủ trong khi thực hiện phương pháp này.

Ví dụ: xem question.

Các vấn đề liên quan