Innholdsfortegnelse:
Video: Android 101 by Fred Widjaja 2024
" Min app trenger en kringkasting mottaker. Kan noen påminn meg hvordan jeg kan kode en kringkastingsmottaker? Og når du er på det, hvordan returnerer en aktivitet et resultat? Åh, heck. Hvor kan jeg raskt finne alle de tingene? "
Å ha eksempler på hva slags kode som brukes i Android-applikasjonsutvikling, er klar til å være, kan være en stor hjelp. Du finner mange eksempler her.
Aktiviteter
Her er en aktivitet som starter en annen aktivitet:
offentlig klasse CheatSheetActivity utvider Aktivitetsredskaper OnClickListener {Button button1; statisk sluttstreng MY_ACTION = "com. allmycode. action"; statisk sluttstreng MY_URI = "my_scheme: my_scheme_specific_part"; @Override public void onCreate (Bundle savedInstanceState) {super. onCreate (savedInstanceState); setContentView (R. layout. main); button1 = (Button) findViewById (ID-ID1); Button1. setOnClickListener (dette);} offentlig ugyldig påClick (Vis arg0) {Intent intention = new Intent (); hensikt. setAction (MY_ACTION); hensikt. setData (Uri. parse (MY_URI)); startActivity (intent);}}
Og ikke glem - Når du oppretter en ny aktivitetsklasse, må du legge til et tilsvarende element i AndroidManifest. xml-fil. AndreActivity-elementets hensiktfilter ser noe ut som dette:
For å få et resultat fra en aktivitet, legg til følgende kode (eller noe som ligner på det) til appen din:
siste int CODE_NUMBER = 42; siste streng CLASSNAME = "CheatSheetActivity"; Offentlig tomgang onClick (Vis arg0) {Intent Intent = New Intent (); hensikt. setAction (MY_ACTION); hensikt. setData (Uri. parse (MY_URI)); startActivityForResult (intent, CODE_NUMBER);} beskyttet tomt onActivityResult (int codeNumber, int resultCode, Intent Intent) {hvis (resultCode == RESULT_OK) {if (codeNumber == CODE_NUMBER) {Logg. I (CLASSNAME, intent. getData (). getSchemeSpecificPart ());}}}
Og i aktiviteten som lager resultatet, legg til kode av følgende type:
Intent Intent = Ny Intent (); hensikt. setData (Uri. parse ("resultat: hei")); setResult (RESULT_OK, hensikt); bli ferdig();
Tjenester
En tjeneste gjør vanligvis arbeidet uten å plage (eller til og med varsle) brukeren. For eksempel kan en aksjekurs tjeneste nå ut til nettet og få de siste prisene på brukerens favorittvalg. En annen apps aktivitet kan hente data fra tjenesten og vise dataene på enhetens skjerm.
Følgende kode er en komplett (men ikke veldig nøyaktig) værservice:
offentlig klasse MyWeatherService utvider tjenesten {Messenger messengerToClient = null; MyIncomingHandler myIncomingHandler = ny MyIncomingHandler (); Messenger messengerToService = nytt Messenger (myIncomingHandler); @Override public IBinder onBind (Intent Intent) {return messengerToService.getBinder ();} klasse MyIncomingHandler utvider Handler {@Override public void handleMessage (Message incomingMessage) {messengerToClient = incomingMessage. svare på; Bundle reply = new Bundle (); svare. putString ("vær", "Det er mørkt om natten."); Melding replyMessage = Melding. få tak i(); replyMessage. setData (svar); prøv {messengerToClient. send (replyMessage);} catch (RemoteException e) {e. printStackTrace ();}}}}
I en annen pakke setter du koden for å ringe værtjenesten. Her er noen prøvekode:
offentlig klasse ServiceConsumerActivity utvider Aktivitetsredskaper OnClickListener {Messenger messengerToService = null; MyIncomingHandler myIncomingHandler = ny MyIncomingHandler (); Messenger messengerFromService = nytt Messenger (myIncomingHandler); ServiceConnection connection = ny MyServiceConnection (); SharedPreferences prefs; boolean isBound = false; void bind () {Intent intention = new Intent (); hensikt. setAction ("com. allmycode. WEATHER"); isBound = bindService (intent, tilkobling, kontekst. BIND_AUTO_CREATE);} offentlig tomtqueryService () {hvis (erBound) {Bundle bundle = new Bundle (); bunt. putString ("sted", "Philadelphia"); Meldingsmelding = Melding. få tak i(); budskap. replyTo = messengerFromService; budskap. setData (bundle); prøv {messengerToService. send (melding);} fangst (RemoteException e) {e. printStackTrace ();}} else {textView1. setText (R. streng. service_not_bound);}} klasse MyIncomingHandler utvider Handler {@Override public void handleMessage (Message msg) {Bundle bundle = msg. GetData (); textView1. setText (bundle. getString ("weather"))}} void unbind () {hvis (isBound) {unbindService (tilkobling); isBound = false;}} klasse MyServiceConnection implementerer ServiceConnection {public void onServiceConnected (Komponentnavn klassenavn, IBinder-bindemiddel) {messengerToService = nytt Messenger (bindemiddel);} offentlig tomgang onServiceDisconnected (ComponentName n) {messengerToService = null;} // t inkluderer onCreate-metoden eller // onClick-metoden i dette eksemplet.}
Selvfølgelig overlever ingen app uten noen elementer i manifestfilen. For å registrere denne delenes tjeneste, trenger du et element av følgende type:
Broadcast-mottakere
Når du sender en kringkasting, slår du en hensikt ut i naturen. Broadcast-mottakere med kompatible intentfiltre våkner opp og gjør noe nyttig med kringkastingsinformasjonen. (Etter å ha gjort noe med kringkastingsinformasjonen, går mottakeren tilbake i søvn. I min neste inkarnasjon vil jeg være en kringkasting mottaker.)
For å lage din egen kringkasting mottaker, utvider du Android's BroadcastReceiver-klassen, og du erklærer en onReceive metode. For eksempel svarer følgende kode til matchende sendinger:
offentlig klasse MyReceiver utvider BroadcastReceiver {@Override public void onReceive (Kontekstkontekst, Intent Intent) {// Gjør viktige ting}}
En annen app oppretter en kringkasting med kode av følgende type:
Intent Intent = Ny Intent (); hensikt. setAction ("com. allmycode. ACTION"); sendBroadcast (hensikt);
Du kan registrere en kringkastingsmottaker i AndroidManifest.xml-fil:
For mer fleksibilitet kan du registrere en mottaker i Java-koden din. Den følgende Java-koden gjør i hovedsak hva elementet i en AndroidManifest. xml-fil gjør:
IntentFilter filter = ny IntentFilter (); filter. addAction ("com. allmycode. ACTION"); registerReceiver (ny MyReceiver (), filter);
Innholdsleverandører
En apps innholdsleverandør gjør data tilgjengelig for andre apper som kjører på samme enhet. Leverandørens grensesnitt ligner databasens grensesnitt, med tabeller, rader, markører og alle de gode greiene. For eksempel ser koden for å spørre en innholdsleverandør slik ut:
offentlig markørspesifikasjon (Uri uri, String [] kolonner, String whereClause, String [] whereArgs, String sortOrder) {Markørmarkør = null; int kode = uriMatcher. kamp (URI); hvis (kode == 1) {cursor = db. spørring (SIMPLETABLE, kolonner, whereClause, whereArgs, null, null, sortOrder); ellers hvis (kode == 2) {String [] columnNames = {"_id", "navn", "beløp"}; String [] rowValues = {"Table", "4", "2"}; MatrixCursor matrixCursor = ny MatrixCursor (columnNames); matrixCursor. addRow (rowValues); cursor = matrixCursor;} returmarkør;}
Fragments
A fragment er som en visning - en synlig ting som du kan vise i en aktivitet. Men i motsetning til en visning har et fragment egne livssyklusmetoder. Så Android kan lage en liten stabel fragmenter inne i en aktivitet. Når brukeren trykker på Back-knappen, åpner Android et fragment av stakken. (Hvis det ikke er noen fragmenter som skal pop, åpner Android hele aktiviteten utenfor oppgavestakken.)
Du kan sette et fragment i følgende rammeoppsett:
For å sette et fragment inn i oppsettet, utfører du en fragmentertransaksjon. Slik ser en fragmentertransaksjon ut:
DocsFragment docsFragment = DocsFragment. newInstance (index); FragmentManager fragmentManager = getFragmentManager (); FragmentTransaction fragmentTransaction = fragmentManager. beginTransaction (); fragmentTransaction. erstatt (R. id. docs, docsFragment); fragmentTransaction. addToBackStack (null); fragmentTransaction. begå();
Intent and Intent Filters
Når en hensikt oppfyller riktig hensikt filter, er resultatet en kamp laget i himmelen. Men reglene for matchende hensikter med filtre er kompliserte. Reglene leser som de lovbestemte klausulene i en fortjenesteavtale.
Du kan bruke Java-metoder for å beskrive en hensikt. Her er noen ofte brukte metoder:
-
setAction: Angir intensjonens handling. (En hensikt kan bare ha én handling.)
-
addCategory: Legger til en kategori til hensikten. (En hensikt kan ha mange kategorier.)
-
setData: Angir intentens URI, og fjerner hensiktens MIME-type (hvis hensikten har en MIME-type).
-
setType: Angir intensjonens MIME-type og fjerner hensiktens URI (hvis hensikten har en URI).
-
setDataAndType: Angir både hensiktens URI og hensiktens MIME-type. Ifølge dokumentene, "Denne metoden bør meget sjelden brukes. "
Du kan også bruke XML-koden for å beskrive en hensikt.
I URI // www.allmycode. com: 80 / android, ordningen er http, verten er www. allmycode. com, porten er 80, og banen er android. Myndigheten (som ikke er en av attributter i et element, men er nyttig å vite om) er www. allmycode. com: 80.
Du angir vanligvis en intensjonsfilters verdier i AndroidManifest. xml-fil. Men i Java-kode, android. innhold. IntentFilter-klassen har mange nyttige metoder. Her er noen av dem:
-
addAction: Legger til en handling til filteret.
-
addCategory: Legger til en kategori i filteret.
-
addDataScheme: Legger til en skjema til filteret.
-
addDataAuthority: Legger til en autoritet til filteret.
-
addDataPath: Legger til en bane til filteret.
-
addDataType: Legger til en MIME-type i filteret.
Et intensjonsfilter kan ha mange handlinger, mange kategorier og så videre.
Her er en kort liste over krav til en kamp mellom en hensikt og et hensiktsfilter. Denne listen er ikke fullført, så hvis du vil ha en komplett liste, kjøper du bedre Android Application Development All-in-One for Dummies av Barry Burd.
-
Hvis en hensikt har en handling, må et hensiktfilter ha en identisk handling for å matche hensikten. Intentfilteret kan ha flere handlinger. En hvilken som helst av disse tilleggsaksjonene har ingen effekt på kampen.
-
Hvis en hensikt har kategorier, må en hensikt filter ha disse (og muligens flere) kategorier for å matche hensikten.
-
Hvis en hensikt har en MIME-type, må et hensiktfilter ha en tilsvarende MIME-type for å matche hensikten. Intentfilteret kan ha flere MIME-typer. En hvilken som helst av disse ekstra MIME-typer har ingen effekt på kampen.
-
Hvis et hensiktsfilter har MIME-typer, må en hensikt å ha en MIME-type for å matche hensiktsfiltret, og hensikten er MIME-typen må samsvare med et av filterets MIME-typer.
-
I en begrenset grad kan matchingen av MIME-typer innebære jokertegn og vanlige uttrykk.
-
Hvis en hensikt har en URI-ordning, må et hensiktsfilter ha en matchende URI-ordning for å matche hensikten.
-
Hvis et hensiktsfilter har URI-ordninger, må du ha en URI-ordning for å matche intentfilteret, og intentens URI-skjema må samsvare med et av filterets URI-ordninger.
For å fullføre denne listen kopierer du de to siste reglene, endrer et ord eller to i hver av kopiene:
-
Hvis en hensikt har en URI vert , for å matche Intent, et intentfilter må ha en matchende URI vert .
-
Hvis et intentfilter har URI verter , for å matche intentfilteret, må en hensikt ha en URI vert og intentens URI vert < må samsvare med et av filterets URI vert s . Hvis en hensikt har en URI
-
port , for å matche hensikten, må et hensiktsfilter ha en tilsvarende URI port . Hvis et hensiktsfilter har URI
-
porter , for å matche intentfilteret, må en hensikt ha en URI port og hensiktens URI port < må samsvare med et av filterets URI por t s . Hvis en hensikt har en URI bane
-
, for å matche hensikten, må et hensiktsfilter ha en matchende URI bane . Hvis et intentfilter har URI baner
-
, for å matche intentfilteret, må en hensikt ha en URI bane og hensiktens URI bane