ความแตกต่างระหว่าง Intent และ PendingIntent


99

ฉันอ่านบทความบางบทความและดูเหมือนว่าทั้งคู่จะทำในสิ่งเดียวกันและฉันก็สงสัยว่าอะไรคือความแตกต่างระหว่างการเริ่มบริการแบบนั้น:

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

หรือเช่นนั้น:

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); 

ตามที่ฉันอ่านทั้งสองสิ่งนี้ทำสิ่งเดียวกันหากในบริการคุณส่งคืนพารามิเตอร์ START_STICKY;


ไม่มีความแตกต่าง อะไรทำให้คุณคิดว่าจะมี? ในกรณีแรกคุณจะเริ่มต้นตอนนี้และในครั้งที่สองคุณเพียงแค่ตั้งเวลา / ข้อมูลในภายหลัง
Squonk

อาจซ้ำกันได้ของAndroid PendingIntent คืออะไร?
James Moore

คำตอบ:


154

เจตนา

Android Intent เป็นวัตถุที่มีเจตนากล่าวคือข้อความจากส่วนประกอบหนึ่งไปยังส่วนประกอบอื่นไม่ว่าจะอยู่ภายในหรือภายนอกแอปพลิเคชัน Intent สามารถสื่อสารข้อความระหว่างองค์ประกอบหลักสามส่วนของแอปพลิเคชัน ได้แก่ กิจกรรมบริการและ BroadcastReceivers

เจตนาเองซึ่งเป็นวัตถุเจตนาเป็นโครงสร้างข้อมูลแบบพาสซีฟ มีคำอธิบายที่เป็นนามธรรมของการดำเนินการที่จะดำเนินการ

ตัวอย่างเช่นสมมติว่าคุณมีกิจกรรมที่ต้องเปิดโปรแกรมรับส่งอีเมลและส่งอีเมล ในการดำเนินการนี้กิจกรรมของคุณจะส่ง Intent พร้อมการดำเนินการACTION_SENDพร้อมกับตัวเลือกที่เหมาะสมไปยัง Android Intent Resolver:

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

ตัวเลือกที่ระบุจะให้อินเทอร์เฟซที่เหมาะสมสำหรับผู้ใช้ในการเลือกวิธีการส่งข้อมูลอีเมลของคุณ

ความตั้งใจที่ชัดเจน

// 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);

เจตนาโดยนัย

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

// Starts Implicit Activity
   startActivity(i); 

ความตั้งใจที่รอดำเนินการ

PendingIntent คือโทเค็นที่คุณมอบให้กับแอปพลิเคชันต่างประเทศ (เช่น NotificationManager, AlarmManager, AppWidgetManager บนหน้าจอหลักหรือแอปพลิเคชันของบุคคลที่สามอื่น ๆ ) ซึ่งอนุญาตให้แอปพลิเคชันจากต่างประเทศใช้สิทธิ์ของแอปพลิเคชันของคุณเพื่อเรียกใช้โค้ดที่กำหนดไว้ล่วงหน้า

การให้ PendingIntent กับแอปพลิเคชันอื่นแสดงว่าคุณให้สิทธิ์ในการดำเนินการตามที่คุณระบุไว้ราวกับว่าแอปพลิเคชันอื่นเป็นตัวคุณเอง (ด้วยสิทธิ์และข้อมูลประจำตัวเดียวกัน) ด้วยเหตุนี้คุณควรระมัดระวังเกี่ยวกับวิธีการสร้าง PendingIntent: เกือบตลอดเวลาตัวอย่างเช่น Intent พื้นฐานที่คุณจัดหาควรมีการตั้งชื่อองค์ประกอบอย่างชัดเจนเป็นหนึ่งในองค์ประกอบของคุณเองเพื่อให้แน่ใจว่าจะถูกส่งไปที่นั่นในที่สุดและไม่มีที่อื่น

ตัวอย่างเจตนาที่รอดำเนินการ: http://android-pending-intent.blogspot.in/

ที่มา: Android IntentsและAndroid Pending Intents

หวังว่านี่จะช่วยได้


26

PendingIntentIntentเป็นเสื้อคลุมของ แอปต่างประเทศที่ได้รับPendingIntentไม่ทราบเนื้อหาของซึ่งเป็นห่อโดยIntent PendingIntentภารกิจของแอปต่างประเทศคือการส่งเจตนากลับไปยังเจ้าของเมื่อตรงตามเงื่อนไขบางประการ (ตัวอย่างเช่นสัญญาณเตือนพร้อมกำหนดเวลาหรือการแจ้งเตือนด้วยการคลิก ... ) เจ้าของเป็นผู้กำหนดเงื่อนไข แต่ประมวลผลโดยแอปต่างประเทศ (ตัวอย่างเช่นสัญญาณเตือนการแจ้งเตือน)

หากแอปต่างประเทศส่งเจตนาไปยังแอปของคุณหมายความว่าแอปต่างประเทศรู้เกี่ยวกับเนื้อหาของเจตนา และแอปต่างประเทศตัดสินใจที่จะส่งความตั้งใจแอปของคุณจะต้องประมวลผลเจตนาเพื่อให้เป็นไปตามเงื่อนไขบางประการ => แอปของคุณได้รับทรัพยากรประสิทธิภาพของระบบ


5

ข้อแตกต่างง่ายๆอีกประการหนึ่ง:

  • เจตนาปกติจะตายทันทีที่แอปถูกฆ่า

  • ความตั้งใจที่รอดำเนินการไม่มีวันตาย พวกเขาจะมีชีวิตอยู่ตราบเท่าที่จำเป็นโดยบริการเตือนภัยบริการระบุตำแหน่งหรือบริการอื่น ๆ


