Android Лучший способ хранить и обмениваться данными через приложение

Я делаю небольшое приложение для Android, которое запускает службу переднего плана, которая слушает и уведомляет пользователя всякий раз, когда приходит новое SMS-сообщение. Когда служба запускается, она регистрирует BroadcastReceiver с действием android.provider.Telephony.SMS_RECEIVED в IntentFilter и отменяет ее регистрацию при остановке. Приложение также получает пользовательские данные вместе со списком выбранных номеров из файла JSON во внутреннем хранилище, чтобы получатель мог отфильтровать, какой номер уведомлять пользователя. В моем MainActivity есть 3 кнопки: Start и Stop Service, а также кнопка Setting, которая перемещается в SettingActivity, которая отображает некоторую информацию о пользователе, а также список выбранных номеров и позволяет пользователю изменить его. Мой вопрос заключается в следующем: как лучше всего поделиться пользовательскими данными в приложении, чтобы все действия, а также службы и получатели могли получить к ним доступ? Я придумал и попробовал несколько способов:

  • Получение пользовательских данных из файла в MainActivity, где запускается приложение, и передача его через Intent другим: это хорошо работало при передаче данных из Activity в Activity, а также в Service, но, похоже, не работает с BroadcastReceiver, поскольку оно зарегистрировано для прослушивания на SMS_RECEIVED, а не на другую трансляцию, даже если я создаю новое намерение и транслирую его с помощью 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 и отменяет регистрацию при остановке, но получатель не будет получать пользовательские данные, которые я отправляю из службы через другое намерение и sendBroadcast. Можете ли вы обновить ответ, чтобы показать мне фиктивный код того, что вы имеете в виду? - person Trinh Minh Duc - FAID HN; 19.10.2020