3

使用姜饼 2.3.4 api lvl 10。

启动完成后我正在启动服务。为此,我添加了一个启动服务的广播接收器。我在启动器中使用相同的服务。我正在尝试通过向 Intent 添加额外的参数来绑定服务。通过广播回复从服务中取回结果。

问题是当它第一次绑定时,服务上的 onBind() 会被触发。进一步的绑定不会调用服务上的 onBind()。我相信问题是服务直接在_boot之后启动。当我在启动时不启动服务并让活动使用 Context.BIND_AUTO_CREATE 启动它时,它的行为确实符合预期。

我想出的唯一解决方案是更改服务的 onUnbind() 并在服务的 onRebind() 调用中发出 onBind() 。我不喜欢这个解决方案,因为它可能会在以后的 android 版本中中断,导致 onBind() 方法被调用两次。

那么为什么在启动完成后启动的服务上不会触发后续绑定。欢迎任何其他优雅的解决方案。

PS:我已经在aidl中实现了它,但我不喜欢它,因为该服务将执行一些异步操作来返回数据,并且我必须在两个应用程序中添加aidl文件,这将添加导致代码臃肿的处理程序。

提前致谢。我的代码片段:

服务清单:

        <intent-filter>
            <action android:name="com.organization.android.ACTION_BOOT_COMPLETED" />
        </intent-filter>

         <intent-filter>
            <action android:name="com.organization.android.WORK_INTENT" />
        </intent-filter>
    </service>

    <receiver android:name=".CoreServiceReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" >
            </action>

            <category android:name="android.intent.category.HOME" >
            </category>
        </intent-filter>
    </receiver>

当我绑定到服务时:

意图意图 = 新意图(WORK_INTENT);intent.putExtra(“参数”,参数);

context.registerReceiver (broadcastReceiver, new IntentFilter("com.organization.android.WORK_RESULT"));
context.bindService(intent,mConnection, Context.BIND_AUTO_CREATE);        

}

当我得到结果时:

context.unbindService(mConnection);
context.unregisterReceiver (broadcastReceiver);
4

1 回答 1

7

From the documentation on binding to services:

Multiple clients can connect to the service at once. However, the system calls your service's onBind() method to retrieve the IBinder only when the first client binds. The system then delivers the same IBinder to any additional clients that bind, without calling onBind() again.

This behaviour will not change, so your method of overriding onUnbind to return true, and then calling onBind during onRebind is perfectly OK, although the original binding will still be sent to the client, not any new one that you may generate in your new call to onBind. (ie, you really shouldn't be calling onBind, but just handling onRebind as a seperate case)

于 2012-07-02T04:50:16.170 回答