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

Android: передать параметр службе из Activity

Я привязываюсь к Сервису таким образом:

Класс действия:

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 - пакет равен null, несмотря на то, что я сделал intent.putExtra до bindService

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

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

4b9b3361

Ответ 1

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().

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

Ответ 2

Вы можете передать параметр таким простым способом: -

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();
}

}

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

Ответ 3

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

Одним из способов отправки данных в службу является использование базы данных, содержащей столбцы pid (идентификатор процесса), данные, статус, в котором статус может быть READ, READY, BINDING и т.д., когда служба загружается, она считывает таблицу, которая заполняется вызывающей активностью и может быть удалена по завершении, указанным другим способом является AIDL, как указано в предыдущем ответе, выберите в соответствии с вашим приложением.