1

เริ่มบริการเป็นประจำผ่าน AlarmManager

เช่นเดียวกับกิจกรรมระบบ Android อาจยุติกระบวนการบริการได้ตลอดเวลาเพื่อประหยัดทรัพยากร ด้วยเหตุนี้คุณจึงไม่สามารถใช้บริการTimerTaskในบริการเพื่อให้แน่ใจว่ามีการดำเนินการเป็นประจำ

ดังนั้นสำหรับการจัดตารางเวลาที่ถูกต้องของบริการให้ใช้AlarmManagerคลาส

อัพเดท:

ดังนั้นจึงไม่มีความแตกต่างที่แท้จริงระหว่างทั้งสอง แต่ขึ้นอยู่กับว่าคุณต้องการเพื่อให้แน่ใจว่าการดำเนินการของการให้บริการหรือไม่คุณสามารถตัดสินใจว่าจะใช้เป็นสำหรับอดีตไม่มีการรับประกันและสำหรับต่อมาก็คือ

ข้อมูลเพิ่มเติมได้ที่AndroidServices


2
สิ่งนี้ไม่ได้ตอบคำถามของ OP ซึ่งก็คือ "อะไรคือความแตกต่าง" ระหว่างการเริ่มบริการโดยตรงกับการเริ่มบริการโดยมีเสียงเตือน นอกจากนี้ OP อาจเห็นบทความที่คุณเชื่อมโยงเนื่องจากรหัสในบทความเกือบจะเหมือนกับที่ OP โพสต์ไว้
Squonk

คุณหมายถึงการเริ่มบริการจาก AlarmManager ปลอดภัยกว่าและมีโอกาสถูกฆ่าน้อยกว่าจากกิจกรรมหรือไม่? ผมคิดว่าไม่ถูกต้อง คุณช่วยอธิบายได้ไหม. @VedPrakash. ยิ่งไปกว่านั้นฉันคิดว่าบริบทที่คุณส่งผ่านในขณะที่สร้างความตั้งใจที่จะเริ่มบริการนั้นสำคัญกว่า การใช้บริบทของแอปพลิเคชัน (getApplicationContext ()) แทนที่จะเป็นกิจกรรม (สิ่งนี้) น่าจะปลอดภัยกว่า
Parth Kapoor

@ Eu. ดร. ฉันขอแนะนำให้คุณใช้ตัวจัดการการเตือนภัยที่จะถูกกระตุ้นทุกครั้งที่ X ... ดำเนินงาน .. ทำไม? เนื่องจากหากคุณใช้บริการอาจถูกปิดในบางจุดและคุณอาจจะข้ามการอัปเดตบางอย่างในช่วงเวลาหนึ่ง (ไม่ทราบ) สำหรับข้อสงสัยในบริบทอย่าใช้getApplicationContext()หรือใช้เมื่อคุณต้องการอย่างเคร่งครัดเพียงอ่าน - เมื่อจะเรียกกิจกรรมบริบทหรือบริบทของแอปพลิเคชัน ( stackoverflow.com/questions/7298731/… )
My God

1

ตามหน้าที่ไม่มีความแตกต่าง

ความหมายของ PendingIntent คือคุณสามารถจัดการกับแอปพลิเคชันอื่น ๆ ที่สามารถใช้งานได้ในภายหลังราวกับว่าแอปพลิเคชันอื่นเป็นตัวคุณเอง นี่คือคำอธิบายที่เกี่ยวข้องจากเอกสาร :

การให้ PendingIntent กับแอปพลิเคชันอื่นแสดงว่าคุณให้สิทธิ์ในการดำเนินการตามที่คุณระบุไว้ราวกับว่าแอปพลิเคชันอื่นเป็นตัวคุณเอง (ด้วยสิทธิ์และข้อมูลประจำตัวเดียวกัน) ด้วยเหตุนี้คุณควรระมัดระวังเกี่ยวกับวิธีการสร้าง PendingIntent: เกือบตลอดเวลาตัวอย่างเช่น Intent พื้นฐานที่คุณจัดหาควรมีการตั้งชื่อองค์ประกอบอย่างชัดเจนเป็นหนึ่งในองค์ประกอบของคุณเองเพื่อให้แน่ใจว่าจะถูกส่งไปที่นั่นในที่สุดและไม่มีที่อื่น

PendingIntent นั้นเป็นเพียงการอ้างอิงไปยังโทเค็นที่ดูแลโดยระบบซึ่งอธิบายถึงข้อมูลดั้งเดิมที่ใช้ในการดึงข้อมูล

ดังนั้น PendingIntent จึงเป็นเพียงการอ้างอิงถึงข้อมูลที่แสดงถึงเจตนาดั้งเดิม (ที่ใช้ในการสร้าง PendingIntent)


4
การบอกว่ามีหน้าที่ไม่มีความแตกต่างไม่ถูกต้อง ถ้าฟังก์ชั่นของทั้งสองเหมือนกันแล้วทำไมต้องมีสองอันดับที่ 1 ความแตกต่างที่สำคัญที่สุดใน PendingIntent นั้นดำเนินการโดยคอมโพเนนต์ระยะไกล (Like NotificationManager) ด้วยสิทธิ์เดียวกับส่วนประกอบที่ส่งมอบ (สิ่งที่สร้างการแจ้งเตือน)
Aniket Thakur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.