1

我实现了一个服务,并使用一个带有其处理程序的 Messenger 作为通信桥梁。每次我开始一项活动时,我都必须遵循以下步骤:

1)创建服务连接

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        mService = new Messenger(service);
        try {
            Message msg = Message.obtain(null, ConstantStuff.MSG_REGISTER_CLIENT);
            msg.replyTo = mMessenger;
            egoService.send(msg);
        } catch (RemoteException e) {
            Log.e("HELPER", "FAIL - Service crashed" + e.getMessage());
        }
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
    }
};

2) 创建信使

final Messenger mMessenger = new Messenger(new ActivityOne.IncomingMessageHandler());

class IncomingMessageHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case ConstantStuff.MACRO_SEND_PWD:
                if (msg.arg1 == 1) {
                    Log.e("PWD", "SUCCESS");
                } else if (msg.arg1 == 0) {
                    Log.e("PWD", "FAIL");
                }
                break;
            default:
                super.handleMessage(msg);
        }
    }
}

3)将服务绑定到我的活动

public void doBindService() {
    this.bindService(new Intent(this, NetworkService.class), mConnection, Context.BIND_AUTO_CREATE);
    isBound = true;
    Log.e("HELPER", "DO BIND");
}

4)开始使用服务

private void sendPwd(String pwd) {
    if (isBound) {
        if (mService != null) {
            try {
                Bundle b = new Bundle();
                b.putByte("Command", (byte) ConstantStuff.MACRO_SEND_PWD);
                b.putString("Password", password);
                b.putString("Param0", password);
                b.putString("Param1", "dummy");
                b.putString("Param2", "dummy");
                b.putString("Param3", "dummy");
                Message msg = Message.obtain(null, ConstantStuff.MSG_MACRO);
                msg.setData(b);
                msg.replyTo = mMessenger;
                mService.send(msg);
            } catch (Exception e) {}
        }
    }
}

5)在我的任务结束时,将服务与我的活动解除绑定

public void doUnbindService() {
    if (isBound) {
        if (mService != null) {
            try {
                Message msg = Message.obtain(null, ConstantStuff.MSG_UNREGISTER_CLIENT);
                msg.replyTo = mMessenger;
                mService.send(msg);
            } catch (RemoteException e) {
                Log.e("HELPER", "FAIL - DO UnBIND" + e.getMessage());
            }
        }
        this.unbindService(mConnection);
        isBound = false;
        Log.e("HELPER", "DO UnBIND");
    }
}

我需要在我的应用程序的几乎所有活动中与我的服务进行通信,并且我不想每次都重复所有代码。将所有活动扩展到父亲活动是否是一个好的解决方案?是否可以在“应用程序”中编写所有通信代码?

4

1 回答 1

1

在您希望服务与 UI 交互的任何活动中,对这些活动使用“bindService”、其回调方法“onServiceConnected”和“onServiceDisconnected”。如果您希望服务在应用程序关闭的情况下也能运行,请将 startService 与 startsticky/startnonsticky/startforeground 一起使用。对于所有活动,您只需要一个服务类。在您的情况下,您已经编写了完美的服务类以及一个活动。现在绑定到开头提到的其余活动。我还没有使用过 Messenger,所以请确认一下。

于 2017-01-28T17:22:38.557 回答