Можете ли вы дать мне простой пример приложения с фоновым сервисом, который использует методы bind/unbind для запуска и остановки? я работал с ним по поиску в течение полутора часов, но в этих примерах используются методы startService/stopService или мне очень сложно. спасибо.
Пример подключения/отмены привязки (android)
Ответ 1
Вы можете попробовать использовать этот код:
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);
}
Ответ 2
Добавьте эти методы в свою деятельность:
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()
.
В вашем классе "Служба" вам необходимо определить метод 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()
вызывается в классе обслуживания
и вы можете остановить свое обслуживание, когда другое событие происходит с помощью stopService()
обратите внимание, что ваш слушатель событий должен быть зарегистрирован в вашем файле манифеста Android:
<receiver android:name="MyReciever" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Ответ 3
Прежде всего, две вещи, которые нам нужно понять,
Client
- Выполняет запрос к определенному серверу
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"),
mServiceConn, Context.BIND_AUTO_CREATE);
здесь mServiceConn
является экземпляром класса ServiceConnection
(встроенным), это фактически интерфейс
что нам необходимо реализовать с помощью двух (1-й для подключенного к сети и 2-го сетевого не подключенного) метода для мониторинга состояния сетевого подключения.
Сервер
- Он обрабатывает запрос клиента и делает свою собственную копию, которая является частной только для клиентов, которые отправляют запрос, и этот raplica сервера работает в разных потоках.
Теперь на стороне клиента, как получить доступ ко всем методам сервера?
- Сервер отправляет ответ с помощью
IBinder
Object. Итак, объект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 of
public void onServiceDisconnected(ComponentName className) {
Log.d("ServiceConnection","disconnected");
myService = null;
}
}
Теперь, как вызвать метод, который находится в сервисе
myservice.serviceMethod();
Здесь myService
- объект, а метод serviceMethod - это метод.
и таким образом устанавливается связь между клиентом и сервером.