Передача информации в HostApduService из другого контекста

Это было задано ранее без ответов, поэтому я постараюсь сформулировать вопрос немного по-другому. Каковы различные способы передачи некоторых данных на Android Service не будучи в состоянии связать это или начать это непосредственно?

Вот проблема - у меня есть HostApduService это запускается операционной системой при каждой транзакции карты NFC. Требуется разрешение android.permission.BIND_NFC_SERVICE, что является разрешением системы, поэтому мое приложение не может привязаться к нему. Я не хочу оставлять данные в покое, поэтому все, что записывается на диск, не допускается. Я подумал о нескольких возможных решениях, но они либо грязные, либо небезопасные:

  1. Поместите данные в SharedPreferences нашего приложения. Это представляет проблему DAR.
  2. Трансляция информации на Service, HostApduService выполняется в течение всей транзакции карты, поэтому я не могу надежно рассчитать время трансляции, чтобы достичь службы, прежде чем она начнет работать.
  3. Поместите информацию, которую я хочу передать в static поле где-то Это грязно и может вызвать проблемы с параллелизмом, но это то, что я сейчас использую.

Есть другие идеи? Заранее спасибо.

1 ответ

Я думаю, что этот вопрос сводится к другому вопросу:

Как бы вы хранили (постоянные) данные в привязанном сервисе?

Служба HCE является связанной службой, поэтому она гарантированно будет работать, пока существует ее вызывающий контекст (см. Здесь). В результате любые данные, которые вы храните в службе (→ переменные, которые существуют в ОЗУ), будут существовать только в течение срока службы службы и больше не будут доступны после перезапуска службы.

Следовательно, привязка к сервису и установка некоторых значений в сервисе не будут работать надежно, даже если вы можете подключиться к сервису HCE. Та же проблема относится к данным, которые вы передаете в службу.

Аналогичная проблема существует с хранением значений в статических полях. Эти поля существуют только до тех пор, пока их декларирующий контекст (т. Е. Класс, в котором они объявлены) загружен в память виртуальной машины. Поскольку виртуальная машина может быть уничтожена в любое время, когда служба не используется, и на переднем плане не отображается активность приложения, вы не можете быть уверены, что данные, помещенные в статические поля, сохранятся на протяжении всего времени, в котором они вам нужны.

Таким образом, единственный надежный способ хранения ваших данных - это использовать технологию постоянного хранения, которая заключается либо в использовании механизма SharedPreferences, либо в использовании поставщика контента (который поддерживается базой данных в постоянном хранилище), либо для непосредственного хранения данных в файлах. Я думаю, лучшее, что вы могли бы сделать, это хранить данные в файловой системе в зашифрованном виде. Однако это приводит вас к другой проблеме: как (безопасно) хранить ключ шифрования. Но вы можете решить эту проблему с помощью хранилища ключей Android (см. Здесь и здесь).

Другие вопросы по тегам