การโต้ตอบกับแอปพลิเคชั่นอื่นๆ ด้วย Implicit Intent ตอนที่ 1

เขียนเมื่อ 8 ปีก่อน โดย Ninenik Narkdee
implicit intent android intent

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ implicit intent android intent

ดูแล้ว 6,312 ครั้ง


App ในระบบ Android โดยทั่วไปแล้วจะมีหลาย activities ที่มีส่วนแสดงการติดต่อกับ
ผู้ใช้ โดยอนุญาตให้มีกระบวนการทำงานพิเศษบางอย่างเช่น การเปิดดูแผนที่ หรือการถ่ายรูป  
มีการทำงานจาก activity หนึ่งไปยังอีก activity หนึง โดยจะใช้งาน Intent เพื่อที่จะกำหนดให้
Intent ของ App ของเรานั้นทำงานบางสิ่ง    
เมื่อเรามีการส่ง Intent ไปในระบบโดยเรียกใช้คำสั่ง startActivity()
ระบบก็จะจะใช้ Intent เพื่อระบุ App คอมโพเนนท์และก็เรียกใช้งาน  
Intent ยังอนุญาตให้ App ของเราสามารถ เริ่มทำงาน activity ที่อยู่ภายใน App อื่นๆได้
 
Intent สามารถเริ่มการทำงานของคอมโพเนนท์โดยตรง (การระบุเจาะจง activity)  หรือแบบ
เรียกผ่าน Intent Action ให้เริ่มทำงานคอมโพเนนท์ใดๆ  (อย่างเช่น การถ่ายภาพ)
 
ในที่นี้เราจะแสดงให้เห็นถึงการใช้งาน Intent พี่แสดงการโต้ตอบอย่างง่ายเก็บ App อื่น อย่างเช่น
การเริ่มการทำงาน App อื่น การรับค่าผลลัพธ์จาก App อื่น และการทำให้ App ของเราตอบสนองหรือ
รองรับกับการร้องขอ Intent จาก App อื่นได้
 
 
ส่งผู้ใช้ไปยัง App ตัวอื่น
แสดงวิธีการแรียกใช้งาน Intent เพื่อที่จะไปเรียกให้เปิด App ตัวอื่นเพื่อทำงานได้
 
รับค่าผลลัพธ์จาก Activity
แสดงวิธีการเริ่มต้นทำงาน activity ตัวอื่นและรับค่าผลลัพธ์จาก activity นั้น
 
การอนุญาตให้ App ตัวอื่นทำการเรียกใช้งาน activity ของ App เราได้
แสดงวิธีการทำให้ activites ใน app ที่เราเปิดใช้งานอยู่สามารถถูกเรียกใช้งานจาก App ตัวอื่นผ่านทาง
การกำหนด Intent ที่ถูกกำหนดให้อนุญาตจาก App ของเรา
 
 
 

ส่งผู้ใช้ไปยัง App ตัวอื่น

 
หนึ่งในคุณสมบัติหลักของระบบ Android ก็คือ App มีความสามารถที่จะส่งผู้ใช้ไปยัง App ตัวอื่น
จากการเรียกใช้งาน ยกตัวอย่าง ถ้า App ของเรา มีที่อยู่ของคู่ค้าที่เราต้องการที่จะแสดงบนแผนที่
แต่เราไม่ได้สร้าง activity ในส่วนแสดงแผนที่ใน App ของเรา เพื่อแทนสิ่งนี้ เราสามารถสร้างการร้องขอเพื่อ
แสดงที่อยู่โดยการใช้งาน Intent  ระบบ Android ก็จะเรียกใช้งาน App ที่สามารถจะแสดงที่อยู่บนแผน
ที่แทนได้
 
 
ตามที่ได้อธิบายไว้ในตอนต้น ในตัวอย่างที่เราได้มีการสร้าง App เริ่มต้นอย่างง่าย  เราได้ใช้งาน Intent เพื่อที่จะสลับ
ใช้งานไปมาระหว่าง activites ใน App ของเรา  ซึ่งมองโดยปกติแล้วก็คือเราได้มีการใช้งาน explicit intent
มีการกำหนดชื่อ class ของคอมโพเนนท์ที่เราต้องการเริ่มการทำงาน อย่างไรก็ตามเมื่อเราต้องการที่จะแสดงการทำงาน
กับ App ตัวอื่นๆ อย่างเช่น การแสดงแผนที่ ในกรณีแบบนี้เราต้องใช้งาน Implicit Intent
 
 

