Android วิธีที่ดีที่สุดในการเก็บและแชร์ข้อมูลผ่านแอพ

ฉันกำลังสร้างแอป Android ขนาดเล็กที่เรียกใช้ Foreground Service ซึ่งจะคอยฟังและแจ้งเตือนผู้ใช้ทุกครั้งที่มีข้อความ SMS ใหม่เข้ามา เมื่อบริการเริ่มต้น บริการจะลงทะเบียน BroadcastReceiver ด้วยการกระทำ android.provider.Telephony.SMS_RECEIVED ใน IntentFilter และยกเลิกการลงทะเบียนเมื่อหยุด แอปพลิเคชันยังได้รับข้อมูลผู้ใช้พร้อมกับรายการหมายเลขที่เลือกจากไฟล์ JSON ในที่จัดเก็บข้อมูลภายในเพื่อให้ผู้รับสามารถกรองหมายเลขที่จะแจ้งเตือนผู้ใช้ได้ MainActivity ของฉันมี 3 ปุ่ม ได้แก่ ปุ่มเริ่มและหยุดบริการ พร้อมด้วยปุ่มการตั้งค่าที่จะย้ายไปยัง SettingActivity ที่แสดงข้อมูลผู้ใช้บางส่วนตลอดจนรายการหมายเลขที่เลือกและอนุญาตให้ผู้ใช้เปลี่ยนได้ คำถามของฉันคือ: วิธีใดที่ดีที่สุดในการแบ่งปันข้อมูลผู้ใช้ทั่วทั้งแอปเพื่อให้กิจกรรมทั้งหมดตลอดจนบริการและผู้รับสามารถเข้าถึงได้ ฉันคิดและลองใช้วิธีสองสามวิธี:

  • รับข้อมูลผู้ใช้จากไฟล์ใน MainActivity ที่แอปพลิเคชันเริ่มต้นและส่งผ่าน Intent ไปยังผู้อื่น: สิ่งนี้ทำงานได้ดีเมื่อส่งข้อมูลจากกิจกรรมไปยังกิจกรรมรวมถึงบริการ แต่ดูเหมือนว่าจะไม่ทำงานกับ BroadcastReceiver เนื่องจากมีการลงทะเบียนเพื่อฟัง ไปที่ SMS_RECEIVED และไม่ใช่การออกอากาศอื่น แม้ว่าฉันจะสร้าง Intent ใหม่และออกอากาศด้วย startBroadcast
  • การทำให้วัตถุ user คงที่: ฉันพยายามทำให้ User สาธารณะเป็นแบบคงที่เพื่อให้สามารถเรียกใช้โดยคลาสอื่นได้เมื่อ MainActivity รับข้อมูลจากไฟล์เสร็จแล้ว โดยพื้นฐานแล้วให้ใส่ public static User user ใน MainActivity และเรียกมันด้วย MainActivity.user ในคลาสอื่น สิ่งนี้ใช้ได้แม้กับ BroadcastReceiver แต่ฉันไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องในการแบ่งปันข้อมูลตลอดทั้งแอปพลิเคชันหรือไม่
  • สุดท้ายคือการรับข้อมูลจากไฟล์เมื่อมีการเรียกใช้กิจกรรมหรือบริการแต่ละรายการ ซึ่งหมายความว่าเมื่อมีการเรียกใช้กิจกรรมหรือบริการแต่ละรายการ ก็จะรับข้อมูลจากไฟล์ JSON อีกครั้ง ฉันยังไม่ได้ลองใช้แต่ฉันคิดว่าอาจส่งผลต่อประสิทธิภาพและความสอดคล้องของข้อมูลทั่วทั้งแอป

ดังนั้นวิธีที่ถูกต้องในการดำเนินการนี้คืออะไร? กรุณาให้ฉันข้อเสนอแนะบางอย่าง. ขอบคุณพวกคุณล่วงหน้า


person Trinh Minh Duc - FAID HN    schedule 16.10.2020    source แหล่งที่มา


คำตอบ (1)


มีข้อเสนอแนะบางประการสำหรับสิ่งนี้:

