Пример привязки / отмены привязки (android)

Можете ли вы дать мне простой пример приложения с фоновым сервисом, который использует методы bind / unbind для запуска и остановки? Я искал для него полдюжина, но в этих примерах используются методы startService / stopService или мне очень сложно. Спасибо.

Solutions Collecting From Web of "Пример привязки / отмены привязки (android)"

Вы можете попробовать использовать этот код:

protected ServiceConnection mServerConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { Log.d(LOG_TAG, "onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName name) { Log.d(LOG_TAG, "onServiceDisconnected"); } } public void start() { // mContext is defined upper in code, I think it is not necessary to explain what is it mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE); mContext.startService(intent); } public void stop() { mContext.stopService(new Intent(mContext, ServiceRemote.class)); mContext.unbindService(mServerConn); } 

Добавьте эти методы в свою деятельность:

 private MyService myServiceBinder; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { myServiceBinder = ((MyService.MyBinder) binder).getService(); Log.d("ServiceConnection","connected"); showServiceData(); } public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } }; public Handler myHandler = new Handler() { public void handleMessage(Message message) { Bundle data = message.getData(); } }; public void doBindService() { Intent intent = null; intent = new Intent(this, BTService.class); // Create a new Messenger for the communication back // From the Service to the Activity Messenger messenger = new Messenger(myHandler); intent.putExtra("MESSENGER", messenger); bindService(intent, myConnection, Context.BIND_AUTO_CREATE); } 

И вы можете привязываться к сервису с помощью ovverriding onResume () и onPause () в вашем классе Activity.

 @Override protected void onResume() { Log.d("activity", "onResume"); if (myService == null) { doBindService(); } super.onResume(); } @Override protected void onPause() { //FIXME put back Log.d("activity", "onPause"); if (myService != null) { unbindService(myConnection); myService = null; } super.onPause(); } 

Обратите внимание, что при привязке к службе в onCreate() службы onCreate() только метод onCreate() . В классе «Служба» вам необходимо определить метод myBinder:

 private final IBinder mBinder = new MyBinder(); private Messenger outMessenger; @Override public IBinder onBind(Intent arg0) { Bundle extras = arg0.getExtras(); Log.d("service","onBind"); // Get messager from the Activity if (extras != null) { Log.d("service","onBind with extra"); outMessenger = (Messenger) extras.get("MESSENGER"); } return mBinder; } public class MyBinder extends Binder { MyService getService() { return MyService.this; } } 

После того, как вы определили эти методы, вы можете использовать методы своего сервиса в своей деятельности:

 private void showServiceData() { myServiceBinder.myMethod(); } 

И, наконец, вы можете начать свою службу, когда произойдет какое-то событие, например _BOOT_COMPLETED_

 public class MyReciever extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("android.intent.action.BOOT_COMPLETED")) { Intent service = new Intent(context, myService.class); context.startService(service); } } } 

Обратите внимание, что при запуске службы onCreate() и onStartCommand() вызывается в классе службы, и вы можете остановить свою службу, когда другое событие происходит stopStervice (), обратите внимание, что ваш прослушиватель событий должен быть зарегистрирован в вашем файле манифеста Android:

 <receiver android:name="MyReciever" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

Прежде всего, две вещи, которые нам нужно понять,

клиент

  • Он запрашивает конкретный сервер

bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);

Здесь mServiceConn – это экземпляр класса ServiceConnection (встроенный), это фактически интерфейс, который нам нужно реализовать с помощью двух (1-й для подключенного к сети и 2-го сетевого не подключенного) метода для мониторинга состояния сетевого подключения.

сервер

  • Он обрабатывает запрос клиента и создает собственную копию, которая является частной только для клиентов, которые отправляют запрос, и этот raplica сервера работает в разных потоках.

Теперь на стороне клиента, как получить доступ ко всем методам сервера?

  • Сервер отправляет ответ с IBinder объекта IBinder . Итак, объект IBinder – это наш обработчик, который обращается ко всем методам Service с помощью (.) Оператора.

,

 MyService myService; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { Log.d("ServiceConnection","connected"); myService = binder; } //binder comes from server to communicate with method's of public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } } 

Теперь, как вызвать метод, который лежит в сервисе

 myservice.serviceMethod(); 

Здесь myService – объект, а метод myService – это метод. И таким образом устанавливается связь между клиентом и сервером.