android-apps-communicating
เมื่อวานน้อง ๆ ในทีมถามเรื่องการส่งข้อมูล
และการ share ข้อมูลภายใน Android application
มันมีวิธีการอะไรบ้างล่ะ ?

ดังนั้นจึงขอสรุปไว้แบบคร่าว ๆ ดังนี้ก็แล้วกัน
เนื่องจากมันมีวิธีการเยอะมากมายเหลือเกิน
มาดูกันเลย

วิธีการสามารถแบ่งได้เป็น 3 กลุ่มใหญ่ ๆ คือ

  1. ทำการส่งข้อมูลผ่านสิ่งเล็ก ๆ ที่เรียกว่า Intent
  2. ทำการเก็บข้อมูลไว้ที่ Application และ Singleton class
  3. ทำการบันทึกข้อมูลไว้สักที่ เพื่อใช้งานร่วมกัน (Data storage)

มาดูรายละเอียดของแต่ละกลุ่ม ว่าทำอย่างไรบ้าง ?

1. ส่งข้อมูลผ่าน Intent

เทียบง่าย ๆ ก็คือ request scope ของ web application นั่นเอง
ดังนั้น ถ้าระบบงานที่มี step เยอะ ๆ
และต้องเก็บข้อมูลในทุก ๆ หน้าไว้เสมอ อาจจะไม่เหมาะสมนะ

intent-filters@2x

ตัวอย่างของผู้ส่ง

ตัวอย่างของผู้รับ

คำอธิบาย
ข้อมูลที่ใส่ไปใน Intent นั้นสนับสนุนพวก primitive data type เท่านั้น
ถ้าต้องการส่งข้อมูลที่มีความซับซ้อน หรือ object แล้ว
จะต้องทำการ implements Parcelable ด้วยนะ

แต่แนะนำให้แปลงเป็น JSON string ด้วย Gson library
แล้วส่งผ่าน Intent ก็ได้นะ ง่ายกว่าไปทำ Pacelable เยอะเลย

2. เก็บข้อมูลไว้ที่ Application และ Singleton class

ส่วนใหญ่ผมจะใช้งาน Application มากกว่า
เพราะว่ามันสามารถต่อยอด และ ขยายกับแนวทางการพัฒนาอื่นๆ ได้มากกว่า
เช่นการนำพวก Bus และ Dependency Injection มาใช้งาน

การใช้งานผ่าน Application
มันคือการใช้งานผ่าน instance ของคลาส android.app.Application
ซึ่งจะถูกสร้างเมื่อเปิด app ขึ้นมานั่นเอง
มักใช้สำหรับการ share พวกสถานะ หรือ ข้อมูลที่จำเป็นต้องใช้กันทั้ง application (Global state)

ตัวอย่างของการสร้าง MyApplication สำหรับเก็บข้อมูลที่ต้องการใช้งาน

เมื่อต้องการกำหนดค่าบางอย่าง เพื่อใช้ใน Activity อื่น ๆ ให้ทำดังนี้

เมื่อต้องการดึงข้อมูลให้ทำดังนี้

แต่เท่านี้ยังไม่พอนะ ไม่เช่นนั้น app มันจะ crash
ด้วยปัญหา Class Not Found หรือหา class ไม่เจอนั่นเอง
ดังนั้นต้องเพิ่ม android:name เข้าไปที่ tag application
ซึ่งอยู่ในไฟล์ AndroidManifest.xml ดังนี้

3. ทำการบันทึกข้อมูลไว้สักที่ เพื่อใช้งานร่วมกัน (Data storage)

มันมีหลากหลายวิธีให้เลือก เช่น

  • ใช้งานพวก persistent ต่าง ๆ เช่น Share preference, SQLite และ File เป็นต้น
  • ใช้งานผ่าน Cloud storage/ Web storage นั่นคือผ่าน Network
  • ใช้งานผ่าน Content Provider

แต่ถ้าเป็นการส่งข้อมูลภายใน application
มักจะใช้งานผ่าน Shared Preference น่าจะเหมาะสมกว่า

ดังนั้นมาดูตัวอย่างการใช้งานกันหน่อยสิ
จะเก็บข้อมูลชนิด primitive ในรูปแบบ key-value

ตัวอย่างการใช้งาน Shard preference
ประกอบไปด้วยการบันทึกข้อมูลผ่าน SharedPreferences.Editor
อย่าลืม commit หลังจากกำหนดค่าด้วยนะครับ !!

และการดึงข้อมูล

เพียงเท่านี้ น่าจะทำให้เห็นภาพคร่าว ๆ

ของการส่งข้อมูลภายใน Android application กันบ้างนะ
ที่สำคัญข้อมูลอะไรที่มัน sensitive มาก ๆ เช่น password หรือ รหัสต่าง ๆ
ก็อย่าเก็บเป็น plain text ลงไปนะครับ
เพราะว่า มันไม่ปลอดภัยเลย ระวังกันไว้ด้วย !!

คำถาม
สงสัยกันไหมว่า Application มันแตกต่างกับ SharedPreference อย่างไร ?

Tags: