Android Application Development All-in-One Cheat Sheet

September 8  by Eliza

"Min app trenger en radiomottaker. Kan noen minne meg på hvordan jeg kan kode en radiomottaker? Og mens du er i gang, hvordan en aktivitet returnere et resultat? Oh, pokker. Hvor kan jeg finne alle at ting raskt?"

Å ha eksempler på hva slags kode som brukes i Android programutvikling klar-til-hånd kan være en stor hjelp. Du finner nok av eksempler her.

Aktiviteter

Her er en aktivitet som starter en annen aktivitet:

public class CheatSheetActivity strekker Aktivitet
implementerer OnClickListener {
Button Button1;
statiske endelige String MY_ACTION = "com.allmycode.action";
statiske endelige String MY_URI
= "My_scheme: my_scheme_specific_part";

Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.main);
Button1 = (Button) findViewById (R.id.button1);
button1.setOnClickListener (denne);
}

public void onClick (Vis arg0) {
Intent hensikt = new Intent ();
intent.setAction (MY_ACTION);
intent.setData (Uri.parse (MY_URI));
startActivity (hensikt);
}
}

Og ikke glem - når du oppretter en ny aktivitet klasse, må du legge til en tilsvarende <aktivitet> element til AndroidManifest.xml fil. Den OtherActivity element hensikt filteret ser omtrent slik ut:

<Intent-filter>
<Handling android: name = "com.allmycode.action" />
<Kategori
android: name = "android.intent.category.DEFAULT" />
<Data android: ordningen = "my_scheme" />
</ Intent-filter>

For å få et resultat fra en aktivitet, legge til følgende kode (eller noe som likner det) til programmet ditt:

final int CODE_NUMBER = 42;
endelig String classname = "CheatSheetActivity";

public void onClick (Vis arg0) {
Intent hensikt = new Intent ();
intent.setAction (MY_ACTION);
intent.setData (Uri.parse (MY_URI));

startActivityForResult (hensikt, CODE_NUMBER);
}

beskyttet ugyldig onActivityResult
(Int codeNumber, int resultCode, Intent hensikt) {
if (resultCode == RESULT_OK) {
if (codeNumber == CODE_NUMBER) {
Log.i (classname,
. intent.getData () getSchemeSpecificPart ());
}
}
}

Og i den aktiviteten som skaper resultatet, legge til kode av følgende slag:

Intent hensikt = new Intent ();
intent.setData (Uri.parse ("resultat: hallo"));
setResult (RESULT_OK, forsett);
finish ();

Tjenester

En tjeneste gjør vanligvis sitt arbeid uten å bry seg (eller til og med varsle) brukeren. For eksempel kan en aksjekurs tjeneste nå ut til nettet og få de siste prisene på brukerens favoritt plukker. En annen app aktivitet kan få data fra tjenesten og vise data på enhetens skjerm.

Følgende kode er en komplett (men ikke veldig nøyaktig) værtjeneste:

public class MyWeatherService strekker service {

Messenger messengerToClient = null;

MyIncomingHandler myIncomingHandler =
ny MyIncomingHandler ();
Messenger messengerToService =
ny Messenger (myIncomingHandler);

Override
offentlig IBinder onBind (Intent hensikt) {
returnere messengerToService.getBinder ();
}

klasse MyIncomingHandler strekker Handler {
Override
public void handleMessage (Message incomingMessage) {
messengerToClient = incomingMessage.replyTo;

Bundle svar = ny Bundle ();
reply.putString ("vær", "Det er mørkt om natten.");
Melding replyMessage = Message.obtain ();
replyMessage.setData (svar);
try {
messengerToClient.send (replyMessage);
} Catch (RemoteException e) {
e.printStackTrace ();
}
}
}
}

I en annen pakke, legger du inn koden for å ringe værtjenesten. Her er noen eksempelkode:

public class ServiceConsumerActivity strekker Aktivitet
implementerer OnClickListener {

Messenger messengerToService = null;

MyIncomingHandler myIncomingHandler =
ny MyIncomingHandler ();
Messenger messengerFromService =
ny Messenger (myIncomingHandler);

ServiceConnection tilkobling =
ny MyServiceConnection ();
SharedPreferences prefs;
boolean isBound = false;

ugyldig bind () {
Intent hensikt = new Intent ();
intent.setAction ("com.allmycode.WEATHER");
isBound =
bindService (hensikt, tilkobling,
Context.BIND_AUTO_CREATE);
}

public void queryService () {
if (isBound) {
Bunt bunt = ny Bundle ();
bundle.putString ("location", "Philadelphia");

Melding message = Message.obtain ();
message.replyTo = messengerFromService;
message.setData (bundle);
try {
messengerToService.send (melding);
} Catch (RemoteException e) {
e.printStackTrace ();
}
} Else {
textView1.setText (R.string.service_not_bound);
}
}

klasse MyIncomingHandler strekker Handler {
Override
public void handleMessage (Message msg) {
Bunt bunt = msg.getData ();
textView1.setText (bundle.getString ("vær"));
}
}

ugyldig Frigi () {
if (isBound) {
unbindService (tilkobling);
isBound = false;
}
}

klasse MyServiceConnection implementerer ServiceConnection {
public void onServiceConnected (
ComponentName classname, IBinder bindemiddel) {
messengerToService = ny Messenger (bindemiddel);
}

public void onServiceDisconnected (ComponentName n) {
messengerToService = null;
}
}

// Jeg ikke inkluderer onCreate metoden eller
// OnClick metoden i dette eksempel.
}