การสร้าง Implicit Intent

 
Implicit intents จะไม่มีการประกาศชื่อ class ของคอมโพเนนท์เพื่อเริ่มทำงาน แต่จะประกาศผ่าน
action หรือการระบุสิ่งทีเราต้องการทำ อย่างเช่น เปิดดู แก้ไข ส่ง หรือ
เรียกดูบางสิ่ง Intent มักจะรวมข้อมูลที่มีความสัมพันธ์กับ action อยู่บ่อยๆ อย่างเช่น ที่อยู่ ที่เรา
ต้องการเปิดดู หรืออีเมลที่เราต้องการจะส่ง ซึ่งข้อมูลที่จะใช้งานร่วมนั้นก็จะขึ้นอยู่กับรูปแบบ Intent ที่เรา
ต้องการสร้าง อาจจะเป็น Uri หรือข้อมูลอื่น หรือบางกรณี Intent อาจจะไม่จำเป้นต้องใช้ข้อมูลร่วม
เลยก็เป็นได้เช่นกัน
 
 
สมมติข้อมูลของเราเป็นข้อมูล Uri นี่คือรูปแบบโครงสร้างของ Intent() อย่างง่าย ที่เราสามารถใช้เพื่อกำหนด
action และข้อมูลที่จะใช้
 
ตัวอย่างเช่น การสร้าง Intent เพื่อระบุค่าข้อมูล Uri เป็นหมายเลขโทรศัพท์
 
Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
 
เมื่อ App ของเราร้องขอมาที่ Intent นี้โดยเรียกผ่านคำสั่ง startActivity() 
App สำหรับการโทร ก็จะกำหนดค่าเริ่มต้นการโทรไปที่หมายเลขที่เราตั้งเอาไว้ แบบนี้เป็นต้น
 
และนี่คือตัวอย่างอีกคู่ของ Intent ที่มี action ของ Intent นั้นกับคู่ของข้อมูลที่จะใช้งาน
 
การเรียกดูแผนที่
 
// ตำแหน่งบนแผนที่อิงตามที่อยู่
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// หรือ ตำแหน่งบนแผนที่อิงตาม latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z คือค่าระดับการ zoom
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
 
การเรียกดูเว็บเพจ
 
