对于从已启动服务到片段的通信,我这样做了:
在服务机构
Handler handler;
public synchronized void setHandler(Handler h)
{
handler = h;
}
protected synchronized void sendMessage(int arg1)
{
Message m = handler.obtainMessage();
m.arg1=arg1;
handler.sendMessage(m);
}
在片段中:
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocalBinder binder = (LocalBinder) service;
mService = ("service_name") binder.getService();
mService.setHandler(serviceHandler);
}
和:
private Handler serviceHandler = new Handler(Looper.myLooper())
{
@Override
public void handleMessage(Message msg)
{
someF(msg);
}
};
private void someF(Message msg)
{
//some functions
}
在onDestroy中,我这样做了:
现在片段的ondestroy我这样做:
if (mIsBound) {
// Detach our existing connection.
App.getAppContext().unbindService(mConnection);
mIsBound = false;
}
从服务绑定和取消绑定的功能:
void doBindService() {
Appbike.getAppContext().bindService(new Intent(getActivity(), Bike_ble_service.class), mConnection,Context.BIND_AUTO_CREATE);
mIsBound = true;
}
/**
* Detach our existing connection
*/
void doUnbindService() {
if (mIsBound) {
Appbike.getAppContext().unbindService(mConnection);
mIsBound = false;
}
}
edit2 :现在在我使用的服务中
public class LocalBinder extends Binder {
LocalService getService() {
// Return this instance of LocalService so clients can call public methods
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
在片段中我可以通过活页夹调用服务功能。
如何解决我的问题?如果我执行unbindservice,来自服务的消息将继续到达..
我必须改变一切吗?
解决方案:我尝试在服务中执行此操作:
@Override
public IBinder onBind(Intent intent) {
iHaveToSendMsg = true;
return mBinder;
}
@Override
public boolean onUnbind(Intent intent)
{
iHaveToSendMsg = false;
return true;
}
并在sendmessage中检查标志,如果是假,我不发送消息。可行的解决方法吗?
我的解决方案'问题:" 在我的解决方案中存在一个问题...每次执行bindService时都不会调用Onbind:/我能做什么 ? 我无法重写所有代码并使用回调,这次我必须使用处理程序消息.. :( "
可能的解决方案:我可以在setHandler()函数中设置标志
public synchronized void setHandler(Handler h)
{
iHaveToSendMsg = true;
handler = h;
}