Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)



Tentamen i

Mobiltelefonapplikationer med J2ME

(fristående kurs)

lördag 7 januari 2007 kl 14:00 - 19:00 i L001





Hjälpmedel: Vilket tryckt eller skrivet material som helst, bara det är på papper: böcker, utskrifter, egna anteckningar. Inga datorer. Som alternativ till ordbok, om man behöver en sån, kan man dock använda en så kallad "C-pen", som är ett elektroniskt lexikon i form av en penna.
Poängkrav: Maximal poäng är 40.
För betyget G krävs 20 poäng.
För betyget VG krävs 30 poäng.
Resultat och lösningar: Meddelas på kursens hemsida senast lördag 28 januari 2006.
Visning och frågestund: Onsdag 1 februari 2006 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-7347013.



LYCKA TILL!

Uppgift 1 (20 p)

Här är en MIDlet som visar hur man kan använda gränssnittskomponenterna i MIDP. Den låter användaren bläddra mellan några olika skärmar.

När man startar MIDleten får man upp en lista med alternativ:

En ganska meningslös MIDlet

Här ska det, som synes på bilden, finnas ett Avsluta-kommando (som förstås avslutar MIDleten) och ett Välj-kommando, som utför det alternativ man valt i listan. Det ska bara gå att markera ett alternativ åt gången.

Om man väljer alternativet Fortsätt visa den här listan, ska MIDleten fortsätta att visa listan. Användaren ser alltså ingen skillnad.

Om man väljer alternativet Visa textrutan, ska MIDleten visa en textruta som innehåller en informationstext om hur många kommandon som getts, totalt sedan MIDleten startades:

En ganska meningslös MIDlet     En ganska meningslös MIDlet

I textrutan ska det, som synes på bilden, finnas ett Avsluta-kommando på samma sätt som på den första skärmen med listan, och ett Tillbaka-kommando, som tar oss tillbaka till listan med alternativ.

Om vi nu använder Tillbaka-kommandot och går tillbaka till listan med alternativ, och sen i stället väljer Visa formuläret, ska man komma till ett formulär som är en sorts kombination av listan och textrutan. På formuläret ska det nämligen finnas dels ett textfält som visar antalet kommandon, och dels ska det finnas en ny lista med alternativ:

En ganska meningslös MIDlet     En ganska meningslös MIDlet

I formuläret ska det, som synes på bilden, finnas ett Avsluta-kommando, och ett Välj-kommando som utför det alternativ man valt i listan, på samma sätt som i den första listan. Det ska bara gå att markera ett alternativ åt gången i listan.

Textfältet med antalet kommandon ska uppdateras om man väljer alternativet Fortsätt visa det här formuläret:

En ganska meningslös MIDlet     En ganska meningslös MIDlet

Det finns ett Avsluta-kommando på varje skärm, men man ska också kunna avsluta programmet genom att välja Avsluta-alternativet som finns i de båda listorna:

En ganska meningslös MIDlet

Uppgiften är förstås att skriva denna MIDlet. Skriv alltså hela Java-filen med klassdefinitionen.

Uppgift 2 (2 p)

En applikation kan distribueras i form av en JAR-fil, till exempel kallad TurboProp.jar. Den innehåller alla de kompilerade klasserna. Men det kan också finnas en JAD-fil, som till exempel kan heta TurboProp.jad. Beskriv kort vad JAD-filen är för något, och berätta vad det finns för anledning att ha en sådan.

Uppgift 3 (4 p)

a) Vad innebär obfuskering (på engelska obfuscation) i J2ME-sammanhang?

b) Ska obfuskeringen göras före eller efter kompileringen? Motivera svaret!

c) Ska obfuskeringen göras före eller efter för-verifieringen (engelska: pre-verificiation)? Motivera svaret!

d) Ska obfuskeringen göras före eller efter det att MIDlet:en skickas till telefonen? Motivera svaret!

Uppgift 4 (2 p)

När man ska slå upp dokumentationen för en klass, till exempel String, TextBox eller RecordStore, måste man veta om klassen ingår i MIDP eller CLDC. MIDP och CLDC har nämligen dokumentationen samlade på olika ställen.

Även om man inte kommer ihåg om klassen finns i MIDP eller CLDC, kan man ofta gissa.

Hur?

Uppgift 5 (2 p)

Det vanliga sättet att ge "kommandon" i vanliga skrivbords-Java (dvs J2SE, Java 2 Standard Edition) är genom att klicka med musen på en knapp. Java-programmet placerar ut knappar av klassen JButton på skärmen, och när användaren klickar på en knapp anropas en metod som heter actionPerformed. Varför gör man inte likadant i MIDP?

 

Uppgift 6 (10 p)

MIDleten i uppgift 1 håller reda på antalet kommandon som användaren gett, men variabeln som räknar antalet är (om du inte gjort något konstigt) en medlemsvariabel i klassen. Den variabeln, och dess värde, försvinner när MIDleten avslutas. Därför börjar räknaren om på noll varje gång MIDleten startas.

Vi vill hålla reda på antalet kommandon även mellan körningar av MIDleten. Varje gång MIDleten avslutas sparar vi därför undan antalet kommandon i ett postlager (på engelska record store), och varje gång MIDleten startas hämtar vi antalet ur postlagret.

a) (5p)

Skriv metoden spara_antal_kommandon. Den ska lämpa sig för att anropas från destroyApp, och den ska spara antalet kommandon i postlagret.

Om postlagret inte fanns, ska det först skapas. Om det uppstår något fel ska vi bara strunta i att spara antalet kommandon, utan något felmeddelande eller liknande.

b) (5p)

Skriv metoden hämta_antal_kommandon. Den ska lämpa sig för att anropas från MIDletens konstruktor, och den ska hämta antalet kommandon från postlagret.

Om det uppstår något fel, till exempel beroende på att det är första gången vi kör MIDleten och postlagret ännu inte har skapats, börjar vi bara räkna antalet kommandon från noll, utan något felmeddelande eller liknande.

Ett tips för båda metoderna är att lagra antalet som en sträng i postlagret. (Den strängen måste dock konverteras till en byte-array innan den kan sparas i postlagret.) Om vi antar att MIDleten lagrar antalet kommandon i en heltalsvariabel som heter antal_kommandon, och vi vill konvertera den till en sträng, kan man helt enkelt göra så här:

strängen = "" + antal_kommandon;

För att konvertera tillbaka från en sträng till ett heltal kan man göra så här:

antal_kommandon = Integer.parseInt(strängen);