13

Context.startServiceAndroid: Dịch vụ với Context.startService Bắt đầu vs PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
context.startService(intent); 

PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
PendingIntent pi = PendingIntent.getService(context, 0, intent, 0); 
pi.send(); 


Câu hỏi

  1. Khi nào bạn bắt đầu một dịch vụ với Context.startService vs PendingIntent?
  2. Tại sao bạn nên sử dụng cái kia?

Trả lời

18

Thực sự không có sự khác biệt.

Cụ thể phương pháp Ngữ cảnh được sử dụng để trực tiếp khởi động nó khi PendingIntent thường được sử dụng với thông báo để kích hoạt ý định này khi nó được khai thác, bị trì hoãn cho đến khi người dùng chạm vào nó (thường). Tuy nhiên; bạn thường sẽ không gửi PendingIntent trực tiếp bởi vì đó không phải là những gì nó được cho.

PendingIntent là một Intent đang chờ xử lý, đang chờ xử lý, có nghĩa là NOT của bạn phải xảy ra ngay bây giờ, nhưng trong tương lai gần. Trong khi đó với Intent, nó được gửi vào đúng lúc.

Nếu PendingIntent không chờ xử lý khi nó được sử dụng, thì nó không còn là PendingIntent nữa và nó là một Intent. Đánh bại mục đích hoàn toàn.

+0

Vì vậy, có bao giờ một thời gian khi bạn muốn bắt đầu một dịch vụ với 'PendingIntent'? –

+2

Nếu bạn muốn bắt đầu một dịch vụ trong tương lai gần, đây sẽ là trường hợp lý tưởng. Giả sử tôi có thông báo hiển thị bản cập nhật mới có sẵn cho tài khoản của người dùng. Lý tưởng nhất là sẽ có một mục đích đang chờ xử lý sẽ thiết lập kết nối với máy chủ và tải xuống thông tin này. Tôi muốn nó được thực hiện khi người dùng đã khai thác thông báo NOT ngay lập tức, bằng cách này tôi chờ sự thuận tiện của người dùng, hoặc nếu người dùng không quan tâm họ có thể hủy bỏ thông báo và bản cập nhật mới tiếp theo sẽ phản ứng theo cùng một cách. – JoxTraex

+0

Giải thích tuyệt vời, cảm ơn! – damluar

1

PendinNội dung được sử dụng rất nhiều cho các tiện ích. Do bố cục của một tiện ích đang chạy không "thuộc về" đối với mã của bạn, nhưng thay vào đó là dưới sự kiểm soát của hệ thống, bạn không thể gán trực tiếp các trình nghe nhấp chuột vào các phần tử giao diện. Thay vào đó bạn gán một PendingIntent đến những yếu tố (như nút) để khi người dùng chạm vào họ, PendingIntent là "thực thi", một cái gì đó như:

// get the widget layout 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.id.widget_layout); 

// prepare to listen the clicks on the refresh button 
Intent active = new Intent(context, WidgetCode.UpdateService.class); 
PendingIntent refreshPendingIntent = PendingIntent.getService(context, 0, active, 0); 
remoteViews.setOnClickPendingIntent(R.id.buttonWidgetRefresh, refreshPendingIntent); 

// send the changes to the widget 
AppWidgetManager.getInstance(context).updateAppWidget(appwidgetid, remoteViews); 

Trong trường hợp này một nút trong widget bắt đầu một dịch vụ. Thông thường, bạn đặt thêm thông tin trong mục đích, với putExtras(), do đó, dịch vụ sẽ nhận được bất kỳ thông tin cần thiết nào để thực hiện công việc của mình.

+0

Chỉ cần thông báo rằng bạn phải thêm dịch vụ của mình vào tệp kê khai và thêm thuộc tính export = "true" quan trọng – Lior

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