4

これは以前に質問されたもので、回答がなかったので、質問の言い回しを少し変えてみます。Service自分でバインドしたり起動したりせずに、Android にデータを渡すさまざまな方法は何ですか?

これが問題HostApduServiceです-NFCカードトランザクションごとにオペレーティングシステムによって開始される. システム権限である権限が必要なandroid.permission.BIND_NFC_SERVICEため、アプリケーションはそれにバインドできません。データを保存したくないので、ディスクに書き込まれるものは何でも構いません。いくつかの可能な解決策を考えましたが、それらは厄介であるか、安全ではありません。

  1. アプリの SharedPreferences にデータを入れます。これにより、DAR の問題が発生します。
  2. に情報をブロードキャストしますService。はカード トランザクションのHostApduService間実行されるため、サービスが機能し始める前にブロードキャストがサービスに到達するタイミングを確実に計ることはできません。
  3. 渡したい情報をstaticどこかのフィールドに入れます。これは面倒で、並行性の問題を引き起こす可能性がありますが、私が現在使用しているものです。

他のアイデアはありますか?前もって感謝します。

4

1 に答える 1

2

この質問は別の質問に帰着すると思います:

バインドされたサービス内に (永続的な) データをどのように保存しますか?

HCE サービスはバインドされたサービスであるため、呼び出しコンテキストが存在する間のみ実行が保証されます (こちらを参照)。その結果、サービス内に保存するデータ (→ RAM に存在する変数) は、サービスの存続期間中のみ存在し、サービスの再起動後は使用できなくなります。

したがって、HCE サービスにバインドできたとしても、サービスへのバインドとサービス内の値の設定は確実に機能しません。同じ問題が、サービスにブロードキャストするデータにも当てはまります。

同様の問題は、静的フィールドに値を格納する場合にも存在します。これらのフィールドは、宣言コンテキスト (つまり、宣言されているクラス) が仮想マシンのメモリにロードされている間だけ存在します。サービスが使用されておらず、アプリのアクティビティがフォアグラウンドに表示されていないときはいつでも VM を強制終了できるため、静的フィールドに入力したデータが、必要な期間全体にわたって存続することを確認することはできません。

したがって、データを保存するための唯一の信頼できる方法は、永続ストレージ テクノロジを使用することです。これは、SharedPreferences メカニズムを使用するか、コンテンツ プロバイダー (永続ストレージ上のデータベースに支えられている) を使用するか、データをファイルに直接保存することです。あなたができる最善のことは、暗号化されたファイルシステムにデータを保存することだと思います. ただし、これにより別の問題が発生します。暗号化キーを (安全に) 格納する方法です。しかし、Android キー ストアを使用すると、その問題を適切に解決できる可能性があります (ここここを参照)。

于 2014-08-10T07:33:45.383 に答える