アクティビティとサービスの間で大きなコンテンツを転送するために、別のプロセスでアクティビティとサービスの間で共有メモリを使用することを計画しました。
そのために、私は MemoryFile で見つけたすべての情報を読み、それをアクティビティ間で転送する方法と、具体的には Android での MemoryFile の使用とはこの stackoverflow エントリを読みます。
しかし、Android バージョン 4.xx で getParcelFileDescriptor (説明されているソリューションを使用) を呼び出すことができません。メソッドはもう存在しないようです。
それにもかかわらず、ParcelFileDescriptor をサービスに送信する次のコードにたどり着きました (疑似コードと見なしますが、実際には ruboto コードです)。
shm = MemoryFile.new("picture", 1000)
f = shm.getFileDescriptor()
p = ParcelFileDescriptor.dup( f)
b = Bundle.new()
b.putParcelable( "shm", p)
msg.setData( b)
service.send( msg)
共有メモリに適切にアクセスできることをテストするために、共有メモリに文字列を書き込んで、サービス側でそれを取得しようとしました。
それを行うには、次の(真のJava)コードがあります。
Parcelable p = msg.getData().getParcelable("shm");
ParcelFileDescriptor shm = (ParcelFileDescriptor) p;
FileDescriptor f = shm.getFileDescriptor();
if( f.valid()) {
FileInputStream in = new FileInputStream( f);
String s = readString( in); // this fail!
}
すべて問題ありません。f は有効ですが、受信した fileDisscriptor から読み取ることができません。次のようになります: java.io.IOException: read failed: EINVAL (無効な引数)
読み取り用のコードは次のとおりです。
public String readString(InputStream inputStream) throws IOException {
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String s = r.readLine();
return s;
}
だから2つの質問:
- 私は間違っていますか?(どちら側でも)
- または、#getParcelFileDescriptor から切断された MemoryFile は、2 つのプロセス間でメモリを共有する手段として使用できなくなりましたか?
この後者の場合、私はこのクラスに何の関心も見ません...
共有メモリを使用するための JNI コードについて言及している他の記事を見たことがありますが、その追加の複雑さは避けたいと思います。