Android PendingIntent là gì?


538

Tôi là người mới sử dụng Android. Tôi đã đọc Tài liệu Android nhưng tôi vẫn cần làm rõ thêm. Bất cứ ai có thể cho tôi biết chính xác a PendingIntentlà gì?

Câu trả lời:


892

Một PendingIntentlà một dấu hiệu mà bạn cung cấp cho một ứng dụng nước ngoài (ví dụ như NotificationManager, AlarmManager, Home Screen AppWidgetManager, hoặc các ứng dụng bên thứ 3 khác), trong đó cho phép các ứng dụng nước ngoài để sử dụng cho phép ứng dụng của bạn để thực hiện một mảnh được xác định trước mã .

Nếu bạn cung cấp cho ứng dụng nước ngoài một Ý định, nó sẽ thực thi quyền của bạn Intentvới quyền của chính nó. Nhưng nếu bạn cung cấp cho ứng dụng nước ngoài một PendingIntent, ứng dụng đó sẽ thực thi việc Intentsử dụng quyền của ứng dụng của bạn.


3
ngoại trừ thông báo, nơi nào bạn đã thấy bằng cách sử dụng cấp phát? Tôi nghĩ rằng tôi chỉ thấy các thông báo sử dụng nó ...
nhà phát triển Android

4
@Johnny_D: nói chung, nó có nghĩa là những gì nó nói, nói chung, bạn sẽ muốn tạo một Intent rõ ràng có tên thành phần là một tên tuyệt đối mà rõ ràng đề cập đến một trong các lớp của riêng bạn. Mặt khác, Ý định có thể được gửi đến một ứng dụng khác, điều này có thể gây ra sự cố vì Ý định đó sẽ chạy dưới sự cho phép của ứng dụng của bạn.
Lie Ryan

3
@LieRyan, sự cho phép ứng dụng ở đây có phải là sự cho phép mà chúng tôi chỉ định trong tệp kê khai không? Ví dụ. Cho phép INTERNET?
Diffy

2
Đây không phải là "bàn giao quyền" thực sự không tốt về bảo mật sao? Tôi có một ứng dụng A mà tôi đã cấp một số quyền. Sau đó, tôi có ứng dụng B sử dụng ít quyền hơn rất nhiều. Nếu ứng dụng A có thể khởi động một cái gì đó trong ứng dụng B thông qua PendingIntent (cho phép tạm thời tất cả các quyền từ A ở trên B), B có thể làm bất cứ điều gì có thể đằng sau hậu trường với sự cho phép đó không? Chẳng hạn, A có thể có quyền đọc danh bạ của người dùng nhưng B thì không. Nếu A gửi PendingIntent đến B, thì B có thể đọc các liên hệ và làm điều gì đó độc hại (như gửi nó đến máy chủ).
Tiago

6
@Tiago: Trong trường hợp của bạn, nếu Ứng dụng đặc quyền A cung cấp cho Ứng dụng B ý định chờ xử lý để B có thể gửi nó khi muốn đọc dữ liệu liên hệ. A có trách nhiệm hỏi người dùng dữ liệu liên hệ nào mà người dùng muốn cung cấp cho B và chỉ cung cấp cho B dữ liệu đó. Pending Intent là một cơ chế leo thang đặc quyền, và giống như bất kỳ cơ chế leo thang đặc quyền nào, với sức mạnh lớn đi kèm với trách nhiệm lớn. Người dùng có trách nhiệm quyết định xem ứng dụng B có đáng tin cậy đối với dữ liệu liên hệ mà người dùng đã chọn hay không.
Lie Ryan

48

Mục đích đang chờ xử lý là mã thông báo bạn cung cấp cho một số ứng dụng để thực hiện hành động thay mặt cho ứng dụng của bạn bất kể quá trình ứng dụng của bạn có còn sống hay không.

Tôi nghĩ rằng tài liệu này đủ chi tiết: Tài liệu đang chờ xử lý .

