(別のプロセスで) リモート サービスを呼び出す簡単なテストを行ったところ、非常に驚くべきことがわかりました。
Process-A と Thread-A および Process-Bの2 つのプロセスがあると します。
プロセス A が実行中の場合、Thread-A と Thread-A は IPC - AIDL を使用してリモート void メソッドを呼び出します。プロセス B は、そのバインダー スレッドの 1 つに呼び出されたメソッドを実行させます。この間、プロセス A のスレッド A は待機します。Process-B の Binder スレッドがメソッド呼び出しを終了した後にのみ、Thread A に通知され、作業が再開されます。
私の質問: これは標準的な動作ですか? もしそうなら、それはなぜですか?void メソッドの場合、スレッド A は待機しません。(「oneway」はそれに関係していますか?)
私のコード:
プロセス A:
Log.d("Text", "Lior: Client: Thread: " + Thread.currentThread().getName() + " Passing parcelableClass: parcelableClass.hashCode: " + parcelableClass.hashCode());
for(int i = 0; i < 1; i++) {
_iRemoteServiceBinder.passObject(parcelableClass);
}
Log.d("Text", "Lior: Client: Thread: " + Thread.currentThread().getName() + " Passed parcelableClass: parcelableClass.hashCode: " + parcelableClass.hashCode());
プロセス B:
private final IRemoteServicePassObject.Stub _binder = new IRemoteServicePassObject.Stub() {
@Override
public void passObject(ParcelableClass parcelableClass)
throws RemoteException {
Log.d("Text", "Lior: Service: got pacelableClass: a: " + parcelableClass.getA() +
" b: " + parcelableClass.getB() +
" s: " + parcelableClass.getS() + " hashCode: " + parcelableClass.hashCode()
+ " Running thread: " + Thread.currentThread().getName());
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Log.d("Text", "Lior: Service: Finished: "
+ " Running thread: " + Thread.currentThread().getName());
私が得ている結果:
01-15 19:52:03.292: D/Text(22792): Lior: クライアント: スレッド: メイン 渡す parcelableClass: parcelableClass.hashCode: 1096225792 01-15 19:52:03.297: D/Text(23014): Lior: サービス: 取得したpaclableClass: a: 1 b: 2 s: String hashCode: 1096136272 実行中のスレッド: Binder スレッド #2 01-15 19:52:08.302: D/Text(23014): Lior: Service: Finished: 実行中のスレッド: Binder Thread #2 01-15 19:52:08.312: D/Text(23014): Lior: サービス: 実行中の新しいスレッド: LiorThread 01-15 19:52:10.342: D/Text(22792): Lior: クライアント: スレッド: メイン渡された parcelableClass: parcelableClass.hashCode: 1096225792