2017-01-27 3 views
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"); 
    } 
} 

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

+0

Связанные части отдыха –

+0

@VyshnavRamesh Не могли бы вы добавить дополнительные детали? – michoprogrammer

+0

В зависимости от того, что вы хотите использовать, вы просто используете «bindService» и его методы обратного вызова «onServiceConnected» и «onServiceDisconnected». –

ответ

1

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

+0

То, что вы предлагаете, не решает мою проблему, потому что в любом случае необходимо вызвать службу bind/unbind и использовать mConnection, и я бы хотел избежать повторения всего этого кода. ^^ – michoprogrammer

+0

oh..then, я думаю, вы должны поместить их в интерфейс и реализовать из каждого действия. –

Смежные вопросы

 Смежные вопросы