Chỉ cần nghĩ về các trường hợp sử dụng cho Ý định đang chờ xử lý như (Ý định phát sóng, báo thức lên lịch) và tài liệu sẽ trở nên rõ ràng và có ý nghĩa hơn.


Tôi nghĩ rằng Intent cũng là một loại mã thông báo mà chúng tôi cung cấp cho một số ứng dụng khác để thực hiện một hành động thay mặt cho ứng dụng của chúng tôi. Vì vậy, sự khác biệt duy nhất giữa ý định chờ xử lý và ý định là cuộc sống ứng dụng của chúng tôi?
CopsOnRoad

40

Trong trường hợp của tôi, không có câu trả lời nào ở trên cũng như tài liệu chính thức của google giúp tôi nắm bắt được khái niệm về PendingIntentlớp học.

Và sau đó tôi tìm thấy video này, Google I / O 2013, Beyond the Blue Dot session . Trong video này, ex-googler Jaikumar Ganesh giải thích những gì PendingIntentlà, và đó là điều đã cho tôi bức tranh lớn về điều này.

Dưới đây chỉ là phiên âm của video trên ( từ 15:24 ).

Vì vậy, một ý định chờ xử lý là gì?

Đó là mã thông báo mà quy trình ứng dụng của bạn sẽ cung cấp cho quy trình vị trí và quy trình vị trí sẽ sử dụng nó để đánh thức ứng dụng của bạn khi có sự kiện quan tâm xảy ra . Vì vậy, điều này về cơ bản có nghĩa là ứng dụng của bạn trong nền không phải luôn luôn chạy. Khi một cái gì đó quan tâm xảy ra, chúng tôi sẽ đánh thức bạn dậy. Điều này tiết kiệm rất nhiều pin.

Giải thích này trở nên rõ ràng hơn với đoạn mã này (được bao gồm trong slide của phiên).

PendingIntent mIntent = PendingIntent.getService(...);

mLocationClient.requestLocationUpdates(locationRequest, mIntent);

public void onHandleIntent(Intent intent) {   
    String action = intent.getAction();   
    if (ACTION_LOCATION.equals(action)) {       
        Location location = intent.getParcelableExtra(...)   
    }
}

Đồng ý, nó khá đơn giản và dễ hiểu. Nhưng nó không cho chúng tôi biết bất cứ điều gì về sự cho phép mà PendingIntent cấp cho ứng dụng khác.
CopsOnRoad

35

Tại sao PendingIntent là bắt buộc? Tôi đã suy nghĩ như

  1. Tại sao bản thân ứng dụng nhận không thể tạo Intenthoặc
  2. Tại sao chúng ta không thể sử dụng một đơn giản Intentcho cùng một mục đích.

Ví dụIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Nếu tôi gửi bluetoothIntentđến một ứng dụng khác không có quyền android.permission.BLUETOOTH_ADMINthì ứng dụng nhận đó không thể bật Bluetooth startActivity(bluetoothIntent).

Các hạn chế được khắc phục bằng cách sử dụng PendingIntent. Với PendingIntentứng dụng nhận, không cần phải android.permission.BLUETOOTH_ADMINbật Bluetooth. Nguồn .


3
Ví dụ bluetoothIntent của bạn thực sự có giá trị. Cảm ơn
Nicks

1
@Kiran - Nếu ứng dụng nhận có thể bật Bluetooth (sử dụng Pending Intent) thì tại sao ứng dụng đó không bao gồm quyền này trong Bản kê khai của nó? Giống như tôi đang tạo một ứng dụng có thể thực hiện cuộc gọi nhưng tôi không bao gồm quyền CALL_PHONE vì tôi muốn ứng dụng khác gửi cho tôi Ý định chờ xử lý để thực hiện cuộc gọi này. Đây có phải là những gì bạn muốn nói?
CopsOnRoad

