1

アクティビティからサービスをバインドし、そのメソッドを呼び出す可能性を取得しようとしています。これらは異なるアプリケーション(apk)にありますが、同じsharedUserIdとプロセスを使用します。

彼らは同じプロセスを使用しているので、私はAIDLを使用する義務がありますか、それともローカルサービスのような古典的なIBinderを使用できますか(Android Developerサンプルで説明されています)?

私は両方を試しました。AIDLは正常に機能し、ローカルサービスのメソッドは機能しません。ClassCastExceptionがあります:

E/AndroidRuntime(17511): java.lang.ClassCastException: com.example.app.MyService$LocalBinder cannot be cast to com.example.app.MyService$LocalBinder

この方法を使用して、共通の「共有」プロセスで2つのアプリを使用してサービスを呼び出すことはできますか?または、この共有プロセスを使用するには、AIDLのようなIPCメソッドが必要ですか?

従来のIBinderを使用したい場合は、アプリケーションを可能な限りシンプルに保つためです。

あなたが私を助けてくれて、私の悪い英語をお詫びしてくれることを願っています;-)

4

2 に答える 2

0

問題は次のようなものだと思います。sharedUserIdを使用し、アプリケーションが同じプロセスで実行されている場合でも、サービスとアプリケーションは異なるパッケージに含まれているため、サービスのメソッドをローカルで呼び出すことはできません。したがって、クライアントアプリケーションでプロキシを作成するAIDLのみを使用できます。

于 2012-11-02T16:23:41.413 に答える
0

問題は、各アプリに独自のCLASSES.DEXを含む独自のAPKがあり、クラスとインターフェースがアプリ間で共有されていないことです。App1.apk/com.example.Class1とは異なるタイプと見なされApp2.apk/com.example.Class1ます。それらが同一であるかどうかは関係ありません。

これに対処する方法はいくつかあります。

1)お気づきのとおり、AIDLを使用できます。これは最も効率の悪いメカニズムであり、明らかにAIDL互換タイプのみに制限されます。

2)JavaリフレクションAPIを使用できます。これは効率の点ではAIDLよりも優れていますが、もちろん構文はそれほど優れていません。

3)カスタムクラスの読み込みを使用して、両方のアプリが同じタイプにアクセスできるように、なんらかの方法でそれを調整することができます。あなたがやろうとしていることにとって、これはそれが価値があるよりももっと厄介になるでしょう。

于 2014-08-09T23:27:21.760 に答える