Как вызвать методы Сервиса из деятельности? - PullRequest
28 голосов
/ 30 января 2011

Я просто хочу вызывать методы локального сервиса из моей деятельности.Как я могу это сделать?

Ответы [ 5 ]

58 голосов
/ 22 апреля 2014

Вот пример, который может помочь
Server.java:

package com.example.bindservice.binder;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

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 String getTime() {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return mDateFormat.format(new Date());
    }
}

Client.java

package com.example.bindservice.binder;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.example.bindservice.binder.Server.LocalBinder;

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) {
                text.setText(mServer.getTime());
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        Intent mIntent = new Intent(this, Server.class);
        bindService(mIntent, mConnection, BIND_AUTO_CREATE);
    };

    ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(Client.this, "Service is disconnected", 1000).show();
            mBounded = false;
            mServer = null;
        }

        @Override
        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;
        }
    };
}
28 голосов
/ 31 января 2011

Пример кода для этого права приведен в документации по обслуживанию в разделе «Образец локальной службы»:

http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Также для тех, кто предлагает помощь - если ваша служба и клиентвсе являются частью вашего собственного .apk и работают в одном и том же процессе (поведение по умолчанию), помощь helpl не требуется;это просто дополнительная сложность, которая ничего вам не дает.

2 голосов
/ 06 апреля 2019

Как вы вызываете обычный метод класса Java?

A obj = new A();
obj.method();

Сервис - это класс Java. Итак, как бы вы назвали метод обслуживания?

serviceObj.method();

Теперь реальный вопрос - как создать объект Service?

Service serviceObj = new Service(); Определенно нет.
В Android Сервис - это системный компонент, который создается, уничтожается и управляется ОС Android.
Для создания сервисного объекта нам понадобится `IBinder.

Это поток получения сервисного объекта от IBinder .

enter image description here

После того, как у вас есть serviceObject. Он будет работать как любой обычный объект Java. В Android есть определенный PATTERN , которому мы должны следовать, чтобы сделать возможным описанный выше поток. Этот шаблон называется Binding a Service .
Привязка позволяет наблюдать фоновый сервис из Activity. С привязкой мы можем общаться обоими способами, то есть Activity <---> Service. Prateek Yadav уже предоставил отличный фрагмент кода. Вы можете использовать это.

Несколько вещей, которые нужно иметь в виду

  • Никогда не забывайте отменять привязку сервиса, иначе вы приведете к ResourceLeak.
  • Вы можете звонить startService(intent) и bindService(mIntent, mConnection, BIND_AUTO_CREATE) в любом порядке. Привязка и запуск службы - это две независимые вещи.
2 голосов
/ 31 января 2011

Один из способов сделать это - определить интерфейс с AIDL для Android и использовать подсистему Binder для выполнения IPC.По ссылке, которую я разместил, есть большой набор инструкций.Я бы начал тут же писать, если у вас есть вопросы.Несмотря на то, что Android является довольно сложной темой (IPC), Binder делает действительно хорошую работу по ее упрощению (по крайней мере, для начала, я уверен, что вы могли бы сделать это сложнее, если хотите)

Редактировать Как указано в комментариях, в этом нет необходимости, если Service и клиент работают в одном и том же процессе.Если не указано иное, это значение по умолчанию.Тем не менее, он все равно работает независимо, он просто добавляет немного сложности.

0 голосов
/ 30 января 2011

Я не знаю, где ваша проблема, пожалуйста, напишите код. Используя Binder, Activity может иметь доступ к объекту службы. Смотрите примеры в API для создания связи между активностью и сервисом.

Имея объект службы в вашей деятельности, вы можете просто позвонить:
mService.yourMethod ();
Мы могли бы помочь вам намного лучше, если бы вы точно описали вашу проблему и, как я уже сказал, выложили несколько фрагментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...