1
@CopsOnRoad Ứng dụng nhận của PendingIntent có thể là một ứng dụng chung nhận bất kỳ yêu cầu nào và thực hiện yêu cầu thay mặt cho người yêu cầu. Vai trò của nó chỉ là một người trung gian, do đó không có tất cả các quyền. Một ví dụ về loại ứng dụng dành cho người trung niên này là trình quản lý thông báo, có thể khởi chạy bất kỳ ứng dụng dự định nào từ thông báo mà không cần sở hữu quyền.
Xiao-Feng Li

21

Mục đích đang chờ xử lý là một ý định sẽ bắt đầu tại một thời điểm nào đó trong tương lai. Ý định bình thường bắt đầu ngay lập tức khi nó được chuyển đến startActivity(Intent)hoặc StartService(Intent).


13

Một ý định trong tương lai mà các ứng dụng khác có thể sử dụng.
Và đây là một ví dụ để tạo một:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);

8
Downvote vì bạn không thực sự giải thích điều gì đặc biệt về một mục đích "tương lai" hoặc có thể sử dụng được bởi các ứng dụng khác
Vic

@ WhereDatApp.com đã được nói bởi Antoine de Saint Exupéry và được dịch bởi Lewis Galantière;)
Choletski

@Choletski cảm ơn, tôi không biết về bản dịch 👍
Oded Breiner

13

PHÂN TÍCH TAXI

Ý định

Ý định thường được sử dụng để bắt đầu Dịch vụ. Ví dụ:

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

Điều này giống như khi bạn gọi taxi:

Myself = CurrentClass
Taxi Driver = ServiceClass

Ý định chờ xử lý

Bạn sẽ cần phải sử dụng một cái gì đó như thế này:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

Bây giờ bên thứ ba này sẽ bắt đầu dịch vụ thay mặt bạn. Một sự tương tự trong cuộc sống thực là Uber hoặc Lyft, cả hai đều là công ty taxi.

Bạn gửi yêu cầu đi xe đến Uber / Lyft. Sau đó, họ sẽ đi trước và gọi một trong những tài xế của họ thay mặt bạn.

Vì thế:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass

11

PendingIntent là mã thông báo mà bạn cung cấp cho một ứng dụng khác (ví dụ: Trình quản lý thông báo, Trình quản lý báo thức hoặc các ứng dụng bên thứ 3 khác), cho phép ứng dụng khác này sử dụng các 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. Để thực hiện truyền phát qua mục đích đang chờ xử lý, hãy lấy PendingIntent qua PendingIntent.getBroadcast (). Để thực hiện một hoạt động thông qua một mục đích đang chờ xử lý, bạn nhận được hoạt động thông qua PendingIntent.getActivity ().


7

Ý định là gì?

Intent là một lệnh cụ thể trong Android cho phép bạn gửi lệnh đến HĐH Android để thực hiện một việc cụ thể. Hãy nghĩ về nó giống như một hành động cần phải diễn ra. Có nhiều hành động có thể được thực hiện như gửi email, hoặc đính kèm ảnh vào email hoặc thậm chí khởi chạy một ứng dụng. Quy trình hợp lý của việc tạo ra một ý định thường như sau: a. Tạo ý định b. Thêm tùy chọn Ý định -> Ex. loại ý định nào chúng tôi đang gửi cho HĐH hoặc bất kỳ thuộc tính nào liên quan đến ý định đó, chẳng hạn như chuỗi văn bản hoặc nội dung nào đó được truyền cùng với mục đích c. CHẠY Ý định

Ví dụ về cuộc sống thực: Giả sử tôi thức dậy vào buổi sáng và tôi "TRỞ LẠI" để đi đến phòng vệ sinh. Trước tiên tôi sẽ phải NGHINK về việc đi vệ sinh, nhưng điều đó thực sự không đưa tôi đến nhà vệ sinh. Sau đó tôi sẽ phải nói với bộ não của mình ra khỏi giường trước, sau đó đi bộ đến phòng vệ sinh, sau đó thả ra, sau đó đi và rửa tay, sau đó đi và lau tay. Khi tôi biết mình sẽ đi đâu, tôi sẽ gửi lệnh bắt đầu và cơ thể tôi hành động.

Ý định chờ xử lý là gì?

