Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 - это метод. и таким образом устанавливается связь между клиентом и сервером.