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

Как вызвать методы Сервиса из активности?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Вот пример, который может помочь 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;
        }
    };
}

Ответ 3

Вот пример кода для этого права в Служебной документации в разделе "Пример локальной службы":

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

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

Ответ 4

Как вы вызываете нормальный метод класса 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.
Вышеуказанная вещь, поясненная на рисунке, называется Связывание службы.

Привязка позволяет наблюдать фоновый сервис из Activity. С помощью привязки мы можем общаться обоими способами, например, с помощью службы & lt; ---> службы.
Prateek Yadav уже предоставил отличный фрагмент кода. Вы можете использовать это.

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

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

Ответ 5

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

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