Android Cara terbaik untuk menyimpan dan berbagi data melalui aplikasi

Saya membuat aplikasi Android kecil yang menjalankan Layanan Latar Depan yang mendengarkan dan memberi tahu pengguna setiap kali ada pesan SMS baru tiba. Saat Layanan dimulai, daftarkan BroadcastReceiver dengan tindakan android.provider.Telephony.SMS_RECEIVED di IntentFilter, dan batalkan pendaftarannya saat berhenti. Aplikasi juga mendapatkan data pengguna beserta daftar nomor yang dipilih dari file JSON di penyimpanan internal sehingga Penerima dapat memfilter nomor mana yang akan diberitahukan kepada pengguna. MainActivity saya memiliki 3 tombol, Mulai dan Hentikan Layanan, bersama dengan tombol Pengaturan yang berpindah ke SettingActivity yang menampilkan beberapa info pengguna serta daftar nomor yang dipilih dan memungkinkan pengguna untuk mengubahnya. Pertanyaan saya adalah: Apa cara terbaik untuk membagikan data pengguna ke seluruh aplikasi sehingga semua Aktivitas serta Layanan dan Penerima dapat mengaksesnya? Saya telah memikirkan dan mencoba beberapa cara:

  • Mendapatkan data pengguna dari file di MainActivity tempat aplikasi dimulai dan meneruskannya melalui Intent ke orang lain: ini berfungsi dengan baik ketika meneruskan data dari Aktivitas ke Aktivitas serta Layanan, tetapi tampaknya tidak berfungsi dengan BroadcastReceiver karena terdaftar untuk mendengarkan ke SMS_RECEIVED dan bukan Siaran lain meskipun saya membuat Intent baru dan menyiarkannya dengan startBroadcast
  • Membuat objek user menjadi statis: Saya mencoba membuat User menjadi publik statis sehingga dapat dipanggil oleh kelas lain ketika MainActivity selesai mengambil data dari file, pada dasarnya meletakkan public static User user di MainActivity dan memanggilnya dengan MainActivity.user di kelas lain, ini berfungsi bahkan dengan BroadcastReceiver tetapi saya tidak yakin apakah ini cara yang tepat untuk berbagi data ke seluruh aplikasi
  • Terakhir adalah mengambil data dari file ketika setiap Aktivitas atau Layanan dipanggil, artinya ketika setiap Aktivitas atau Layanan dipanggil, ia mendapatkan data lagi dari file JSON. Saya belum mencobanya tapi menurut saya ini mungkin berdampak pada kinerja serta konsistensi data di seluruh aplikasi.

Jadi apa cara yang tepat untuk menerapkan ini? Tolong beri saya beberapa saran. Terima kasih sebelumnya.


person Trinh Minh Duc - FAID HN    schedule 16.10.2020    source sumber


Jawaban (1)


Ada beberapa saran untuk ini:

1 - Anda dapat menyimpan data yang Anda perlukan dalam preferensi bersama, namun jika ini adalah data pribadi yang ingin Anda jaga kerahasiaannya (misalnya kata sandi, informasi identitas pribadi), Anda mungkin tidak ingin melakukan hal ini.

2 - Serupa dengan apa yang Anda lakukan dalam aktivitas, Anda dapat membuat layanan yang bertanggung jawab untuk mendapatkan data pengguna dari file dan menyimpannya hingga aplikasi dimatikan, misalnya -

public class UserDataStore()

Dengan cara ini Anda dapat membuat instance UserDataStore saat startup dan kemudian, melalui injeksi ketergantungan, menyebarkannya ke aplikasi Anda. Jadi, di mana pun Anda membuat layanan yang menangani peristiwa siaran, Anda cukup menambahkan UserDataStore sebagai parameter, dengan asumsi Anda membuat UserDataStore terlebih dahulu. misalnya -

public class BroadcastReceiverService(UserDataStore store)

Cara ini juga berarti bahwa BroadcastReceiverService Anda lebih dapat diuji karena Anda dapat meniru UserDataStore.

Contoh -

public class MainActivity() {

    UserDataStore store = new UserDataStore()

    BroadcastReceiverService broadcastService = new BroadcastReceiverService(store)

}

Kemudian di UserDataStore Anda -

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
    }  

}

Lalu terakhir di penerima siaran Anda

public class BroadcastReceiverService(UserDataStore store) {

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

}
person lhdev    schedule 16.10.2020
comment
Terima kasih atas jawaban Anda. Yang pertama akan saya periksa tetapi mungkin untuk proyek lain karena ada kata sandi yang disimpan dalam file. Yang kedua saya kurang paham, bisakah Anda menjelaskan lebih lanjut? - person Trinh Minh Duc - FAID HN; 16.10.2020
comment
Tentu! Jadi misalnya Anda dapat memiliki UserDataStore yang merupakan kelas yang memiliki User yang, saat aplikasi dimulai, Anda isi dengan semua infonya. Maka Anda hanya perlu memastikan bahwa ketika Anda membuat BroadcastRecieverService (atau kelas apa pun yang Anda miliki yang bertanggung jawab menangani siaran), Anda memasukkan UserDataStore baru ke dalamnya dan Anda akan dapat mengakses info Pengguna tanpa ada satu pun instance Pengguna yang dapat diakses secara global di aplikasi Anda. - person lhdev; 17.10.2020
comment
Maaf atas balasan yang terlambat, tapi saya masih belum mengerti. Saya memiliki Layanan yang dimulai dari MainActivity, pada awalnya mendaftarkan penerima yang mendengarkan RECEIVED_SMS dalam IntentFilter dan membatalkan pendaftaran ketika berhenti, tetapi Penerima tidak akan menerima data pengguna yang saya kirim dari Layanan melalui Intent lain dan sendBroadcast. Bisakah Anda memperbarui jawaban untuk menunjukkan kepada saya kode tiruan tentang apa yang Anda maksud? - person Trinh Minh Duc - FAID HN; 19.10.2020