Å lage en kontekstbevisst applikasjon er en av de beste måtene å tilby nyttige tjenester til brukerne. Selv om det fortsatt er flere måter å gjøre dette på, inkludert geofences, aktivitetsgjenkjenning og andre plasseringstjenester, har Google nylig utgitt Awareness API, som lar utviklere lage apper som intelligent reagerer på brukerens virkelige verdenssituasjon. Awareness API kombinerer steds-API, lokaliserings API, aktivitetsgjenkjenning og nærliggende API, samt legger til støtte for hodetelefonens tilstand og værvarsling.
I denne opplæringen lærer du om Awareness API og hvordan du får tilgang snapshots av data, samt hvordan man lager lyttere (kjent som gjerder, tar navn fra geofences) for kombinasjoner av brukerforhold som samsvarer med målene for dine applikasjoner. Dette kan være nyttig for et bredt utvalg av apper, for eksempel stedbaserte spill, som tilbyr kuponger til brukere i butikker, og starter en musikkapp når du oppdager en bruker som trener. All kode for denne prøveapplikasjonen finnes på GitHub.
Før du drar inn i Android-applikasjonen din, må du konfigurere Google Play-tjenester via Google API-konsollen. Hvis du allerede har et prosjekt opprettet, kan du hoppe over det første trinnet i denne delen. Hvis ikke, kan du klikke på lenken ovenfor og følge med for å lage et nytt prosjekt for søknaden din.
For å opprette et nytt prosjekt, klikk på det blå Opprett prosjekt knappen øverst på skjermen.
Dette gir deg en dialog som ber om et prosjektnavn. For denne opplæringen har jeg opprettet et prosjekt som heter TutsPlusAwareness. Det er noen begrensninger på hva du kan navngi prosjektet ditt, da bare bokstaver, tall, sitater, bindestreker, mellomrom og utropstegn er tillatt tegn.
Når du treffer Skape, en dialogboks vises nederst til høyre på siden som indikerer at prosjektet blir opprettet. Når det er forsvunnet, vil prosjektet være tilgjengelig for oppsett. Du bør se en skjerm som ligner på følgende. Hvis ikke, klikk på Google APIs-logoen øverst til venstre for å bli tatt til skjermbildet for API-administrator.
Fra Google APIs Oversikt skjermbildet, velg søkefeltet og søk etter Awareness API.
Når du har valgt Awareness API Fra de returnerte resultatene, klikk på den blå Aktiver knappen for å tillate at appen din bruker Awareness API. Hvis dette er den første API-en du har aktivert, blir du bedt om å opprette et sett med legitimasjonsbeskrivelser. Fortsett til legitimasjon side for trinn 3 i denne opplæringen.
I tillegg til Awareness API er det flere APIer som du kanskje må aktivere. Hvis appen din bruker steder funksjonaliteten til Awareness API, må du aktivere Google Places API for Android.
Hvis appen din bruker beacons, må du også aktivere Nærliggende Meldinger API.
For å kunne bruke de aktiverte APIene, må du generere en API-nøkkel for Android-appen din. På siden for legitimasjon for Google-prosjektet, velg Awareness API fra den øverste rullegardinmenyen og Android fra den andre.
Deretter blir du tatt til en skjerm hvor du kan skrive inn et pakkenavn for appen din og SHA1-sertifikatet for appens signeringsnøkkel. For å få signeringsnøkkelen for feilsøkingsnøkkelen på Linux eller OS X, skriv inn følgende kommando i et terminalvindu.
keytool -list -v -keystore ~ / .android / debug.keystore -alias androiddebugkey -storepass android -keypass android
På Windows kan du kjøre den samme kommandoen med banen som er satt til plasseringen av din debug.keystore fil.
Når du klikker på Opprett API-nøkkel knappen, vil du få API-nøkkelen som du må bruke i Android-applikasjonen.
Når du har opprettet en API-nøkkel og de riktige APIene er aktivert, er det på tide å begynne å sette opp Android-prosjektet ditt. For denne opplæringen lager vi et testprogram for å lære APIen.
For å demonstrere alle funksjonene i Awareness API, vil denne opplæringen fokusere på å bruke en enkel liste som representerer hver funksjon som brukes. Selv om detaljene for å opprette denne listen ikke blir diskutert, kan du finne en fullstendig implementering i GitHub-kilden for denne opplæringen.
Først må du inkludere Play Services-biblioteket i din build.gradle fil. Mens du kan inkludere alle Google Play-tjenester, er det best å bare inkludere pakkene du trenger for appen din.
I dette tilfellet er Awareness API tilgjengelig i ContextManager pakke, og det kan bli inkludert i prosjektet ditt ved å legge til følgende linje i din avhengig node. Du vil også være sikker på at AppCompat-biblioteket er inkludert, da dette vil bli brukt til å sjekke tillatelser på Marshmallow og over enheter.
kompilere 'com.google.android.gms: play-services-contextmanager: 9.2.0' compile 'com.android.support:appcompat-v7:23.4.0'
Når du har lagt til linjen ovenfor, synkroniserer du prosjektet og åpner strings.xml fil for prosjektet ditt. Du vil legge inn API-nøkkelen fra Google API-konsollen til en strengverdi.
DITT API NØKKEL HER
Når du har lagt til API-nøkkelen din, må du åpne prosjektet ditt AndroidManifest.xml fil. Avhengig av hvilke funksjoner i Awareness API du bruker, må du inkludere tillatelser for appen din. Hvis appen din bruker beacon, plassering, steder eller vær-funksjonaliteten til Awareness API, må du inkludere ACCESS_FINE_LOCATION
tillatelse. Hvis du trenger å bruke aktivitetsgjenkjenningsfunksjonen, vil du kreve ACTIVITY_RECOGNITION
tillatelse.
Deretter må du deklarere meta-dataene
innen applikasjon
node som knytter appen din til Google API-tjenestene. Avhengig av hva appen bruker, må du også inkludere com.google.android.geo
og com.google.android.nearby
metadata for bruk av plasseringer, beacons og steder.
Deretter må du åpne din MainActivity.java fil. Legg til GoogleApiClient.OnConnectionFailedListener
grensesnitt til klassen din og koble til Google Play Services og Awareness API i din onCreate (Bundle)
metode.
offentlig klasse MainActivity utvider AppCompatActivity implementerer GoogleApiClient.OnConnectionFailedListener @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mGoogleApiClient = ny GoogleApiClient.Builder (dette) .addApi (Awareness.API) .enableAutoManage (dette, dette) .build (); mGoogleApiClient.connect (); @ Overstyr offentlig tomgang onConnectionFailed (@NonNull ConnectionResult connectionResult)
Nå som Play Services er konfigurert i Android-appen din, må du sørge for at brukerne dine på Android Marshmallow eller høyere har gitt tillatelse til at søknaden din skal bruke deres plassering. Du kan sjekke for denne tillatelsen i onCreate (Bundle)
og før du får tilgang til noen funksjoner som krever lokaltillatelse for å unngå krasjer i appen din.
privat booleansk checkLocationPermission () if (! hasLocationPermission ()) Log.e ("Tuts +", "Har ikke lokaltillatelse gitt"); requestLocationPermission (); returner falsk; returnere sann; privat booleansk hasLocationPermission () return ContextCompat.checkSelfPermission (dette, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
Hvis plasseringenstillatelsen ikke allerede er gitt, kan du da be om at brukeren gir det.
privat endelig statisk int REQUEST_PERMISSION_RESULT_CODE = 42; privat ugyldig forespørselLocationPermission () ActivityCompat.requestPermissions (MainActivity.this, new String [] Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_PERMISSION_RESULT_CODE);
Dette vil føre til at en systemdialogboks vises, og spør brukeren om de ønsker å gi tillatelse til appen din for å få vite hvor de befinner seg.
Når brukeren har svart, onRequestPermissionsResult ()
tilbakeringing vil motta resultatene, og appen din kan svare tilsvarende.
@Override public void onRequestPermissionsResult (int requestCode, @NonNull String-tillatelser [], @NonNull int [] grantResults) switch (requestCode) tilfelle REQUEST_PERMISSION_RESULT_CODE: // Hvis forespørselen er kansellert, er resultatrapporterne tomme. if (grantResults.length> 0 && grantResults [0] == PackageManager.PERMISSION_GRANTED) // granted else Log.e ("Tuts +", "Stedtillatelse nektet.");
På dette tidspunktet bør du være ferdig med å sette opp søknaden din for bruk av Awareness API.
Når du vil samle informasjon om en brukeres nåværende kontekst, kan du bruke stillbildefunksjonaliteten til Awareness API. Denne API-en samler informasjon avhengig av hvilken type API-anrop som er gjort, og vil cache denne informasjonen for rask tilgang på tvers av ulike apper.
En av de nye tilleggene til Play Services gjennom Awareness API er muligheten til å oppdage en enhetens hodetelefontilstand (plugget inn eller frakoblet). Dette kan gjøres ved å ringe getHeadphoneState ()
på Awareness API og lese HeadphoneState
fra HeadphoneStateResult
.
private void detectHeadphones () Awareness.SnapshotApi.getHeadphoneState (mGoogleApiClient) .setResultCallback (nytt resultatCallback() @Overtrid offentlig tomgang påResultat (@NonNull HeadphoneStateResult-hodetelefonStateResult) HeadphoneState-hodetelefonState = hodetelefonStateResult.getHeadphoneState (); hvis (headphoneState.getState () == HeadphoneState.PLUGGED_IN) Log.e ("Tuts +", "Hodetelefoner er plugget inn."); ellers Log.e ("Tuts +", "Hodetelefoner er IKKE tilkoblet."); );
Når du har kjent tilstanden til hodetelefonene, kan appen utføre hvilke handlinger som trengs, basert på denne informasjonen.
Selv om det tidligere var tilgjengelig som en komponent i Google Play-tjenester, har plasseringen av Awareness API blitt optimalisert for effektivitet og batteribruk. I stedet for å bruke den tradisjonelle lokaliseringsgrensesnittet og motta en plassering med angitte intervaller, kan du be om et engangs sted.
private void detectLocation () if ! checkLocationPermission ()) return; Awareness.SnapshotApi.getLocation (mGoogleApiClient) .setResultCallback (nytt resultatCallback() @Override offentlig tomrute påResultat (@NonNull LocationResult locationResult) Plassering plassering = stedResultat.getLocation (); Log.e ("Tuts +", "Latitude:" + location.getLatitude () + ", Lengdegrad:" + location.getLongitude ()); Log.e ("Tuts +", "Provider:" + location.getProvider () + "time:" + location.getTime ()); hvis (location.hasAccuracy ()) Log.e ("Tuts +", "Nøyaktighet:" + location.getAccuracy ()); hvis (location.hasAltitude ()) Log.e ("Tuts +", "Altitude:" + location.getAltitude ()); hvis (location.hasBearing ()) Log.e ("Tuts +", "Bearing:" + location.getBearing ()); hvis (location.hasSpeed ()) Log.e ("Tuts +", "Speed:" + location.getSpeed ()); );
Som du kan se, må du først kontrollere at brukeren har gitt stedstillatelsen. Hvis de har, kan du hente et standard lokasjonsobjekt med en stor mengde data om brukerens plassering og hastighet, samt informasjon om nøyaktigheten av disse dataene.
Du vil ønske å bekrefte at det foreligger en bestemt informasjon før du bruker den, da noen data kanskje ikke er tilgjengelige. Kjører denne koden skal sende alle tilgjengelige data til Android-systemloggen.
E / Tuts +: Breddegrad: 39.9255456, Lengdegrad: -105.02939579999999 E / Tuts +: Leverandør: Stillbilde: 1468696704662 E / Tuts +: Nøyaktighet: 20.0 E / Tuts +: Høyde: 0.0 E / Tuts +: Hastighet: 0.0
Selv om det ikke er så robust som Standard Places API, gir Awareness API en rask og enkel måte å samle informasjon om steder i nærheten av brukeren. Denne API-anropet returnerer a Liste
av PlaceLikelihood
objekter som inneholder en Sted
og a flyte
som representerer hvor sannsynlig det er at en bruker er på det stedet (derav objektets navn).
Hver Sted
Objektet kan inneholde navn, adresse, telefonnummer, stedtype, brukervurdering og annen nyttig informasjon. Du kan be om de nærliggende stedene for brukeren etter å ha bekreftet at brukeren har gitt stedstillatelsen.
privat ugyldig oppdagNearbyPlaces () if (! checkLocationPermission ()) return; Awareness.SnapshotApi.getPlaces (mGoogleApiClient) .setResultCallback (nytt resultatCallback() @Overtrid offentlig tomgang påResultat (@NonNull PlacesResultat placesResult) Plasser sted; for (sted) Log.e ("Tuts +", place.getName (). ToString () + "\ n" + place.getAddress (). ToString ()); Log.e ("Tuts +", "Rating:" + place.getRating ()); Log.e ("Tuts +", "Sannsynlighet for at brukeren er her:" + placeLikelihood.getLikelihood () * 100 + "%"); );
Når du kjører fremgangsmåten ovenfor, bør du se utdata som ligner på følgende i Android-konsollen. Hvis en verdi ikke er tilgjengelig for et nummer, -1
vil bli returnert.
E / Tuts +: North Side Tavern 12708 Lowell Blvd, Broomfield, CO 80020, USA E / Tuts +: Rating: 4.7 E / Tuts +: Sannsynlighet for at brukeren er her: 10,0% E / Tuts +: Quiltbutikk 12710 Lowell Blvd, Broomfield, CO 80020, USA E / Tuts +: Rating: 4.3 E / Tuts +: Sannsynlighet for at brukeren er her: 10,0% E / Tuts +: Absolutt Gulvpleie 3508 W 126th Pl, Broomfield, CO 80020, USA E / Tuts +: Vurdering: -1.0
En annen av de nye tilleggene til Google Play Services gjennom Awareness API er muligheten til å få værforholdene for en bruker. Denne funksjonen krever også stedstillatelse for brukere på Marshmallow og senere.
Ved hjelp av denne forespørselen vil du kunne få temperaturen i brukerens område i enten Fahrenheit eller Celsius. Du kan også finne ut hva temperaturen føles, duggpunktet (temperaturen der vannet i luften kan begynne å kondensere i dugg), fuktighetsprosent og værforholdene.
private void detectWeather () if (! checkLocationPermission ()) return; Awareness.SnapshotApi.getWeather (mGoogleApiClient) .setResultCallback (nytt resultatCallback() @Overvrid offentlig tomgang onResult (@NonNull WeatherResult weatherResult) Vær vær = weatherResult.getWeather (); Log.e ("Tuts +", "Temp:" + weather.getTemperature (Weather.FAHRENHEIT)); Log.e ("Tuts +", "Føles som:" + weather.getFeelsLikeTemperature (Weather.FAHRENHEIT)); Log.e ("Tuts +", "Dew point:" + weather.getDewPoint (Weather.FAHRENHEIT)); Log.e ("Tuts +", "Fuktighet:" + weather.getHumidity ()); hvis (weather.getConditions () [0] == Weather.CONDITION_CLOUDY) Log.e ("Tuts +", "Ser ut som det er noen skyer der ute"); );
Ovennevnte kode skal utgjøre noe som ligner dette.
E / Tuts +: Temp: 88.0 E / Tuts +: Føles som: 88.0 E / Tuts +: Duggpunkt: 50.0 E / Tuts +: Fuktighet: 28 E / Tuts +: Ser ut som det er noen skyer der ute
En viktig ting å merke seg her er at værforholdsverdien er lagret som en int
. Hele listen over tilstandsverdier finnes i værobjektet.
int CONDITION_UNKNOWN = 0; int CONDITION_CLEAR = 1; int CONDITION_CLOUDY = 2; int CONDITION_FOGGY = 3; int CONDITION_HAZY = 4; int CONDITION_ICY = 5; int CONDITION_RAINY = 6; int CONDITION_SNOWY = 7; int CONDITION_STORMY = 8; int CONDITION_WINDY = 9;
Brukerens aktivitet vil spille en stor rolle i hvordan de samhandler med enheten, og når du oppdager den aktiviteten, kan du gi en mer flytende brukeropplevelse..
Hvis du for eksempel har en treningsapp, kan det hende du vil oppdage når en bruker kjører, slik at du kan begynne å spille inn en Google Fit-økt, eller du vil kanskje sende et varsel til brukeren din hvis du oppdager at de fortsatt har vært for mange timer i løpet av dagen.
Bruker getDetectedActivity ()
ring inn Awareness API, kan du få en liste over sannsynlige aktiviteter og hvor lenge brukeren har gjort hver enkelt.
private void detectActivity () Awareness.SnapshotApi.getDetectedActivity (mGoogleApiClient) .setResultCallback (nytt resultatCallback() @Override offentlig tomrum påResultat (@NonNull DetectedActivityResult detectedActivityResult) ActivityRecognitionResult result = detectedActivityResult.getActivityRecognitionResult (); Log.e ("Tuts +", "time:" + result.getTime ()); Log.e ("Tuts +", "forløpt tid:" + result.getElapsedRealtimeMillis ()); Log.e ("Tuts +", "Mest sannsynlig aktivitet:" + result.getMostProbableActivity (). ToString ()); for (DetectedActivity aktivitet: result.getProbableActivities ()) Log.e ("Tuts +", "Activity:" + activity.getType () + "Sannsynlighet:" + activity.getConfidence ()); );
Ovennevnte metode vil vise den mest sannsynlige aktiviteten til brukeren, hvor lenge de har vært i den aktuelle tilstanden og listen over alle mulige aktiviteter.
E / Tuts +: tid: 1468701845962 E / Tuts +: forløpt tid: 15693985 E / Tuts +: Mest sannsynlig aktivitet: DetectedActivity [type = STILL, confidence = 100] E / Tuts +: Aktivitet: 3 Sannsynlighet: 100
De DetectedActivity
type verdier kan kartlegges til følgende verdier:
int IN_VEHICLE = 0; int ON_BICYCLE = 1; int ON_FOOT = 2; int STILL = 3; int UNKNOWN = 4; int TILTING = 5; int WALKING = 7; int RUNNING = 8;
Den endelige typen øyeblikksbilde - og vanskeligst å sette opp fordi den krever en ekte verdenskomponent - involverer BLE (Bluetooth Low Energy) beacons. Mens nærliggende API ligger utenfor omfanget av denne opplæringen, kan du initialisere beacon for ditt eget Google Services-prosjekt ved hjelp av Googles Beacon Tools-app.
En viktig ting å merke seg er at når du har registrert et fyrtårn til et Google API-prosjekt, Du kan ikke avregistrere den uten å tilbakestille lyset ID. Dette betyr at hvis du sletter prosjektet, må fyret konfigureres ved hjelp av produsentens app. For Awareness API må navneområdet samsvare med Google-prosjektet du bruker for Awareness API-samtalene dine. Ovennevnte fyrtårn var allerede registrert i et personlig test Google-prosjekt, derav det forskjellige navneområdet (reflektert-disk-355
) fra det av prøveprosjektet som er knyttet til denne opplæringen.
I ovenstående skjermbilde kan du se ett element under vedlegg. Navnet for dette vedlegget er reflektert-disk-355 (denne opplæringseksemplarprosjektets navneområde er tutsplusawareness) Og typen er nærheten. Du trenger denne informasjonen for dine egne beacons for å oppdage vedlegg med Awareness API.
Når du har konfigurert beacons, kan du gå tilbake til koden din. Du må opprette en Liste
av BeaconState.TypeFilter
objekter slik at appen din kan filtrere ut beacons og vedlegg som ikke er relatert til søknaden din.
privat statisk endelig liste BEACON_TYPE_FILTERS = Arrays.asList (BeaconState.TypeFilter.with (// erstatt disse med beaconets verdier "namespace", "type"));
Hvis du har grunn til å tro at brukeren er i nærheten av et fyrtårn, kan du be om vedlegg fra beacons som passer til filterkravene ovenfor. Dette vil kreve lokasjonsrettigheter for brukere på Marshmallow og senere.
private void detectBeacons () if (! checkLocationPermission ()) return; Awareness.SnapshotApi.getBeaconState (mGoogleApiClient, BEACON_TYPE_FILTERS) .setResultCallback (nytt resultatCallback() @Override offentlig tomrum påResultat (@NonNull BeaconStateResult beaconStateResult) if (! BeaconStateResult.getStatus () .SSuccess ()) Log.e ("Test", "Kunne ikke få beacon state."); komme tilbake; BeaconState beaconState = beaconStateResult.getBeaconState (); hvis (beaconState == null) Log.e ("Tuts +", "beacon state er null"); annet for (BeaconState.BeaconInfo info: beaconState.getBeaconInfo ()) Log.e ("Tuts +", ny String (info.getContent ())); );
Denne koden vil logge ut informasjon for vedlegget som er knyttet til eksempelet beacon ovenfor. For dette eksempelet har jeg konfigurert to beacons med samme navneområde og type for å demonstrere at flere beacons kan detekteres samtidig.
E / Tuts +: Oh hei tuts + E / Tuts +: Portable Beacon info
Mens øyeblikksbilde-API-en kan ta tak i informasjon om brukerens kontekst på et bestemt tidspunkt, lytter gjerdings-API-en etter bestemte forhold som skal oppfylles før det tillates at det skjer en handling. Gjerde-APIen er optimalisert for effektiv batteri- og dataanbruk, for å være høflig for brukerne.
Det er fem typer forhold du kan sjekke for når du lager gjerder:
På dette tidspunktet har værforhold og steder ikke støtte for gjerder. Du kan lage et gjerde som bruker noen av de støttede funksjonene; Men en veldig nyttig funksjon i denne API-en er at logiske operasjoner kan brukes på forhold. Du kan ta flere gjerder og bruke og, eller, og ikke Operasjoner for å kombinere forholdene slik at de passer til appens behov.
BroadcastReceiver
Før du lager gjerdet ditt, må du ha en nøkkelverdi som representerer hvert gjerde som appen din vil lytte til. For å fullføre denne opplæringen, vil du bygge et gjerde som oppdager når en bruker sitter på et bestemt sted, for eksempel deres hjem.
privat endelig statisk streng KEY_SITTING_AT_HOME = "sitting_at_home";
Når du har definert en nøkkel, kan du lytte til en kringkasting Intent
som inneholder den nøkkelen.
offentlig klasse FenceBroadcastReceiver utvider BroadcastReceiver @Override public void onReceive (Kontekst kontekst, Intent intent) if (TextUtils.equals (ACTION_FENCE, intent.getAction ())) FenceState fenceState = FenceState.extract (intent); if (TextUtils.equals (KEY_SITTING_AT_HOME, fenceState.getFenceKey ())) if (fenceState.getCurrentState () == FenceState.TRUE) Log.e ("Tuts +", "Du har blitt sittende hjemme for lenge" );
Nå som du har en mottaker opprettet for å lytte etter brukerhendelser, er det på tide å lage gjerder. Den første AwarenessFence
du vil opprette, vil lytte etter når brukeren er i en FORTSATT
stat.
AwarenessFence activityFence = DetectedActivityFence.during (DetectedActivityFence.STILL);
Det andre gjerdet du vil opprette, vil vente på at brukeren skal være innenfor rekkevidde av et bestemt sted. Mens denne prøven har verdier for breddegrad og lengdegrad som allerede er innstilt, vil du endre dem for å matche hvilke koordinater som samsvarer med posisjonen din for testing.
AwarenessFence homeFence = LocationFence.in (39,92, -105,7, 100000, 1000);
Nå som du har to gjerder, kan du kombinere dem for å skape en tredjedel AwarenessFence
ved å bruke AwarenessFence.and
operasjon.
AwarenessFence sittingAtHomeFence = AwarenessFence.and (homeFence, activityFence);
Til slutt kan du opprette en PendingIntent
som vil bli sendt til din BroadcastReceiver
og legg det til Awareness API ved hjelp av updateFences
metode.
Intent Intent = Ny Intent (ACTION_FENCE); PendingIntent fencePendingIntent = PendingIntent.getBroadcast (dette, 0, hensikt, 0); mFenceBroadcastReceiver = ny FenceBroadcastReceiver (); registerReceiver (mFenceBroadcastReceiver, ny IntentFilter (ACTION_FENCE)); FenceUpdateRequest.Builder builder = ny FenceUpdateRequest.Builder (); builder.addFence (KEY_SITTING_AT_HOME, sittingAtHomeFence, hencePendingIntent); Awareness.FenceApi.updateFences (mGoogleApiClient, builder.build ());
Nå logger appen en melding når brukeren setter seg innenfor rekkevidde av den angitte plasseringen.
I denne opplæringen har du lært om Awareness API og hvordan du samler inn nåværende informasjon om brukerens miljø. Du har også lært hvordan du registrerer en lytter for endringer i brukerens sammenheng og handler når bestemte forhold er oppfylt.
Med denne informasjonen bør du kunne utvide dine egne apper og gi brukerne mer fantastiske opplevelser basert på deres nåværende beliggenhet, aktivitet og andre nyttige verdier.