Uri webpage = Uri.parse("https://www.ninenik.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
 
 
บางชนิดของ implicit intents อาจจำเป็นต้องใช้งานข้อมูลพิเศษ เพื่อให้ได้ชนิดข้อมูลที่แตกต่าง อย่าง
เช่น ข้อมูลประเภท String เราอาจจะเพิ่มค่าข้อมูลพิเศษมากกว่าหนึ่งข้อมูลโดยใช้คำสั่ง putExtra() 
 
 
โดยค่าเริ่มต้น ระบบจะพิจารณาจากค่า MIME type ที่เหมาะสม จำเป็นสำหรับ Intent นั้น บนพื้นฐานข้อมูล
ประเภท Uri นั้นรวมเข้ามาหรือไม่  สำหรับกรณีทีเราไม่ได้รวมข้อมูลประเภท Uri เข้ามาด้วย เราควรที่จะทำการ
กำหนดประเภทด้วยคำสั่ง setType() เพื่อให้ข้อมูลสัมพันธ์กับ Intent  การตั้งค่า MIME type เป็นผลดีในการ
รับค่า Intent ของ activities
 
นี่คืออีกตัวอย่างของ Intent ที่มีการเพิ่มข้อมูลพิเศษเพื่อกำหนดการออกแบบ action
 
ส่งอีเมลพร้อมแนบไฟล์
 
Intent emailIntent = new Intent(Intent.ACTION_SEND);
// Intent ไม่มีการใช้งานข้อมูล Uri, ดังนั้นจึงใช้วิธีกำหนด MIME type เป็น "text/plain" 
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // ผู้รับ
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// เราสามารถเพิ่มแบบหลายๆค่า โดยการส่งค่าข้อมูล Urk แบบ ArrayList 
 
สร้างกิจกรรมในปฏิทิน
 
Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
 
หมายเหตุ:: Intent สำหรับกิจกรรมในปฏิทินนี้รองรับเฉพาะ API ระดับ 14 ขึ้นไปเท่านั้น
 

 
หมายเหตุ:: เป้นสิ่งที่สำคัญที่เราจะควรกำหนด Intent ให้เฉพาะเจาะจงเท่าที่จะเป็นไปได้ ยกตัวอย่าง ถ้า
เราต้องการจะแสดงรูปภาพ โดยเรียนผ่าน ACTION_VIEW intent  เราก็ควรจะเจาะจง MIME type เป็น
image/*  สิ่งนี้จะช่วยป้องกัน App ที่สามารถจะเรียกดูประเภทข้อมูลอื่น (เช่น App แผนที่) 
ไม่ให้ถูกเรียกโดย Intent
 
 
 

ยืนยัน App ที่รับค่า Intent

 
แม้ว่าระบบ Android จะรับประกันอย่างแน่นอนว่า จะมี App ที่มากับเครื่องรองรับการเรียกใช้ Intent 
(เช่น App สำหรับการโทร,อีเมล หรือ ปฏิทิน) แล้วก็ตาม แราก็ยังควรที่จะทำการตรวจสอบเพื่อยืนยัน
ก่อนใช้งาน Intent
 
 
ข้อควรระวัง:: กรณีเราใช้งาน intent ที่ไม่มี App ที่อยู่ในเครื่องรองรับ App ของเราก็จะค้างหรือหยุดทำงาน
 
 
เพื่อยืนยันว่ามี activity ที่สามารถตอบสนองต่อ intent ได้ เราจะใช้คำสั่ง queryIntentActivities() เพื่อดูค่า
รายการของ activities ที่เข้ากับการทำงานของ Intent  ถ้าไม่เป็นค่าว่าง แสดงว่าเราสามารถใช้งาน intent 
น่ั้นได้อย่างปลอดภัย ยกตัวอย่าง
 
 
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
 
 
ถ้าค่า isIntentSafe มีค่าเป็น true แล้ว อย่างน้อยจะมีอยู่หนึ่ง App ที่ตอบสนองต่อ Intent แต่ถ้ามีค่าเป็น false
นั่นหมายความว่า ไม่มี App ที่จะทำงานกับ Intent ได้
 
หมายเหตุ:: เราควรจะทำการตรวจสอบนี้ในขึ้นตอนเริ่มต้นของ activity ในกรณีเราต้องการที่จะปิดคุณสมบิติ
ที่มีการเรียกใช้ Intent ก่อนที่ผู้ใช้จะเข้ามาใช้งาน  ถ้าเรารู้แน่ชัดว่า App ไหนที่สามารถจัดการกับ Intent ได้ 
เราสามารถที่จะจัดให้มีลิ้งค์สำหรับให้ผู้ใช้เข้าไปทำการดาวน์โหลด App นั้น 
 
 

เริ่ม Activity กับ Intent

 
หลังจากเราได้สร้าง Intent และกำหนดค่าข้อมูลพิ่มเติมแล้ว ก็ให้เรียกใช้คำสั่ง startActivity() เพื่อส่ง
ค่าไปยังระบบ เมื่อระบบระบุได้ว่า มี activity มากกว่าหนึ่งที่สามารถจัดการกับ Intetn ได้ ก็จะแสดง หน้าต่าง
dialog ให้ผู้ใช้เลือก App ที่ต้องการใช้งาน แต่ถ้ามีเพียง activity เดียวที่จัดการกับ Intent ได้ ระบบก็จะทำงาน
นั้นทันที
 
startActivity(intent);
 
นี่คือตัวอย่างทั้งหมด ที่แสดงให้เห็นวิธีการสร้าง Intetn สำหรับเรียกดูแผนที่ การยืนยัน App สำหรับจัดการ Intent
และเริ่มการทำงาน
 
// สร้าง Intent ส่งค่าข้อมูล Uri เป็นที่อยู่
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// ตรวจสอบเพื่อยืนยันว่ามี App ที่สามารถใช้งานร่วมกับ Intent ได้หรือไม่
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// ถ้าตรวจสอบและยืนยันแล้วว่ามี App ที่ทำงาน Intentได้
if (isIntentSafe) {
    startActivity(mapIntent);  // เริ่มทำงาน activity และ Intent
}
 

 

การแสดงตัวเลือกรายการ App

 
สังเกตว่าเมื่อเราเริ่มการทำงาน activity โดยส่งค่า Intent เข้าไปในคำสั่ง startActivity() แล้วมี App 
มากกว่าหนึ่ง App ที่รองรับการทำงานกับ Intent ผู้ใช้สามารถที่จะเลือก App ที่ต้องการใช้เป็นค่าเริ่มต้น
ทุกครั้ง (โดยการคลิกเลือกที่ checkbox ด้านล่างของ dialog *บางเครื่องอาจจะแสดงแตกต่างกันไป)
สิ่งนี้จะทำให้ผู้ใช้สะดวกให้การใช้งานกรณีต้องการใช้งาน App นั้นเสมอ โดยไม่ต้องเลือกทุกครั้ง
 
อย่างไรก็ตาม ถ้า action ที่ต้องการ สามารถทำงานได้จากหลายๆ App  และผู้ใช้อาจชอบที่จะใช้งาน App 
ในแต่ละครั้งต่างกันไป เช่น การ share ที่ผู้ใช้อาจจะมีหลากหลาย App ที่ต้องการใช้ share 
กรณีเช่นนี้ เราควรจะแสดง dialog สำหรับให้ผู้ใช้สามารถเลือกรายการ App ทุกครั้ง และไม่ให้ผู้ใช้สามารถ
กำหนดค่าเริ่มต้นของ App ได้
 
เพื่อแสดงตัวเลือก App ให้สร้าง Intent โดยการใช้คำสั่ง createChooser() แล้วส่งไปทำงานด้วยคำสั่ง
startActivity() ตัวอย่าง
 
 

Intent intent = new Intent(Intent.ACTION_SEND);
...

// ใช้ข้อมูลเป็น string resources สำหรับแสดงข้อความใน UI
// กำหนดชื่อหัวเรื่องให้กับตัวเลือก App เช่น  "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// สร้าง Intent เพื่อแสดงตัวเลือก App
Intent chooser = Intent.createChooser(intent, title);

// ตรวจสอบเพื่อยืนยันว่ามี activity ที่รองรับการทำงานของ Intent 
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}
 
 
 
จะแสดง dialog ที่มีรายการ App ที่ตอบรับการทำงานของ Intent จากการส่งค่า Intent ที่สร้าง
ด้วยคำสั่ง createChooser() และแสดงหัวเรื่องของ dialog ด้วยข้อความที่กำหนด

 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ











URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

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


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