1

他のアプリから呼び出せるサービスを提供したい。したがって、私はサービスと援助を持っています。しかし、このサービス (bindService) をバインドする別のアプリケーションを作成しようとすると、失敗を意味する false が返されます。これが私のコードです。

PS: context は既に getApplicationContext() を呼び出して取得した ApplicationContext です。

サービスをバインドしようとするコード

  private static ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            sService = XXXService.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            sService = null;
        }
    };

    private static synchronized XXXService getService(final Context context) {
        if (sService != null) {
            return sService;
        } else {
            intent.setClassName(context.getPackageName(), "com.xxx.someservice");
            if (context.bindService(intent, connection, Context.BIND_AUTO_CREATE)) {
                Log.i(TAG, "can bind");
            } else {
                Log.i(TAG, "can not bind");
            }
            return sService;
        }
    }

Androidマニフェスト

    <service android:name="com.xxx.someservice"
        android:process=":main"
        android:exported="true"/>
4

2 に答える 2

1

サービスにアクション名を使用することは私のために働きました。

例えば:

<service
    android:name="..."
    android:process="..." >
    <intent-filter>
        <action android:name="your-unique-action-name" />
    </intent-filter>
</service>

と:

...
bindService(new Intent("your-unique-action-name"), mServiceConnection, BIND_AUTO_CREATE);
于 2012-07-28T04:47:33.030 に答える
1

これは基本的に正しいようです。問題は、intent.setClassName(context.getPackageName(), "com.xxx.someservice"); だと思います。Intent.setClassName("Your.package.name.with.the.service", "com.xxx.someservice"); にする必要があります。. context.getPackageName() は現在のパッケージ名を返すため、独自のパッケージにバインドしようとしている場合は機能しますが、別のパッケージでバインドしようとしているように見えます。

于 2012-07-28T04:29:50.057 に答える