Tiếp tục từ ví dụ thực tế, giả sử tôi muốn đi tắm nhưng tôi muốn tắm SAU KHI tôi đánh răng và ăn sáng. Vì vậy, tôi biết tôi sẽ không tắm cho đến ít nhất 30-40 phút. Trong đầu tôi vẫn cần chuẩn bị quần áo, rồi đi lên cầu thang trở lại phòng tắm, sau đó cởi quần áo và sau đó tắm. Tuy nhiên, điều này sẽ không xảy ra cho đến khi 30-40 phút trôi qua. Bây giờ tôi có một ý định PENDING để tắm. Đó là PENDING trong 30-40 phút.

Đó là khá nhiều sự khác biệt giữa Ý định chờ xử lý và Ý định thường xuyên. Ý định thông thường có thể được tạo mà không có Ý định chờ xử lý, tuy nhiên để tạo Mục đích đang chờ xử lý, trước tiên bạn cần phải có thiết lập Ý định thường xuyên.


Tôi thực sự thích sự đơn giản và ví dụ, tôi hiểu nó khá tốt với những từ đó.
Josema

Tôi rất vui vì bài đăng này hữu ích với bạn Josema
Narendra Motwani

điều này giống hệt như lời giải thích của Shakeeb Ayaz ở trên. ai sao chép từ ai? :)
likejudo

5

PendingIntentvề cơ bản là một đối tượng bao bọc một Intentđối tượng khác . Sau đó, nó có thể được chuyển cho một ứng dụng nước ngoài nơi bạn cấp cho ứng dụng đó quyền thực hiện thao tác, tức là thực hiện ý định như thể nó được thực thi từ quy trình của ứng dụng của bạn (cùng quyền và danh tính). Vì lý do bảo mật, bạn phải luôn chuyển ý định rõ ràng cho PendingIntent thay vì ẩn.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

4

Trong một ngôn ngữ dễ dàng,
1. Mô tả về hành động Mục đích và Mục tiêu cần thực hiện. Trước tiên, bạn phải tạo một ý định và sau đó bạn phải chuyển một lớp java cụ thể mà bạn muốn thực hiện, đến Ý định.
2. Bạn có thể gọi các lớp java đó là lớp hành động lớp của bạn bằng PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) getService (Ngữ cảnh, int, Intent, int); Ở đây bạn thấy rằng Ý định xuất phát từ bước 1
3. Bạn nên nhớ rằng ... Bằng cách cung cấp PendingIntent cho một ứng dụng khác, bạn đang trao cho nó quyền thực hiện thao tác bạn đã chỉ định.

Đó là những gì tôi học được sau một thời gian dài đọc.


3

PendingIntent kết thúc Ý định chung với mã thông báo mà bạn cung cấp cho ứng dụng nước ngoài để thực thi với sự cho phép của bạn. Ví dụ:

Thông báo về ứng dụng âm nhạc của bạn không thể phát / tạm dừng nhạc nếu bạn không cung cấp PendingIntentđể gửi phát vì ứng dụng nhạc của bạn có READ_EXTERNAL_STORAGEquyền mà ứng dụng thông báo không có. Thông báo là một dịch vụ hệ thống (vì vậy nó là một ứng dụng nước ngoài).


ví dụ tuyệt vời
likejudo

2

Như tên của nó cho thấy .. PendingIntent

bạn có thể lắc (làm điều đó sau một thời gian) nó. Nó hoạt động như một mục đích khác .. đó là một cách giao nhiệm vụ của bạn cho một số ứng dụng khác để thực hiện thay mặt bạn.


1
Bạn có thể đưa ra một ví dụ thực tế cho việc này?
CopsOnRoad

0

Một ý định đang chờ xử lý chỉ định một hành động sẽ thực hiện trong tương lai. Nó cho phép bạn chuyển một Ý định trong tương lai sang một ứng dụng khác và cho phép ứng dụng đó thực thi Ý định đó như thể nó có cùng quyền với ứng dụng của bạn, cho dù ứng dụng của bạn có còn tồn tại khi Intent cuối cùng được gọi hay không.

