ฉันเป็นมือใหม่กับ Android ฉันอ่านเอกสาร Android แล้ว แต่ฉันยังต้องการคำชี้แจงเพิ่มเติม ใครช่วยบอกฉันได้ว่าอะไรกันแน่PendingIntent
?
ฉันเป็นมือใหม่กับ Android ฉันอ่านเอกสาร Android แล้ว แต่ฉันยังต้องการคำชี้แจงเพิ่มเติม ใครช่วยบอกฉันได้ว่าอะไรกันแน่PendingIntent
?
คำตอบ:
A PendingIntent
เป็นโทเค็นที่คุณมอบให้กับแอปพลิเคชันต่างประเทศ (เช่นNotificationManager
, AlarmManager
หน้าจอหลักAppWidgetManager
หรือแอปพลิเคชันอื่น ๆ ของบุคคลที่สาม) ซึ่งอนุญาตให้แอปพลิเคชันต่างประเทศใช้สิทธิ์ของแอปพลิเคชันของคุณ
หากคุณให้เจตนาแก่แอ็พพลิเคชันต่างประเทศแอปพลิเคชันนั้นจะดำเนินการตามสิทธิ์ของคุณIntent
เอง แต่ถ้าคุณให้แอปพลิเคชันต่างประเทศกแอปพลิเคชันPendingIntent
นั้นจะดำเนินการIntent
โดยใช้สิทธิ์ของแอปพลิเคชันของคุณ
เจตนาที่รอดำเนินการเป็นโทเค็นที่คุณมอบให้กับแอพบางตัวเพื่อดำเนินการในนามของแอพโดยไม่คำนึงว่ากระบวนการสมัครของคุณยังมีชีวิตอยู่หรือไม่
ผมคิดว่าเอกสารมีรายละเอียดเพียงพอ: รอดำเนินการเอกสารแสดงเจตจำนง
แค่คิดกรณีการใช้งานสำหรับ Intents ที่รอดำเนินการเช่น (Broadcasting Intents, กำหนดการเตือน) และเอกสารจะชัดเจนและมีความหมาย
ในกรณีของฉันไม่มีคำตอบข้างต้นหรือเอกสารอย่างเป็นทางการของ googleช่วยให้ฉันคว้าแนวคิดของการPendingIntent
เรียน
และจากนั้นผมพบว่าวิดีโอนี้Google I / O 2013 นอกเหนือจากบลูดอทเซสชั่น ในวิดีโอนี้อดีต googler Jaikumar Ganesh อธิบายว่าอะไรPendingIntent
คืออะไรและนั่นคือสิ่งที่ทำให้ฉันเห็นภาพรวมของสิ่งนี้
ด้านล่างนี้เป็นเพียงการถอดความวิดีโอด้านบน ( จาก 15:24 )
ดังนั้นความตั้งใจที่รออยู่คืออะไร?
มันเป็นสัญญาณว่ากระบวนการของแอปจะให้กระบวนการสถานที่และกระบวนการสถานที่จะใช้ในการตื่นขึ้นมาของแอปเมื่อมีเหตุการณ์ที่น่าสนใจเกิดขึ้น ดังนั้นนี่จึงหมายความว่าแอปของคุณในพื้นหลังไม่จำเป็นต้องทำงานอยู่เสมอ เมื่อสิ่งที่น่าสนใจเกิดขึ้นเราจะปลุกคุณ สิ่งนี้ช่วยประหยัดแบตเตอรี่ได้มาก
คำอธิบายนี้ชัดเจนยิ่งขึ้นด้วยโค้ดตัวอย่างนี้ (ซึ่งรวมอยู่ในสไลด์ของเซสชัน)
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(...)
}
}
ทำไมต้องมี PendingIntent ฉันคิดอย่างนั้น
Intent
หรือIntent
สำหรับจุดประสงค์เดียวกันได้เช่นIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
ถ้าผมส่งbluetoothIntent
ไปยังโปรแกรมประยุกต์อื่นซึ่งไม่ได้รับอนุญาตที่ได้รับใบสมัครไม่สามารถเปิดใช้งานบลูทูandroid.permission.BLUETOOTH_ADMIN
ธstartActivity(bluetoothIntent)
ข้อ จำกัด PendingIntent
ที่จะเอาชนะโดยใช้ ด้วยPendingIntent
แอปพลิเคชันที่รับไม่จำเป็นต้องandroid.permission.BLUETOOTH_ADMIN
เปิดใช้งาน Bluetooth แหล่ง
ความตั้งใจที่รอดำเนินการเป็นความตั้งใจที่จะเริ่มในบางจุดในอนาคต เจตนาปกติจะเริ่มต้นทันทีเมื่อมีการส่งผ่านไปยังหรือstartActivity(Intent)
StartService(Intent)
ความตั้งใจในอนาคตที่แอปอื่นสามารถใช้
และนี่คือตัวอย่างสำหรับการสร้าง:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
บทวิเคราะห์รถแท็กซี่
เจตนา
โดยทั่วไปความตั้งใจจะใช้เพื่อเริ่มบริการ ตัวอย่างเช่น:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);
เหมือนเมื่อคุณเรียกใช้รถแท็กซี่:
Myself = CurrentClass
Taxi Driver = ServiceClass
รอการแสดงเจตนา
คุณจะต้องใช้สิ่งนี้:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);
ตอนนี้บุคคลที่สามนี้จะเริ่มให้บริการในนามของคุณ การเปรียบเทียบชีวิตจริงคือ Uber หรือ Lyft ซึ่งเป็นทั้ง บริษัท แท็กซี่
คุณส่งคำขอให้ไปที่ Uber / Lyft พวกเขาจะไปข้างหน้าและเรียกไดรเวอร์ตัวใดตัวหนึ่งในนามของคุณ
ดังนั้น:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
PendingIntent เป็นโทเค็นที่คุณมอบให้กับแอปพลิเคชันอื่น (เช่นตัวจัดการการแจ้งเตือนตัวจัดการสัญญาณเตือนภัยหรือแอปพลิเคชันอื่น ๆ ของบุคคลที่สาม) ซึ่งอนุญาตให้แอปพลิเคชันอื่นนี้ใช้สิทธิ์ของแอปพลิเคชันของคุณ หากต้องการทำการออกอากาศผ่านจุดประสงค์ที่รอดำเนินการอยู่ดังนั้นขอให้ PendingIntent ผ่านทาง PendingIntent.getBroadcast () ในการทำกิจกรรมด้วยความตั้งใจที่รอดำเนินการคุณจะได้รับกิจกรรมผ่านทาง PendingIntent.getActivity ()
เจตนาคืออะไร
An Intent เป็นคำสั่งเฉพาะใน Android ที่อนุญาตให้คุณส่งคำสั่งไปยัง Android OS เพื่อทำสิ่งที่เฉพาะเจาะจง คิดว่ามันเหมือนการกระทำที่ต้องเกิดขึ้น มีการกระทำหลายอย่างที่สามารถทำได้เช่นส่งอีเมลหรือแนบรูปถ่ายไปยังอีเมลหรือแม้กระทั่งเปิดตัวแอปพลิเคชัน กระบวนการทำงานแบบลอจิคัลของการสร้างเจตนามักเป็นดังนี้: สร้างเจตนา เพิ่มตัวเลือกเจตนา -> ตัวอย่าง เราส่งความตั้งใจประเภทใดไปยังระบบปฏิบัติการหรือคุณลักษณะใด ๆ ที่เกี่ยวข้องกับความตั้งใจนั้นเช่นสตริงข้อความหรือบางสิ่งที่ถูกส่งผ่านไปพร้อมกับเจตนาค เรียกใช้เจตนา
ตัวอย่างชีวิตจริง: สมมติว่าฉันตื่นนอนตอนเช้าและฉัน "ตั้งใจ" เพื่อไปที่ห้องน้ำ ก่อนอื่นฉันจะต้องคิดก่อนว่าจะไปห้องน้ำ แต่นั่นไม่ได้ทำให้ฉันไปห้องน้ำจริงๆ ฉันจะต้องบอกให้สมองของฉันลุกจากเตียงก่อนแล้วเดินไปที่ห้องน้ำแล้วปล่อยจากนั้นไปแล้วล้างมือแล้วไปเช็ดมือ เมื่อฉันรู้ว่าฉันจะไปที่ไหนฉันจะส่งคำสั่งเพื่อเริ่มต้นและร่างกายของฉันจะดำเนินการ
ความตั้งใจที่รอดำเนินการคืออะไร?
ต่อจากตัวอย่างในชีวิตจริงสมมติว่าฉันต้องการอาบน้ำ แต่ฉันต้องการอาบน้ำหลังจากที่ฉันแปรงฟันและกินอาหารเช้า ดังนั้นฉันรู้ว่าฉันจะไม่อาบน้ำจนกว่าอย่างน้อย 30-40 นาที ฉันยังมีในหัวของฉันที่ฉันต้องเตรียมเสื้อผ้าของฉันแล้วเดินขึ้นบันไดกลับไปที่ห้องน้ำแล้วเปลื้องผ้าแล้วอาบน้ำ อย่างไรก็ตามสิ่งนี้จะไม่เกิดขึ้นจนกว่าจะผ่านไป 30-40 นาที ตอนนี้ฉันมีความตั้งใจที่จะอาบน้ำ ใช้เวลา 30-40 นาที
นั่นคือความแตกต่างระหว่างเจตนาที่รอดำเนินการและความตั้งใจปกติ สามารถสร้าง Intent ปกติได้โดยไม่ต้องมี Intent ที่รอดำเนินการอย่างไรก็ตามเพื่อที่จะสร้าง Intent ที่รอคุณจะต้องทำการเซ็ตอัพ Intent ก่อน
PendingIntent
นั้นเป็นวัตถุที่ล้อมIntent
วัตถุอื่น จากนั้นสามารถส่งผ่านไปยังแอปพลิเคชันต่างประเทศที่คุณอนุญาตให้แอปนั้นมีสิทธิ์ในการดำเนินการเช่นดำเนินการตามเจตนาราวกับว่าถูกเรียกใช้จากกระบวนการของแอปของคุณเอง (ได้รับอนุญาตและข้อมูลเฉพาะตัวเดียวกัน) เพื่อเหตุผลด้านความปลอดภัยคุณควรส่งผ่านความตั้งใจที่ชัดเจนไปยัง PendingIntent แทนที่จะเป็นนัย
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
ในภาษาง่าย ๆ
1. คำอธิบายของการกระทำที่ตั้งใจและเป้าหมายที่จะดำเนินการ ก่อนอื่นคุณต้องสร้างความตั้งใจและจากนั้นคุณจะต้องผ่านคลาสจาวาเฉพาะที่คุณต้องการเรียกใช้งานไปยัง Intent
2. คุณสามารถเรียกคลาส java เหล่านั้นซึ่งเป็นคลาสแอ็คชันคลาสของคุณโดย PendingIntent.getActivity, PendingIntent.getActivities (บริบท, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) และ PendingIntent getService (บริบท, int, เจตนา, int); ที่นี่คุณจะเห็นว่าความตั้งใจซึ่งมาจากขั้นตอนที่ 1
3. คุณควรจำไว้ว่า ... โดยการให้ PendingIntent ให้กับแอปพลิเคชันอื่นคุณกำลังให้สิทธิ์ในการดำเนินการตามที่คุณระบุ
นั่นคือสิ่งที่ฉันเรียนรู้หลังจากอ่านเป็นเวลานาน
PendingIntent ล้อมเจตนาทั่วไปด้วยโทเค็นที่คุณมอบให้กับแอปต่างประเทศเพื่อดำเนินการโดยได้รับอนุญาตจากคุณ สำหรับเช่น:
การแจ้งเตือนของแอปเพลงของคุณไม่สามารถเล่น / หยุดเพลงชั่วคราวหากคุณไม่ได้ให้การ
PendingIntent
ออกอากาศเพราะแอพเพลงของคุณได้READ_EXTERNAL_STORAGE
รับอนุญาตซึ่งแอปแจ้งเตือนไม่ การแจ้งเตือนเป็นบริการระบบ (ดังนั้นจึงเป็นแอปต่างประเทศ)
ตามชื่อแนะนำ .. รอการอนุมัติ
คุณสามารถจ่ายเงิน (ทำหลังจากผ่านไประยะหนึ่ง) มันทำงานได้ตามความตั้งใจอื่น ๆ .. มันเป็นวิธีการมอบงานของคุณให้กับแอพอื่นเพื่อทำงานในนามของคุณ
รอเจตนาระบุการดำเนินการที่จะใช้ในอนาคต ช่วยให้คุณสามารถส่งต่อเจตนาในอนาคตไปยังแอปพลิเคชันอื่นและอนุญาตให้แอปพลิเคชันนั้นดำเนินการตามเจตนานั้นราวกับว่าได้รับอนุญาตเหมือนกับแอปพลิเคชันของคุณไม่ว่าแอปพลิเคชันของคุณจะยังคงอยู่
เป็นโทเค็นที่คุณมอบให้กับแอปพลิเคชันต่างประเทศซึ่งอนุญาตให้แอปพลิเคชันต่างประเทศใช้การอนุญาตของแอปพลิเคชันของคุณเพื่อเรียกใช้งานโค้ดที่กำหนดไว้ล่วงหน้า
หากคุณให้ความตั้งใจแก่แอปพลิเคชันต่างประเทศและแอปพลิเคชันนั้นส่ง / เผยแพร่เจตนาที่คุณให้พวกเขาจะดำเนินการแสดงเจตนาด้วยสิทธิ์ของตนเอง แต่ถ้าคุณให้ความตั้งใจที่ค้างอยู่กับแอปพลิเคชันต่างประเทศที่คุณสร้างขึ้นโดยใช้สิทธิ์ของคุณเองแอปพลิเคชันนั้นจะดำเนินการตามเจตนาที่มีอยู่โดยใช้การอนุญาตของแอปพลิเคชันของคุณ
หากต้องการทำการออกอากาศผ่านจุดประสงค์ที่รอดำเนินการอยู่ดังนั้นขอให้ PendingIntent ผ่านทาง PendingIntent.getBroadcast () ในการทำกิจกรรมด้วยความตั้งใจที่รอดำเนินการคุณจะได้รับกิจกรรมผ่านทาง PendingIntent.getActivity ()
มันเป็นการกระทำที่ตั้งใจที่คุณต้องการที่จะดำเนินการ แต่ในเวลาต่อมา ลองคิดดูสิว่ามันเป็นการวางจุดประสงค์บนน้ำแข็ง เหตุผลที่ต้องการคือเนื่องจากต้องมีการสร้างและเปิดใช้งานจากบริบทที่ถูกต้องในแอปพลิเคชันของคุณ แต่มีบางกรณีที่ไม่สามารถใช้งานได้ในเวลาที่คุณต้องการเรียกใช้การกระทำเนื่องจากคุณอยู่นอกบริบททางเทคนิคของแอปพลิเคชัน ตัวอย่างทั่วไปสองตัวอย่างกำลังเรียกใช้กิจกรรมจากการแจ้งเตือนหรือ BroadcastReceiver
โดยการสร้าง PendingIntent ที่คุณต้องการใช้ในการเปิดตัวพูดกิจกรรมในขณะที่คุณมีบริบทให้ทำ (จากภายในกิจกรรมหรือบริการอื่น) คุณสามารถส่งวัตถุนั้นไปยังสิ่งภายนอกเพื่อเปิดส่วนของแอปพลิเคชันของคุณ ในนามของคุณ.
PendingIntent จัดเตรียมเครื่องมือสำหรับให้แอปพลิเคชันทำงานแม้หลังจากที่กระบวนการของพวกเขาออกไปแล้ว เป็นสิ่งสำคัญที่จะต้องทราบว่าแม้หลังจากที่แอปพลิเคชันที่สร้าง PendingIntent นั้นถูกฆ่าแล้ว Intent ยังคงสามารถทำงานได้ คำอธิบายของการกระทำที่ตั้งใจและเป้าหมายเพื่อดำเนินการกับมัน อินสแตนซ์ของคลาสนี้ถูกสร้างด้วย getActivity (บริบท, int, Intent, Int), getBroadcast (บริบท, int, Intent, Int), getService (บริบท int, Intent, Int); วัตถุที่ส่งคืนสามารถส่งไปยังแอปพลิเคชันอื่น ๆ เพื่อให้สามารถดำเนินการตามที่คุณอธิบายในนามของคุณได้ในภายหลัง
โดยการให้ PendingIntent ให้กับแอปพลิเคชันอื่นคุณกำลังให้สิทธิ์ในการดำเนินการตามที่คุณระบุราวกับว่าแอปพลิเคชันอื่นเป็นตัวคุณเอง (ด้วยสิทธิ์และตัวตนเดียวกัน) คุณควรระมัดระวังเกี่ยวกับวิธีการสร้าง PendingIntent: บ่อยครั้งเช่นเจตนาพื้นฐานที่คุณให้จะมีการตั้งชื่อส่วนประกอบอย่างชัดเจนให้เป็นหนึ่งในองค์ประกอบของคุณเองเพื่อให้แน่ใจว่าจะถูกส่งไปที่อื่น
PendingIntent นั้นเป็นเพียงการอ้างอิงถึงโทเค็นที่ดูแลโดยระบบที่อธิบายข้อมูลต้นฉบับที่ใช้เพื่อเรียกคืน ซึ่งหมายความว่าแม้ว่ากระบวนการของแอปพลิเคชันที่เป็นเจ้าของจะถูกฆ่าก็ตาม หากแอปพลิเคชันที่สร้างขึ้นในภายหลังเรียกคืน PendingIntent ชนิดเดียวกัน (การดำเนินการเดียวกันการกระทำที่ตั้งใจเดียวกันข้อมูลหมวดหมู่และส่วนประกอบและการตั้งค่าสถานะเดียวกัน) จะได้รับ PendingIntent ที่แสดงโทเค็นเดียวกันหากยังคงถูกต้องและสามารถ ดังนั้นโทรยกเลิก () เพื่อลบ
ความตั้งใจที่รอดำเนินการเป็นเจตนาที่ให้สิทธิ์ทั้งหมดแก่แอปพลิเคชันอื่นในการทำงานเฉพาะ เมื่อกิจกรรมหลักถูกทำลายระบบปฏิบัติการ Android จะคืนสิทธิ์จากกิจกรรมนั้น