Selvfølgelig, overlever ingen app uten noen elementer i manifestfilen. For å registrere denne delen tjeneste, trenger du et element av følgende slag:

<Tjeneste android: name = ". MyWeatherService">
<Intent-filter>
<Handling android: name = "com.allmycode.WEATHER" />
</ Intent-filter>
</ Tjeneste>

Kringkastingsmottakere

Når du gjør en kringkasting, slenge deg en intensjon ut i naturen. Kringkasting mottakere med kompatible hensikt filtre våkne opp og gjøre noe nyttig med kringkastingsinformasjonen. (Etter å ha gjort noe med sendingen info, går mottakeren tilbake til å sove. I min neste inkarnasjon, jeg ønsker å være en radiomottaker.)

For å opprette din egen kringkastingsmottaker, utvide du Android BroadcastReceiver klasse og du erklære en OnReceive metode. For eksempel, svarer følgende kode matchende sendinger:

public class MyReceiver strekker BroadcastReceiver {

Override
public void OnReceive (Context kontekst, Intent hensikt) {
// Gjør viktige ting
}
}

En annen app skaper en sending med kode av følgende form:

Intent hensikt = new Intent ();
intent.setAction ("com.allmycode.ACTION");
sendBroadcast (hensikt);

Du kan registrere en radiomottaker i din AndroidManifest.xml filen:

<Mottaker android: name = "MyReceiver.">
<Intent-filter>
<Handling android: name = "com.allmycode.ACTION" />
</ Intent-filter>
</ Mottaker>

For mer fleksibilitet, kan du registrere en mottaker i din Java-kode. Følgende Java-kode gjør egentlig hva den <mottaker> element i en AndroidManifest.xml fil gjør:

IntentFilter filter = ny IntentFilter ();
filter.addAction ("com.allmycode.ACTION");
registerReceiver (ny MyReceiver (), filter);

Innholdsleverandører

En app innholdsleverandøren gjør data tilgjengelig for andre programmer som kjører på den samme enheten. Leverandørens grensesnittet ligner en database grensesnitt, med tabeller, rader, pekere, og alt det gode ting. For eksempel, ser koden til å spørre en innholdsleverandør som dette:

offentlig Cursor spørring (Uri Uri, String [] kolonner,
String whereClause, String [] whereArgs,
String sortering) {
Markør markøren = null;
int kode = uriMatcher.match (URI);
if (kode == 1) {

markør =
db.query (SIMPLETABLE, søyler, whereClause,
whereArgs, null, null, sortering);

} Else if (kode == 2) {
String [] columnNames = {"_id", "navn", "mengde"};
String [] rowValues ​​= {"Table", "4", "2"};
MatrixCursor matrixCursor =
ny MatrixCursor (columnNames);
matrixCursor.addRow (rowValues);
markør = matrixCursor;
}
returnere markøren;
}

Fragmenter

Et fragment er som et syn - en synlig ting som du kan vise inne en aktivitet. Men i motsetning til en visning, har et fragment egne livssyklus metoder. Så Android kan lage en liten bunke med fragmenter inne en aktivitet. Når brukeren trykker på Tilbake-knappen, dukker Android et fragment av av stabelen. (Hvis det ikke er noen fragmenter til pop, dukker Android hele aktiviteten av oppgaven stabelen.)

Du kan sette et fragment inn følgende ramme layout:

<FrameLayout android: id = "@ + id / docs"
android: layout_height = "match_parent"
android: layout_width = "0px"
android: layout_weight = "1"
android: bakgrunn =
"Android:? Attr / detailsElementBackground" />

Å sette et fragment inn i oppsettet, utfører du et fragment transaksjon. Her er hva en fragment transaksjon ser slik ut:

DocsFragment docsFragment = DocsFragment.newInstance (indeks);
FragmentManager fragmentManager = getFragmentManager ();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction ();
fragmentTransaction.replace (R.id.docs, docsFragment);
fragmentTransaction.addToBackStack (null);
fragmentTransaction.commit ();

