Câu trả lời:
Một PendingIntent
là 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 Intent
vớ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 Intent
sử dụng quyền của ứng dụng của bạn.
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.
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ề PendingIntent
lớ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ì PendingIntent
là, 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(...)
}
}
Tại sao PendingIntent là bắt buộc? Tôi đã suy nghĩ như
Intent
hoặcIntent
cho 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_ADMIN
thì ứ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_ADMIN
bật Bluetooth. Nguồn .
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);
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
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 ().
Ý đị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.
PendingIntent
về 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);
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.
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_STORAGE
quyề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).
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.
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ó.