使用姜饼2.3.4 API 10级。
启动完成后我将启动服务。为此,我添加了一个启动服务的广播接收器。我在启动程序中使用相同的服务。我试图通过向intent添加额外的参数来绑定到服务。通过广播回复从服务中获取结果。
问题是当它第一次绑定时,服务上的onbind()被触发。进一步的绑定不会对服务调用onBind()。我认为问题在于启动后直接启动服务。当我没有在bootup中启动服务并让活动使用context.bind_auto_create启动它时,它确实会按预期运行。
我唯一想到的解决方案是更改服务的onunbind()并在服务的onrebind()调用中发出onbind()。我不喜欢这个解决方案,因为它可能会在以后的android版本中中断,导致onbind()方法被调用两次。
所以为什么不在启动完成后启动的服务上触发后续绑定。任何其他优雅的解决方案都是受欢迎的。
注:我已经在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>
当我绑定到服务时:
意图意图=新意图(工作意图);
intent.putextra(“param”,param);
context.registerReceiver (broadcastReceiver, new IntentFilter("com.organization.android.WORK_RESULT"));
context.bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
}
当我得到结果时:
context.unbindService(mConnection);
context.unregisterReceiver (broadcastReceiver);
最佳答案
从绑定到服务的文档:
多个客户端可以同时连接到服务。然而,
系统调用服务的onbind()方法来检索ibinder
只有当第一个客户端绑定时。然后,系统会提供相同的
向绑定的任何其他客户端发送,而不调用onbind()
再一次。
此行为不会改变,因此重写onunbind以返回true,然后在onrebind期间调用onbind的方法完全可以,尽管原始绑定仍将发送到客户端,而不是在新的onbind调用中生成的任何新绑定。(也就是说,你真的不应该调用onbind,而应该将onrebind作为一个单独的案例来处理)
关于android - 后续的onBind()调用不会被触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11191693/