Sự khác biệt giữa Intent và PendingIntent


96

Tôi đã đọc qua một số bài báo và dường như cả hai đều làm điều tương tự và tôi đã tự hỏi sự khác biệt giữa việc bắt đầu dịch vụ như vậy là gì:

Intent intent = new Intent(this, HelloService.class);
startService(intent);

hoặc tương tự:

Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

Như tôi đã đọc qua, hai điều này làm tương tự, nếu trong dịch vụ bạn trả về một tham số START_STICKY;


Không có gì khác biệt. Điều gì khiến bạn nghĩ rằng sẽ có? Trong trường hợp đầu tiên, bạn đang bắt đầu nó 'ngay bây giờ' và trong trường hợp thứ hai, bạn chỉ cần lên lịch cho nó trong thời gian / dữ liệu sau.
Squonk

Có thể có bản sao của Android PendingIntent là gì?
James Moore

Câu trả lời:


149

Ý định

Android Intent là một đối tượng mang một ý định, tức là một thông điệp từ một thành phần này đến một thành phần khác bên trong hoặc bên ngoài ứng dụng. Ý định có thể truyền đạt thông điệp giữa bất kỳ thành phần nào trong ba thành phần cốt lõi của ứng dụng - Hoạt động, Dịch vụ và Máy thu phát sóng.

Bản thân ý định, một đối tượng Intent, là một cấu trúc dữ liệu thụ động. Nó chứa một mô tả trừu tượng về một hoạt động sẽ được thực hiện.

Ví dụ: giả sử bạn có Hoạt động cần khởi chạy ứng dụng email khách và gửi email. Để làm điều này, Hoạt động của bạn sẽ gửi Ý định với hành động ACTION_SEND, cùng với trình chọn thích hợp, tới Trình phân giải ý định của Android:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

Trình chọn được chỉ định cung cấp giao diện thích hợp để người dùng chọn cách gửi dữ liệu email của bạn.

KHÁM PHÁ NỘI DUNG

// Explicit Intent by specifying its class name
   Intent i = new Intent(this, TargetActivity.class);
   i.putExtra("Key1", "ABC");
   i.putExtra("Key2", "123");

// Starts TargetActivity
   startActivity(i);

Ý TƯỞNG GÓP Ý

// Implicit Intent by specifying a URI
   Intent i = new Intent(Intent.ACTION_VIEW, 
   Uri.parse("http://www.example.com"));

// Starts Implicit Activity
   startActivity(i); 

Ý định đang chờ xử lý

PendingIntent là một mã thông báo mà bạn cung cấp cho một ứng dụng nước ngoài (ví dụ: NotificationManager, AlarmManager, Home Screen AppWidgetManager hoặc các ứng dụng bên thứ 3 khác), cho phép ứng dụng nước ngoài sử dụng quyền của ứng dụng của bạn để thực thi một đoạn mã được xác định trước.

Bằng cách cấp PendingIntent cho ứng dụng khác, bạn đang cấp cho ứng dụng đó quyền thực hiện thao tác mà bạn đã chỉ định như thể ứng dụng kia là của chính bạn (với cùng quyền và danh tính). Do đó, bạn nên cẩn thận về cách bạn xây dựng PendingIntent: hầu như luôn luôn, chẳng hạn, Intent cơ sở mà bạn cung cấp phải có tên thành phần được đặt rõ ràng thành một trong các thành phần của riêng bạn, để đảm bảo cuối cùng nó được gửi đến đó và không ở đâu khác.

Ví dụ cho Ý định đang chờ xử lý: http://android-pend-intent.blogspot.in/

Nguồn: Android IntentsAndroid Pending Intents

Hi vọng điêu nay co ich.


25

PendingIntentlà một trình bao bọc của Intent. Ứng dụng nước ngoài nhận được PendingIntent, không biết nội dung của Intentnó được bao bọc bởi PendingIntent. Nhiệm vụ của ứng dụng nước ngoài là gửi lại ý định cho chủ sở hữu khi đáp ứng một số điều kiện (Ví dụ: báo thức có lịch, hoặc thông báo bằng nhấp chuột ...). Các điều kiện do chủ sở hữu đưa ra nhưng ứng dụng nước ngoài xử lý (Ví dụ: báo động, thông báo).

Nếu ứng dụng nước ngoài gửi ý định đến ứng dụng của bạn, có nghĩa là ứng dụng nước ngoài đó biết về nội dung của ý định đó. còn ứng dụng nước ngoài đưa ra quyết định gửi ý định thì ứng dụng của bạn phải xử lý ý định để đáp ứng một số điều kiện => ứng dụng của bạn nhận được tài nguyên hiệu suất của hệ thống.


4

