1

私のアプリケーションでは、2つの別々のAPKがあります。最初のAPKからのアクティビティ(A1)はローカルサービスを開始し、このサービスによって提供されるメソッドを呼び出すことができます。その後、アクティビティA1は2番目のAPKから別のアクティビティ(A2)を開始します。A2アクティビティは、A1によって開始されたローカルサービスに接続しようとします。両方のアクティビティは、同じSharedUserIDを使用して同じプロセスで実行されています。LocalServiceのAPIの例に示されているように、サービスインターフェイスが提供されます。onBindのサービスメソッドは、メソッドgetService()を持つLocalBinderインスタンスを返します。A2のonServiceConnectedが呼び出されると、IBinderからMyService.LocalBinderにキャストしようとするとClassCastExceptionが発生しました。

デバッガーでは、A2アクティビティのonServiceConnectedのサービス引数がMyService.LocalBinderの正しいインスタンスであることがわかります。デバッガーでMyServiceのすべての属性を監視することもできますが、IBinderサービスをMyService.LocalBinderにキャストしようとすると、ClassCastException例外が発生しますか?回避策はありますか、それともAIDLを使用する必要がありますか?

public void onServiceConnected(ComponentName className, IBinder service)
{

  try
  {
       MyService.LocalBinder binder = (MyService.LocalBinder)service;
       m_IService = binder.getService();
  }
  catch(ClassCastException e)
  {

  }


 }
4

1 に答える 1

0

これについてはわかりませんが、MyService.LocalBinderをA1とA2の両方のapkにコンパイルしたと思います。同じ名前と同じコードを持っていても、2つの別個のクラスファイルであるため、この種の例外が発生します。これを機能させるには、クラスを共有ライブラリに移動する必要があると思います。


更新(コメントへの応答):インターフェースの使用がどのように異なるかわかりません。クラスと同様に、インターフェイスはクライアントとサーバーで異なる方法でインスタンス化されるため、キャスト例外が発生します。リフレクションを使用してこれを回避できる場合もありますが、そのアプローチはお勧めしません。AndroidOSまたはDalvikVMのいずれでもサポートされていない可能性があります。

最善の方法は、AIDLインターフェースを作成してみて、それが機能するかどうかを確認することだと思います。Androidが意図的に防止するように設計されていると思われることを実行するよりも10倍簡単な場合があります。

ただし、現在のアプローチを継続したい場合、考えられる方法の1つは、 ClassLoaderを使用してクライアントクラスをサーバーにロードすることです。これも機能させることができるかどうかはわかりません。

于 2010-12-24T15:32:36.837 に答える