如何更好地处理从服务到片段的处理程序消息?

时间:2015-06-01 10:35:18

标签: android android-fragments android-service android-handler

对于从已启动服务到片段的通信,我这样做了:

在服务机构

    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;
    }

0 个答案:

没有答案