作成した一連のアプリケーションがあります。これらのアプリケーションの1つは、基本的に「ホーム画面」であるアクティビティであり、他のアプリケーションにはすべて、私が作成した一連のサービスが含まれています。
メインアプリケーションのアクティビティには、電話にインストールされている作成したカスタムサービスのクラス名とパッケージ名のリストを表示するために使用しているArrayAdapterを使用するListViewがあります。表示されている各サービスは異なるアプリケーションでホストされていますが、これらのサービスはすべて、私が作成したものと同じ単純なAIDLインターフェイスを実装しています。
interface IExService {
void execute(in Bundle parameters, in ICallback callback);
}
メインアプリケーションには、次のようなバインダーとサービス接続があります。
private IExService _service=null;
private ServiceConnection _serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
_service=IExService.Stub.asInterface(binder);
}
public void onServiceDisconnected(ComponentName className) {
_service=null;
}
};
リストからアイテムを選択したら、その選択したサービスにバインドしたいと思います。リスト内のアイテムを選択するためのコードは次のようになります。ここで、MyServiceオブジェクトは選択されたサービスアイテムを表します。
private void executeService(MyService service) {
boolean isBound = bindService(new Intent(service.getClassName()), _serviceConnection, Context.BIND_AUTO_CREATE);
_service.execute(params, callback);
上記のコードでは、インテントは選択されたアイテムが保持するクラス名から形成されます。たとえば、クラス名は「com.example.exWidgetService.ExampleService」のようになります。このサービスは、そのアプリケーションのマニフェストファイルで次のように定義されます。
<service android:name="com.example.ExampleApplication.ExampleService">
<intent-filter>
<action android:name="com.test.HomeApplication.IExService"/>
</intent-filter>
</service>
ExampleApplicationは、サービスをホストするために作成したアプリケーションであり、HomeApplicationは、実際のAIDLファイルが定義されているメインメニューアプリケーションです。
これが私の問題です。BindService()呼び出しを行うと、呼び出しは成功し、サービスがバインドされたというtrueが返されます。ただし、_serviceオブジェクトは常にNULLです。したがって、サービスが正常にバインドされた(または返された)場合でも、バインダーがnullであるため、サービスメソッドを実行できません。DDMSは何も役に立たないようで、BindService()呼び出し中に問題がログに記録されていないようです。
同じAIDLサービスを実装する複数のアプリケーションがあるのは問題ですか?そうでない場合、実行時に特定のサービス実装を動的に呼び出す適切な方法はありますか?