Как лучше всего взаимодействовать со службой в каждом действии моего приложения без дублирования одного и того же кода?

Я реализовал сервис и использую мессенджер с его обработчиком в качестве коммуникационного моста. Каждый раз, когда я начинаю действие, я должен выполнить следующие шаги:

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

Мне нужно общаться с моей службой почти во всех действиях моего приложения, и я бы не хотел каждый раз повторять весь код. Является ли распространение всех действий на отцовское действие хорошим решением? Можно ли прописать весь код связи в "Приложении"?


person michoprogrammer    schedule 27.01.2017    source источник
comment
Связать с остальными действиями   -  person Vyshnav Ramesh Thrissur    schedule 28.01.2017
comment
@VyshnavRamesh, не могли бы вы добавить больше деталей?   -  person michoprogrammer    schedule 28.01.2017
comment
В каких бы действиях вы ни хотели использовать службу, вы просто используете bindService и его методы обратного вызова onServiceConnected и onServiceDisconnected.   -  person Vyshnav Ramesh Thrissur    schedule 28.01.2017


Ответы (1)


В зависимости от того, какие действия вы хотите, чтобы служба взаимодействовала с пользовательским интерфейсом, используйте «bindService», его методы обратного вызова «onServiceConnected» и «onServiceDisconnected» для этих действий. Если вы хотите, чтобы служба работала, даже если приложение закрыто, используйте startService с startsticky/startnonsticky/startforeground. Для всех видов деятельности вам нужен только один класс обслуживания. В вашем случае вы уже закодировали класс обслуживания, который идеально подходит, а также Activity. Теперь привяжите остальные действия, как указано в начале. Я еще не использовал Messenger, так что убедитесь в этом.

person Vyshnav Ramesh Thrissur    schedule 28.01.2017
comment
То, что вы предлагаете, не решает мою проблему, потому что в любом случае необходимо вызывать службу привязки/отвязки и использовать mConnection, и я бы не хотел повторять весь этот код. ^^ - person michoprogrammer; 30.01.2017
comment
о.. тогда я думаю, вам нужно поместить их в интерфейс и реализовать из каждого действия. - person Vyshnav Ramesh Thrissur; 30.01.2017