2012-03-31 10 views
17

Jestem wiązania z Serwisu przez ten sposób: classAndroid: parametr piłki serwis z działalności

aktywny:

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

To onBind metoda mojego Służby:

@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; 
} 

Tak więc mam "zerowy" w LogCat - pakiet jest pusty w s pite of I made intent.putExtra przed bindService

Ogólnie rzecz biorąc Serwis działa dobrze. Muszę jednak zadzwonić pod numer StartListenLocation(); tylko z głównej aktywności aplikacji (postanawiam to zrobić wysyłając flagę).

Jak wysłać dane do serwisu? A może jest inny sposób sprawdzenia, która aktywność została uruchomiona: onBind?

Odpowiedz

8

1 Utwórz interfejs zadeklarować metodę wszystko podpis, który chcesz zadzwonić z działalności:

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

2 Nakręć spoiwo realizuje ILocaionService i określenia rzeczywistego ciała Metoda:

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

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

    ... ... 
} 

3 W czynności wiążącej się z usługą podaj swój łącznik za pomocą interfejsu:

... ... 

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

Cała komunikacja (tj. wywołanie metody do twojej usługi) powinno być obsługiwane i wykonywane przez klasę spinacza inicjować i zwracać w ServiceConnection.onServiceConnected(), a nie rzeczywista klasa usługi (binder.getService() jest niepotrzebna). W ten sposób komunikacja z usługą bindowania ma działać w interfejsie API.

Należy zauważyć, że bindService() jest wywołaniem asynchronicznym. Po wywołaniu bindService() i przed wywołaniem funkcji ServiceConnection.onServiceConnected() wystąpi opóźnienie. Najlepszym miejscem do wykonania usługi jest natychmiast po inicjalizacji mService w metodzie ServiceConnection.onServiceConnected().

Mam nadzieję, że to pomoże.

+0

Dzięki za odpowiedź . Napotkałem kolejny problem później, być może wiesz, jak go rozwiązać: http://stackoverflow.com/questions/9956601/android-set-and-get-services-variable-in-different-activities –

+0

@yorkw "Oto jak wiązać komunikację usług zaprojektowaną do pracy w API "- nie, że wątpię, czy jesteś poprawny, ale czy masz link do niektórych oficjalnych dokumentów Android, gdzie mogę przeczytać więcej na ten temat? – DuneCat

+2

@DuneCat, zgodziłem się, że oświadczenie nie jest do końca dokładne, w rzeczywistości jest to jeden z zalecanych sposobów sugerowania przez Google implementacji związanej usługi, patrz [tutaj] (http://developer.android.com/guide/components/bound -services.html # Binder) po więcej szczegółów. – yorkw

0

Według tej sesji http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

Jednym ze sposobów przesyłania danych do usługi jest korzystanie z bazy danych zawierającej kolumn PID (identyfikator procesu), danych o stanie gdzie status można odczytać, gotowy, oprawa i tak, gdy usługa jest obciążona, odczytuje tabelę wypełnioną przez wywołanie i można ją usunąć po zakończeniu, innym wskazanym sposobem jest AIDL wskazany w poprzedniej odpowiedzi, wybierz zgodnie ze swoją aplikacją.

26

można przekazać parametr w ten prosty sposób: -

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

i uzyskać parametr w metodzie onStart swojej klasie usług

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

} 

Enjoy :)

+2

To jest sposób przekazywania parametrów do metody onBind, zgodnie z żądaniem. @yorkw ma dobre ogólne rozwiązanie do wywoływania działania z usługi. –

Powiązane problemy