Android – использование метода из службы в действии?

У меня есть следующий метод в службе в моем приложении:

public void switchSpeaker(boolean speakerFlag){ if(speakerFlag){ audio_service.setSpeakerphoneOn(false); } else{ audio_service.setSpeakerphoneOn(true); } } 

Поэтому мой вопрос – это лучший и самый эффективный способ использовать этот метод в Activity, как следует

 final Button speaker_Button = (Button) findViewById(R.id.widget36); speaker_Button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ switchSpeaker(true); //method from Service } }); 

Должен ли я делать AIDL или есть более простой способ?

Solutions Collecting From Web of "Android – использование метода из службы в действии?"

Вы должны разоблачить метод switchSpeaker для клиентов. Определите свой файл .aidl. Затем связывайтесь с этим сервисом от своей деятельности и просто вызывайте switchSpeaker . См. Документацию

Нет другого простого способа вызвать этот метод, только если он статический)

Существует 3 способа привязки службы к вашей деятельности.

  1. Реализация IBinder
  2. Использование Messenger
  3. Использование AIDL

Среди этих внедрений IBinder – лучший костюм в вашем случае

Пример класса IBinder

1. Служба Server.java

 public class Server extends Service{ IBinder mBinder = new LocalBinder(); @Override public IBinder onBind(Intent intent) { return mBinder; } public class LocalBinder extends Binder { public Server getServerInstance() { return Server.this; } } public void switchSpeaker(boolean speakerFlag){ if(speakerFlag){ audio_service.setSpeakerphoneOn(false); } else{ audio_service.setSpeakerphoneOn(true); } } } 

2. Деятельность Client.java

 public class Client extends Activity { boolean mBounded; Server mServer; TextView text; Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView)findViewById(R.id.text); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { mServer.switchSpeaker(true); } }); } @Override protected void onStart() { super.onStart(); Intent mIntent = new Intent(this, Server.class); bindService(mIntent, mConnection, BIND_AUTO_CREATE); }; ServiceConnection mConnection = new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { Toast.makeText(Client.this, "Service is disconnected", 1000).show(); mBounded = false; mServer = null; } public void onServiceConnected(ComponentName name, IBinder service) { Toast.makeText(Client.this, "Service is connected", 1000).show(); mBounded = true; LocalBinder mLocalBinder = (LocalBinder)service; mServer = mLocalBinder.getServerInstance(); } }; @Override protected void onStop() { super.onStop(); if(mBounded) { unbindService(mConnection); mBounded = false; } }; } 

Пример класса Messang

1. Служба Server.java

 public class Server extends Service{ Messenger messenger = new Messenger(new LocalHandler()); Messenger clientMessenger; static final int SysterTime = 0; static final int AddHandler = 1; List<Handler> mHandlers; @Override public void onCreate() { super.onCreate(); mHandlers = new ArrayList<Handler>(); } @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } public class LocalHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case SysterTime: SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { clientMessenger.send(Message.obtain(null, SysterTime, mDateFormat.format(new Date()))); } catch (RemoteException e) { e.printStackTrace(); } break; case AddHandler: clientMessenger = new Messenger((Handler) msg.obj); try { clientMessenger.send(Message.obtain(null, AddHandler, "Registed messanger")); } catch (RemoteException e) { e.printStackTrace(); } break; default: break; } super.handleMessage(msg); } } } 

2. Деятельность Client.java

 public class Client extends Activity { Messenger messenger; boolean mBounded; TextView text; Button button; Button register; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView)findViewById(R.id.text); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Message message = Message.obtain(null, Server.SysterTime, null); try { messenger.send(message); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); register = (Button) findViewById(R.id.register); register.setOnClickListener(new OnClickListener() { public void onClick(View v) { Message message = Message.obtain(null, Server.AddHandler, new ClientHandle()); try { messenger.send(message); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } public class ClientHandle extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case Server.SysterTime: text.setText(msg.obj.toString()); break; case Server.AddHandler: text.setText(msg.obj.toString()); break; default: break; } super.handleMessage(msg); } } @Override protected void onStart() { super.onStart(); bindService(new Intent(this, Server.class), mConnection, BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); if(mBounded) { unbindService(mConnection); } } ServiceConnection mConnection = new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { mBounded = false; messenger = null; } public void onServiceConnected(ComponentName name, IBinder service) { Toast.makeText(Client.this, "Service is connected", 1000).show(); messenger = new Messenger(service); mBounded = true; } }; } 

Пример AIDL

1. IRemoteService.aidl

 package com.example.bindservice.aidl; interface IRemoteService { String getMessage(String msg); } 

2. Служба Server.java

 public class Server extends Service{ @Override public IBinder onBind(Intent intent) { return mStub; } IRemoteService.Stub mStub = new IRemoteService.Stub() { public String getMessage(String msg) throws RemoteException { return msg; } }; } 

3. Деятельность Client.java

 public class Client extends Activity { Button button; TextView text; boolean mBound; IRemoteService mIRemoteService; EditText etMsg; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (TextView)findViewById(R.id.text); button = (Button) findViewById(R.id.button); etMsg = (EditText)findViewById(R.id.etMsg); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { if(mBound) { try { text.setText(mIRemoteService.getMessage(etMsg.getText().toString())); } catch (RemoteException e) { e.printStackTrace(); } } } }); } @Override protected void onStart() { super.onStart(); bindService(new Intent(Client.this, Server.class), mConnection, BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); if(mBound) { unbindService(mConnection); mBound = false; } } ServiceConnection mConnection = new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { mIRemoteService = null; mBound = false; } public void onServiceConnected(ComponentName name, IBinder service) { mIRemoteService = IRemoteService.Stub.asInterface(service); mBound = true; } }; } 

Для получения дополнительной информации вы можете обратиться к этому документу

Это публично, правильно 🙂

Вы можете вызвать метод bindService (Intent). Скажите взгляд на ApiDemos, класс LocalServiceBinding.

В методе обратного вызова onServiceConnected вы можете увидеть:

  public void onServiceConnected(ComponentName className, IBinder service) { // This is called when the connection with the service has been // established, giving us the service object we can use to // interact with the service. Because we have bound to a explicit // service that we know is running in our own process, we can // cast its IBinder to a concrete class and directly access it. mBoundService = ((LocalService.LocalBinder)service).getService(); // Tell the user about this for our demo. Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show(); } 

Теперь для вызова метода используйте служебный объект (mBoundService).

Это все 🙂