1 - คุณสามารถจัดเก็บข้อมูลที่คุณต้องการในการตั้งค่าที่ใช้ร่วมกัน แม้ว่าหากนี่เป็นข้อมูลส่วนบุคคลที่คุณต้องการเก็บไว้เป็นส่วนตัว (เช่น รหัสผ่าน ข้อมูลที่สามารถระบุตัวบุคคลได้) คุณอาจไม่ต้องการทำเช่นนี้

2 - ในทำนองเดียวกันกับสิ่งที่คุณกำลังทำในกิจกรรมของคุณ คุณสามารถสร้างบริการที่รับผิดชอบในการรับข้อมูลผู้ใช้จากไฟล์และเก็บข้อมูลไว้จนกว่าแอปจะถูกปิด เช่น -

public class UserDataStore()

วิธีนี้คุณสามารถสร้างอินสแตนซ์ของ UserDataStore เมื่อเริ่มต้นระบบ จากนั้นจึงส่งต่อไปยังแอปของคุณผ่านการฉีดการขึ้นต่อกัน ดังนั้นทุกที่ที่คุณสร้างบริการที่จัดการกิจกรรมการออกอากาศ คุณสามารถเพิ่ม UserDataStore เป็นพารามิเตอร์ได้ โดยสมมติว่าคุณสร้าง UserDataStore ก่อน เช่น -

public class BroadcastReceiverService(UserDataStore store)

วิธีนี้ยังหมายความว่า BroadcastReceiverService ของคุณสามารถทดสอบได้มากขึ้น เนื่องจากคุณสามารถจำลอง UserDataStore ได้

ตัวอย่าง -

public class MainActivity() {

    UserDataStore store = new UserDataStore()

    BroadcastReceiverService broadcastService = new BroadcastReceiverService(store)

}

จากนั้นใน UserDataStore ของคุณ -

public class UserDataStore() {

// in here you want to get all your info about the user eg username, email etc

    String name = ""

    init {
        User user = getUserInfo()
        name = user.name
    }


    public String getUserName() {
       return name
    }  

}

ในที่สุดก็อยู่ในเครื่องรับกระจายเสียงของคุณ

public class BroadcastReceiverService(UserDataStore store) {

    public void receiveMessage(Message msg) {
        if(msg.username == store.name) // continue
    }

}
person lhdev    schedule 16.10.2020
comment
ขอบคุณสำหรับคำตอบ. อันแรกที่ฉันจะพิจารณา แต่อาจเป็นสำหรับโปรเจ็กต์อื่นเนื่องจากมีรหัสผ่านเก็บไว้ในไฟล์ อันที่สองฉันไม่ค่อยเข้าใจ คุณช่วยอธิบายเพิ่มเติมได้ไหม - person Trinh Minh Duc - FAID HN; 16.10.2020
comment
แน่นอน! ตัวอย่างเช่น คุณสามารถมี UserDataStore ซึ่งจะเป็นคลาสที่มี User ซึ่งเมื่อเริ่มต้นแอป คุณจะเติมข้อมูลทั้งหมดของพวกเขา จากนั้นคุณเพียงแค่ต้องแน่ใจว่าเมื่อคุณสร้าง BroadcastRecieverService (หรือคลาสใดก็ตามที่คุณมีซึ่งรับผิดชอบในการจัดการการออกอากาศ) คุณจะส่งผ่าน UserDataStore ใหม่ของคุณเข้าไปและคุณจะสามารถเข้าถึงข้อมูลผู้ใช้ได้โดยไม่ต้องมีอินสแตนซ์ผู้ใช้เพียงตัวเดียวที่ สามารถเข้าถึงได้ทั่วโลกในแอปของคุณ - person lhdev; 17.10.2020
comment
ขออภัยที่ตอบช้า แต่ฉันยังคงไม่เข้าใจ ฉันมีบริการที่เริ่มต้นจาก MainActivity เมื่อเริ่มต้นจะลงทะเบียนผู้รับซึ่งฟัง RECEIVED_SMS ใน IntentFilter และยกเลิกการลงทะเบียนเมื่อหยุด แต่ผู้รับจะไม่ได้รับข้อมูลผู้ใช้ที่ฉันส่งจากบริการผ่าน Intent อื่นและส่งBroadcast คุณสามารถอัปเดตคำตอบเพื่อแสดงรหัสจำลองว่าคุณหมายถึงอะไร - person Trinh Minh Duc - FAID HN; 19.10.2020