Một sự khác biệt đơn giản khác:

  • Mục đích thông thường sẽ chết ngay sau khi ứng dụng bị giết.

  • Ý định đang chờ xử lý không bao giờ chết. Chúng sẽ tồn tại miễn là nó cần bằng dịch vụ báo động, dịch vụ định vị hoặc bất kỳ dịch vụ nào khác.


1

Khởi động dịch vụ thường xuyên qua AlarmManager

Cũng như các hoạt động, hệ thống Android có thể chấm dứt quá trình của một dịch vụ bất kỳ lúc nào để tiết kiệm tài nguyên. Vì lý do này, bạn không thể đơn giản sử dụngTimerTask trong dịch vụ để đảm bảo rằng nó được thực thi một cách thường xuyên.

Vì vậy, để lên lịch chính xác của Dịch vụ, hãy sử dụng AlarmManagerlớp.

CẬP NHẬT:

Vì vậy, không có sự khác biệt thực tế giữa hai. Nhưng tùy thuộc vào việc bạn có muốn đảm bảo việc thực thi dịch vụ hay không, bạn có thể quyết định sử dụng dịch vụ nào vì trước đây không có bảo đảm và cho các dịch vụ sau .

Thông tin thêm tại AndroidServices .


2
Điều này không thực sự trả lời câu hỏi của OP là "sự khác biệt" giữa việc bắt đầu trực tiếp một dịch vụ và bắt đầu một dịch vụ bằng chuông báo động là gì. Ngoài ra, OP có thể đã xem bài viết mà bạn liên kết đến vì mã trong bài viết gần giống với những gì OP đã đăng.
Squonk

Ý của bạn là việc bắt đầu một dịch vụ từ AlarmManager sẽ an toàn hơn và ít có khả năng bị giết hơn từ một hoạt động? Tôi nghĩ nó là sai. Bạn có thể giải thích dùm không. @VedPrakash. Hơn nữa, tôi nghĩ rằng bối cảnh mà bạn vượt qua trong khi tạo ý định bắt đầu dịch vụ quan trọng hơn. Sử dụng ngữ cảnh của ứng dụng (getApplicationContext ()) thay vì ngữ cảnh của một hoạt động (this), sẽ an toàn hơn.
Parth Kapoor

@ Eu.Dr. Tôi khuyên bạn nên sử dụng trình quản lý cảnh báo sẽ được kích hoạt bất cứ lúc nào X ... thực hiện nhiệm vụ .. Tại sao? bởi vì nếu bạn sử dụng các dịch vụ, nó có thể bị đóng vào một lúc nào đó và bạn có thể bỏ qua một số cập nhật vào một thời điểm nhất định (không xác định). Đối với trường hợp nghi ngờ về ngữ cảnh, đừng bao giờ sử dụng getApplicationContext()hoặc sử dụng nó khi bạn muốn hoàn toàn, chỉ cần đọc - khi-cuộc gọi-hoạt động-ngữ cảnh-hoặc-ứng dụng-ngữ cảnh ( stackoverflow.com/questions/7298731/… ).
Chúa tôi,

1

Về mặt chức năng, không có sự khác biệt.

Ý nghĩa của PendingIntent là, bạn có thể xử lý nó cho ứng dụng khác mà sau này có thể sử dụng nó như thể chính ứng dụng kia. Đây là lời giải thích liên quan từ tài liệu :

Bằng cách cấp PendingIntent cho ứng dụng khác, bạn đang cấp cho ứng dụng đó quyền thực hiện thao tác mà bạn đã chỉ định như thể ứng dụng kia là của chính bạn (với cùng quyền và danh tính). Do đó, bạn nên cẩn thận về cách bạn xây dựng PendingIntent: hầu như luôn luôn, chẳng hạn, Intent cơ sở mà bạn cung cấp phải có tên thành phần được đặt rõ ràng thành một trong các thành phần của riêng bạn, để đảm bảo cuối cùng nó được gửi đến đó và không ở đâu khác.

Bản thân PendingIntent chỉ đơn giản là một tham chiếu đến mã thông báo được duy trì bởi hệ thống mô tả dữ liệu gốc được sử dụng để truy xuất nó.

Vì vậy, PendingIntent chỉ là một tham chiếu đến dữ liệu đại diện cho Intent ban đầu (được sử dụng để tạo PendingIntent).


4
Nói rằng không có sự khác biệt về mặt chức năng là không chính xác. Nếu chức năng của cả hai đều giống nhau thì tại sao có hai ở vị trí đầu tiên? Sự khác biệt quan trọng nhất trong PendingIntent đó được thực thi bởi thành phần từ xa (Như NotificationManager) với các quyền tương tự như quyền của thành phần trao nó (Cái tạo ra thông báo).
Aniket Thakur
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.