Hensikter og Intent Filters

Når en intensjon møter den rette hensikt filter, er resultatet en kamp laget i himmelen. Men reglene for matchende hensikter med filtre er komplisert. Reglene lese som de juridiske klausuler i en prenuptial avtalen.

Du kan bruke Java-metoder for å beskrive en intensjon. Her er noen ofte brukte metoder:

  • setAction: Stiller hensikt handling. (En intensjonsavtale kan bare ha én handling.)
  • addCategory: Legger til en kategori til intensjonen. (En intensjonsavtale kan ha mange kategorier.)
  • setData: Stiller hensikt URI, og fjerner hensikten er MIME-type (hvis hensikten har en MIME-type).
  • setType: Setter hensikten er MIME-type og fjerner den hensikt URI (hvis hensikten har en URI).
  • setDataAndType: Stiller både intensjonen URI og hensikten er MIME-type. Ifølge docs, "Denne metoden bør svært sjelden brukes."

Du kan også bruke XML-kode for å beskrive en intensjon.

<Handling android: name = "streng" />

<Kategori android: name = "streng" />

<Data android: ordningen = "streng"
android: host = "streng"
android: port = "streng"
android: path = "streng"
android: pathPattern = "streng"
android: pathPrefix = "streng"
android: mimetype = "streng" />

I URI http://www.allmycode.com:80/android, er ordningen http, verten er www.allmycode.com, havnen er 80, og banen er android. Myndighet (som ikke er en av egenskapene i en <data> element, men er nyttig å vite om) er www.allmycode.com:80.

Du vanligvis satt en intensjon filter verdier i AndroidManifest.xml filen. Men i Java-kode, har android.content.IntentFilter klassen masse nyttige metoder. Her er noen av dem:

  • addAction: Legger til en handling i filteret.
  • addCategory: Legger til en kategori til filteret.
  • addDataScheme: Legger til en ordning til filteret.
  • addDataAuthority: Legger en autoritet til filteret.
  • addDataPath: Legger en bane til filteret.
  • addDataType: Legger til en MIME-type som filteret.

En intensjon filter kan ha mange handlinger, mange kategorier, og så videre.

Her er en kort liste over krav til en kamp mellom en intensjon og en intensjon filter. Denne listen er ikke komplett så, hvis du vil ha en fullstendig liste, du bedre kjøpe Android Application Development All-in-One For Dummies av Barry Burd.

  • Hvis en intensjon har en handling, for å matche hensikt, må en intensjon filter har en identisk handling. Intensjonen filter kan ha flere handlinger. Noen av disse ekstra handlinger har ingen innvirkning på kampen.
  • Hvis en intensjon har kategorier, for å matche hensikt, må en intensjon filter har disse (og muligens mer) kategorier.
  • Hvis en intensjon har en MIME-type, for å matche hensikt, må en intensjon filter ha en matchende MIME-type. Intensjonen filter kan ha flere MIME-typer. Noen av disse ekstra MIME-typer har ingen innvirkning på kampen.
  • Hvis en intensjon filter har MIME-typer, for å matche den hensikt filter, må en intensjon har en MIME-type og hensikten er MIME-type må matche en av filtrerings MIME-typer.
  • I begrenset grad kan målrettingen av MIME-typer involvere jokertegn og regulære uttrykk.
  • Hvis en intensjon har en URI ordning, for å matche hensikt, må en intensjon filter ha en matchende URI ordningen.
  • Hvis en intensjon filter har URI ordninger, for å matche den hensikt filter, må en intensjon ha en URI ordningen og hensikten URI ordningen må matche en av filtrerings URI ordninger.

For å fullføre denne listen, kopiere de to siste regler, endre et ord eller to i hver av kopiene:

  • Hvis en intensjon har en URI vert, for å matche hensikt, må en intensjon filter ha en matchende URI vert.
  • Hvis en intensjon filter har URI verter, for å matche den hensikt filter, må en intensjon ha en URI vert og hensikten URI vert må matche en av filterets URI verts s.
  • Hvis en intensjon har en URI port, for å matche hensikt, må en intensjon filter ha en matchende URI port.
  • Hvis en intensjon filter har URI porter, for å matche den hensikt filter, må en intensjon ha en URI port og hensikten URI sporten må være en av filterets URI por t s.
  • Hvis en intensjon har en URI bane, for å matche hensikt, må en intensjon filter ha en matchende URI bane.
  • Hvis en intensjon filter har URI stier, for å matche den hensikt filter, må en intensjon ha en URI bane og hensikten URI Banen må matche en av filtrerings URI baner.