Android: передать параметр Сервису из Активности - PullRequest
19 голосов
/ 31 марта 2012

Я связываюсь с Сервисом следующим образом:

Класс активности:

ListenLocationService mService;
@Override
public void onCreate(Bundle savedInstanceState) {
        ...
        Intent intent = new Intent(this, ListenLocationService.class);
        intent.putExtra("From", "Main");
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        ...
}

private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className,
                IBinder service) {
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();         
        }

        public void onServiceDisconnected(ComponentName arg0) {
        }
    };

Это onBind метод моего Сервиса :

@Override
public IBinder onBind(Intent intent) {
    Bundle extras = intent.getExtras(); 
    if(extras == null)
        Log.d("Service","null");
    else
    {
        Log.d("Service","not null");
        String from = (String) extras.get("From");
        if(from.equalsIgnoreCase("Main"))
            StartListenLocation();
    }
    return mBinder;
}

Таким образом, у меня есть "null" в LogCat - bundle равен null, несмотря на то, что я сделал intent.putExtra до bindService

В общем, Service работает нормально.Однако мне нужно звонить StartListenLocation(); только из основной активности приложения (я решаю сделать это, отправив флаг).

Как я могу отправить данные в службу? Или, может быть, есть другой способ проверить, какая активность запущена onBind?

Ответы [ 3 ]

31 голосов
/ 28 мая 2013

Вы можете передать параметр следующим простым способом: -

Intent serviceIntent = new Intent(this,ListenLocationService.class); 
   serviceIntent.putExtra("From", "Main");
   startService(serviceIntent);

и получите параметр в методе onStart вашего класса обслуживания

    @Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
     Bundle extras = intent.getExtras(); 
if(extras == null)
    Log.d("Service","null");
else
{
    Log.d("Service","not null");
    String from = (String) extras.get("From");
    if(from.equalsIgnoreCase("Main"))
        StartListenLocation();
}

}

Наслаждайтесь:)

9 голосов
/ 31 марта 2012

1 Создайте интерфейс, который объявляет всю сигнатуру метода, которую вы хотите вызвать из Activity:

public interface ILocationService {
  public void StartListenLocation(Location location);
}

2 Сделайте так, чтобы ваше связующее устройство реализовало ILocaionService и определило фактическое тело метода:

public class MyBinder extends Binder implements ILocationService {
  ... ...

  public void StartListenLocation(Location location) {
    // implement your method properly
  }

  ... ...
}

3 В действиях, связанных с услугой, укажите привязку к интерфейсу:

... ...

ILocationService mService; // communication is handled via Binder not the actual service class.

private ServiceConnection mConnection = new ServiceConnection() {

  public void onServiceConnected(ComponentName className, IBinder service) {
    mService = (ILocationService) service;     
  }

  ... ...
};

... ...

// At some point if you need call service method with parameter:
Location location = new Location();
mService.StartListenLocation(location);

Все взаимодействия (то есть вызов метода к вашей службе) должны обрабатываться и выполняться через инициализатор и возврат класса связывателя в ServiceConnection.onServiceConnected (), а не фактический класс обслуживания (binder.getService () не требуется). Вот как связываются сервисы связи, предназначенные для работы в API.

Обратите внимание, что bindService () является асинхронным вызовом. После вызова bindService () и до того, как система обратного вызова ServiceConnection.onServiceConnected () подключится к системе, будет задержка. Таким образом, лучшее место для выполнения метода обслуживания - это сразу же после инициализации mService в методе ServiceConnection.onServiceConnected ().

Надеюсь, это поможет.

0 голосов
/ 31 марта 2012

Согласно этому сеансу http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

Одним из способов отправки данных в службу является использование базы данных, содержащей столбцы pid (идентификатор процесса), данные, статус, где статус может быть ЧИТАТЬ, ГОТОВ,BINDING и т. Д., Когда служба загружается, она читает таблицу, которая заполнена вызывающим действием и может быть удалена после завершения, другой путь, указанный в AIDL, как указано в предыдущем ответе, выберите в соответствии с вашим приложением.

...