Передача информации в HostApduService из другого контекста
Это было задано ранее без ответов, поэтому я постараюсь сформулировать вопрос немного по-другому. Каковы различные способы передачи некоторых данных на Android Service
не будучи в состоянии связать это или начать это непосредственно?
Вот проблема - у меня есть HostApduService
это запускается операционной системой при каждой транзакции карты NFC. Требуется разрешение android.permission.BIND_NFC_SERVICE
, что является разрешением системы, поэтому мое приложение не может привязаться к нему. Я не хочу оставлять данные в покое, поэтому все, что записывается на диск, не допускается. Я подумал о нескольких возможных решениях, но они либо грязные, либо небезопасные:
- Поместите данные в SharedPreferences нашего приложения. Это представляет проблему DAR.
- Трансляция информации на
Service
,HostApduService
выполняется в течение всей транзакции карты, поэтому я не могу надежно рассчитать время трансляции, чтобы достичь службы, прежде чем она начнет работать. - Поместите информацию, которую я хочу передать в
static
поле где-то Это грязно и может вызвать проблемы с параллелизмом, но это то, что я сейчас использую.
Есть другие идеи? Заранее спасибо.
1 ответ
Я думаю, что этот вопрос сводится к другому вопросу:
Как бы вы хранили (постоянные) данные в привязанном сервисе?
Служба HCE является связанной службой, поэтому она гарантированно будет работать, пока существует ее вызывающий контекст (см. Здесь). В результате любые данные, которые вы храните в службе (→ переменные, которые существуют в ОЗУ), будут существовать только в течение срока службы службы и больше не будут доступны после перезапуска службы.
Следовательно, привязка к сервису и установка некоторых значений в сервисе не будут работать надежно, даже если вы можете подключиться к сервису HCE. Та же проблема относится к данным, которые вы передаете в службу.
Аналогичная проблема существует с хранением значений в статических полях. Эти поля существуют только до тех пор, пока их декларирующий контекст (т. Е. Класс, в котором они объявлены) загружен в память виртуальной машины. Поскольку виртуальная машина может быть уничтожена в любое время, когда служба не используется, и на переднем плане не отображается активность приложения, вы не можете быть уверены, что данные, помещенные в статические поля, сохранятся на протяжении всего времени, в котором они вам нужны.
Таким образом, единственный надежный способ хранения ваших данных - это использовать технологию постоянного хранения, которая заключается либо в использовании механизма SharedPreferences, либо в использовании поставщика контента (который поддерживается базой данных в постоянном хранилище), либо для непосредственного хранения данных в файлах. Я думаю, лучшее, что вы могли бы сделать, это хранить данные в файловой системе в зашифрованном виде. Однако это приводит вас к другой проблеме: как (безопасно) хранить ключ шифрования. Но вы можете решить эту проблему с помощью хранилища ключей Android (см. Здесь и здесь).