Đó là mã thông báo mà bạn cung cấp cho ứng dụng nước ngoài 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.

Nếu bạn cung cấp cho ứng dụng nước ngoài một Ý định và ứng dụng đó sẽ gửi / phát sóng Ý định mà bạn đã cung cấp, họ sẽ thực hiện Ý định với sự cho phép của chính họ. Nhưng nếu thay vào đó, bạn cung cấp cho ứng dụng nước ngoài một Ý định đang chờ xử lý mà bạn đã tạo bằng sự cho phép của riêng bạn, thì ứng dụng đó sẽ thực thi Ý định được sử dụng bằng sự cho phép của ứng dụng của bạn.

Để thực hiện truyền phát qua mục đích đang chờ xử lý, hãy lấy PendingIntent qua PendingIntent.getBroadcast (). Để thực hiện một hoạt động thông qua một mục đích đang chờ xử lý, bạn nhận được hoạt động thông qua PendingIntent.getActivity ().

Đó là một hành động Ý định mà bạn muốn thực hiện, nhưng sau đó. Hãy nghĩ về nó một ý định trên băng. Lý do cần thiết là vì một ý định phải được tạo và khởi chạy từ Ngữ cảnh hợp lệ trong ứng dụng của bạn, nhưng có một số trường hợp nhất định không có sẵn tại thời điểm bạn muốn chạy hành động vì về mặt kỹ thuật bạn đang ở ngoài ngữ cảnh của ứng dụng ( hai ví dụ phổ biến đang khởi chạy một Hoạt động từ Thông báo hoặc BroadcastReceiver.

Bằng cách tạo PendingIntent mà bạn muốn sử dụng để khởi chạy, giả sử, một Hoạt động trong khi bạn có Ngữ cảnh để thực hiện (từ bên trong Hoạt động hoặc Dịch vụ khác), bạn có thể chuyển đối tượng đó xung quanh sang một thứ bên ngoài để nó khởi chạy một phần ứng dụng của bạn thay mặt bạn.

PendingIntent cung cấp một phương tiện để các ứng dụng hoạt động, ngay cả khi quá trình của chúng thoát ra. Điều quan trọng cần lưu ý là ngay cả sau khi ứng dụng tạo PendingIntent bị giết, Intent vẫn có thể chạy. Một mô tả về một hành động Mục đích và mục tiêu để thực hiện với nó. Các thể hiện của lớp này được tạo bằng getActivity (Ngữ cảnh, int, Intent, int), getBroadcast (Ngữ cảnh, int, Intent, int), getService (Ngữ cảnh, int, Intent, int); đối tượng được trả lại có thể được trao cho các ứng dụng khác để chúng có thể thực hiện hành động mà bạn mô tả thay mặt bạn sau đó.

Bằng cách cung cấp PendingIntent cho một ứng dụng khác, bạn đang trao cho nó quyền thực hiện thao tác mà bạn đã chỉ định như thể ứng dụng kia là chính bạn (có 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: thường, ví dụ, Ý định cơ sở bạn cung cấp sẽ 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 ở đó 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ó. Điều này có nghĩa là, ngay cả khi quy trình sở hữu ứng dụng của nó bị giết, bản thân PendingIntent sẽ vẫn có thể sử dụng được từ các quy trình khác đã được cung cấp. Nếu ứng dụng tạo sau đó truy xuất lại cùng loại PendingIntent (cùng hoạt động, cùng hành động Ý định, dữ liệu, danh mục và thành phần và cùng một cờ), nó sẽ nhận được PendingIntent đại diện cho cùng một mã thông báo nếu điều đó vẫn hợp lệ và có thể do đó gọi hủy () để loại bỏ nó.


0

Pending Intent là một ý định cung cấp tất cả các quyền cho ứng dụng khác để thực hiện một công việc cụ thể. Khi hoạt động chính bị hủy, HĐH Android sẽ lấy lại sự cho phép từ nó.

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.